目录
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_adj
或 oom_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