1. OOM Killer简介

Linux中的OOM Killer(Out of Memory Killer)是内核的一个机制,当系统检测到内存不足以满足当前需要时,它会自动终止一些进程以释放内存,保护系统免于崩溃。通常,OOM Killer自动运行,无需手动干预,但了解和调整其行为可以帮助你更好地管理系统资源。

当系统内存非常紧张时,OOM Killer将被触发。它会根据一系列标准给每个进程评分(oom_score),基于其内存使用、运行时间、用户权限等。通常情况下,分数最高的进程将被选择终止

2. /proc目录

Linux的 /proc 目录是一个虚拟文件系统,它不占用硬盘空间,而是直接存在于内存中。这个目录包含了系统运行时的信息,主要用于提供内核、进程、硬件状态等系统信息。

对于系统上的每一个正在活跃的进程,/proc 都有一个以进程ID命名的目录,即 /proc/[pid],在这个目录里,有关于该进程的详细信息,例如:

  • /proc/[pid]/cmdline:进程启动命令
  • /proc/[pid]/environ:进程的环境变量
  • /proc/[pid]/status:进程的状态信息
  • /proc/[pid]/oom_score:进程的OOM评分
  • /proc/[pid]/oom_score_adj:调整OOM评分的值

3. oom_score、oom_score_adj、oom_adj

oom_score 文件存储一个值,表示系统当前分配给该进程的OOM得分。这个得分是由内核根据进程的内存使用量、运行时间、以及 oom_adjoom_score_adj 的设置计算出来的(消耗内存越多分越高,存活时间越长分越低)。得分越高,表示进程越有可能在内存不足时被杀死。注意,这个文件是只读的,用户或管理员不能直接修改这个得分,它是系统根据当前情况动态计算的。

oom_score_adj 文件存储一个值,范围从 -1000 到 +1000。-1000 表示进程永远不会被OOM Killer杀死,+1000 表示进程将是首先被杀死的候选。这允许管理员更精确地控制哪些进程在内存紧张时应该被保留,哪些可以被杀掉。

oom_adj 的作用和 oom_score_adj 一样,只不过它的存在是为了向后兼容性。该文件存储一个值,范围从 -17 到 +15。-17 表示进程永远不会被OOM Killer杀死,+15 表示进程将是首先被杀死的候选。

为了防止某个进程被OOM Killer杀死,我们可以在root身份下执行如下命令:

echo -1000 > /proc/[pid]/oom_score_adj

或者:

echo -17 > /proc/[pid]/oom_adj

注意,修改 oom_adj 时,系统会自动转换 oom_adj 的值到对应的 oom_score_adj 值。oom_adj 范围从 -17 到 +15,这个范围会映射到 oom_score_adj 的 -1000 到 +1000。

4. 查看Linux系统的内存和磁盘占用情况

4.1 查看内存

使用 free -h 命令可以查看系统的内存占用情况:

              total        used        free      shared  buff/cache   available
Mem:          440Gi        32Gi        74Gi        27Mi       333Gi       404Gi
Swap:            0B          0B          0B

内存(Mem)部分:

  • total:总的物理内存量。
  • used:已经被使用的内存量。这包括为应用程序、缓冲区、缓存等分配的内存。
  • free:当前未被使用的内存量。这部分内存当前没有被任何进程使用。
  • shared:被多个进程共享的内存总量。这通常用于线程之间的通信或某些类型的共享内存IPC(进程间通信)。通常这是很小的数值。
  • buff/cache:用作缓冲和缓存的内存总量。Linux系统会使用所有可用的内存作为文件系统的缓存,以提高性能。这部分内存可以在需要时释放给应用程序,所以它既不是完全空闲的,也不是永久占用的。
  • available:表示预估的可用于启动新应用程序的内存量,而不至于使系统进入交换(swap)状态。它是目前未被使用的内存加上当前可以回收的缓存和缓冲区内存。这个数字比简单的 free 更有用,因为它考虑了缓存和缓冲区可以被释放和重新用于新应用程序的事实。

交换区(Swap)部分:

  • 交换区是硬盘上的一块空间,当物理内存不足时,系统会使用交换区。这里显示的是交换区的总量、已使用量和空闲量,都是 0B,表明系统没有配置交换空间或者交换空间未被使用。

4.2 查看磁盘

使用 df -h 命令可以查看系统的磁盘占用情况:

Filesystem       Size  Used Avail Use% Mounted on
overlay           30G   77M   30G   1% /
tmpfs             64M     0   64M   0% /dev
tmpfs            221G     0  221G   0% /sys/fs/cgroup
shm              2.0G     0  2.0G   0% /dev/shm
/dev/sdb         150M  4.0K  150M   1% /init
AutoFS:fswestb1   20T  1.3T   19T   7% /root/autodl-pub
tmpfs            221G   12K  221G   1% /proc/driver/nvidia
tmpfs            221G     0  221G   0% /etc/nvidia/nvidia-application-profiles-rc.d
/dev/sda2        439G   20G  397G   5% /usr/bin/nvidia-smi
udev             221G     0  221G   0% /dev/nvidiactl
tmpfs            221G     0  221G   0% /proc/asound
tmpfs            221G     0  221G   0% /proc/acpi
tmpfs            221G     0  221G   0% /proc/scsi
tmpfs            221G     0  221G   0% /sys/firmware

Ref

[1] https://www.cnblogs.com/MrLiuZF/p/15229868.html
[2] https://www.cnblogs.com/xibuhaohao/p/11087922.html

12-24 12:45