Which signal does the oom killer send to kill the process?

本文详细解析了Linux系统中OOM Killer在内存不足情况下杀死进程所使用的信号类型。在Red Hat Enterprise Linux系列中,如RHEL5、RHEL6、RHEL7,OOM Killer一直使用SIGKILL信号来终止进程。

 

Which signal does the oom killer send to kill the process?

 SOLUTION 已验证 - 已更新 2015年十二月22日22:06 - 

English 

环境

  • Red Hat Enterprise Linux 5
  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 7

问题

  • Which signal does the oom killer send to kill the process?
  • Which signal (SIGTERMSIGKILL, other?) does the oom killer use to kill processes?

决议

Although the oom killer source code mm/oom_kill.c has many changes and will continue to have in future for optimise, Improvisation purposes. But the signal which is sent to the process in an event of a oom is still the SIGKILL signal. Please find the source code snippet from RHEL 6.6.

Raw

static int oom_kill_task(struct task_struct *p)
{
        struct task_struct *q;
        struct mm_struct *mm;

        p = find_lock_task_mm(p);
        if (!p)
                return 1;

        if (sysctl_would_have_oomkilled == 1) {
                printk(KERN_ERR "Would have killed process %d (%s). But continuing instead.\n",
                                task_pid_nr(p), p->comm);
                task_unlock(p);
                return 0;
        }

        /* mm cannot be safely dereferenced after task_unlock(p) */
        mm = p->mm;

        pr_err("Killed process %d, UID %d, (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB\n",
                task_pid_nr(p), task_uid(p), p->comm, K(p->mm->total_vm),
                K(get_mm_counter(p->mm, anon_rss)),
                K(get_mm_counter(p->mm, file_rss)));
        task_unlock(p);

        /*
         * Kill all processes sharing p->mm in other thread groups, if any.
         * They don't get access to memory reserves or a higher scheduler
         * priority, though, to avoid depletion of all memory or task
         * starvation.  This prevents mm->mmap_sem livelock when an oom killed
         * task cannot exit because it requires the semaphore and its contended
         * by another thread trying to allocate memory itself.  That thread will
         * now get access to memory reserves since it has a pending fatal
         * signal.
         */
        for_each_process(q)
                if (q->mm == mm && !same_thread_group(q, p)) {
                        task_lock(q);   /* Protect ->comm from prctl() */
                        pr_err("Kill process %d (%s) sharing same memory\n",
                                task_pid_nr(q), q->comm);
                        task_unlock(q);
                        force_sig(SIGKILL, q);
                }

        set_tsk_thread_flag(p, TIF_MEMDIE);
        force_sig(SIGKILL, p);

        return 0;
}
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的精确预测。文中详细阐述了模型构建流程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他精密控制系统。该方法有效提升了纳米级定位系统的控制精度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事精密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高精度控制系统提供可复现的Koopman-RNN融合解决方案; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注Koopman观测矩阵构造、RNN训练流程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。
Docker容器的内存限制与OOM Killer之间存在紧密的相互作用,这种关系直接影响容器在系统内存不足时的行为。通过Docker设置的内存限制,实际上是在Linux内核的cgroups机制中配置了相应的参数,从而控制容器进程可以使用的最大内存量。当容器尝试使用的内存超过该限制时,如果启用了OOM Killer(默认行为),系统将触发OOM机制,尝试终止该容器进程以释放内存资源[^3]。 具体而言,Docker提供了两个关键参数用于控制内存限制与OOM Killer的行为: - **`--memory`**:设置容器可以使用的最大内存量。例如,若设置为`--memory 512m`,则容器进程不能使用超过512MB的内存。 - **`--oom-kill-disable`**:控制是否禁用OOM Killer。如果启用(即设置为`true`),则容器进程在内存不足时不会被强制终止,而是会被阻塞,直到系统释放出足够的内存;否则,容器进程将被OOM Killer终止[^1]。 以下是一个示例,展示如何在Docker中限制容器内存并禁用OOM Killer: ```bash docker run -it --memory 100M --oom-kill-disable ubuntu:16.04 /bin/bash ``` 在上述命令中,容器的最大内存使用被限制为100MB,并且即使系统内存紧张,也不会触发OOM Killer来终止该容器进程。需要注意的是,这种做法通常不推荐,因为它可能导致系统整体性能下降,甚至陷入死锁状态,尤其是在资源受限的环境中,如OpenWrt路由器系统[^1]。 OOM Killer的选择机制基于每个进程的OOM分数(OOM Score),该分数由内核动态计算,并受`oom_score_adj`参数的影响。用户可以通过调整该参数来影响OOM Killer的行为,从而控制哪些进程更可能或更不可能被终止。在Docker容器中,这一参数也可以通过容器运行时配置进行调整,以实现更精细的资源管理策略[^3]。 在实际部署中,合理设置内存限制并结合OOM Killer的行为,可以有效防止某个容器因内存泄漏或异常行为导致整个主机系统崩溃。然而,这也要求运维人员对系统内存使用有清晰的了解,并根据实际需求进行配置,以平衡系统稳定性与资源利用率。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值