oom_score
OOM(Out of Memory)其实是内核的一种保护机制。它监控进程的内存使用情况,并且使用 oom_score 为每个进程的内存使用情况进行评分:
-
一个进程消耗的内存越大,oom_score 就越大;
-
一个进程运行占用的 CPU 越多,oom_score 就越小。
进程的 oom_score 越大,代表消耗的内存越多,也就越容易被 OOM 杀死,从而可以更好保护系统。
管理员可以通过 /proc 文件系统,手动设置进程的 oom_adj ,从而调整进程的 oom_score。
oom_adj 的范围是 [-17, 15],数值越大,表示进程越容易被 OOM 杀死;数值越小,表示进程越不容易被 OOM 杀死,其中 -17 表示禁止 OOM。
比如用下面的命令,你就可以把 sshd 进程的 oom_adj 调小为 -16,这样, sshd 进程就不容易被 OOM 杀死。
echo -16 > /proc/$(pidof sshd)/oom_adj
free
free可以看系统整体内存使用情况
free
total used free shared buff/cache available
Mem: 3514764 940248 219344 73716 2355172 2219028
Swap: 0 0 0
free 输出的是一个表格,其中的数值都默认以字节为单位。表格总共有两行六列,这两行分别是物理内存 Mem 和交换分区 Swap 的使用情况,而六列中,每列数据的含义分别为:
-
第一列,total 是总内存大小;
-
第二列,used 是已使用内存的大小,包含了共享内存;
-
第三列,free 是未使用内存的大小;
-
第四列,shared 是共享内存的大小;
-
第五列,buff/cache 是缓存和缓冲区的大小;
-
最后一列,available 是新进程可用内存的大小。
这里尤其注意一下,最后一列的可用内存 available 。available 不仅包含未使用内存,还包括了可回收的缓存,所以一般会比未使用内存更大。不过,并不是所有缓存都可以回收,因为有些缓存可能正在使用中。
top
top 可以看进程内存使用情况
top
top - 09:12:28 up 367 days, 14:10, 0 users, load average: 0.04, 0.02, 0.00
Tasks: 132 total, 1 running, 87 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 3514764 total, 368416 free, 943196 used, 2203152 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2215896 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1962 ubuntu 20 0 956624 74288 36344 S 0.3 2.1 0:04.76 node
2063 ubuntu 20 0 976732 87552 38292 S 0.3 2.5 0:05.73 node
11399 root 20 0 1115012 150912 19764 S 0.3 4.3 560:46.93 YDService
30256 root 20 0 64552 11232 3632 S 0.3 0.3 44:22.12 barad_agent
1 root 20 0 225544 7596 4920 S 0.0 0.2 19:44.42 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:14.03 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
7 root 20 0 0 0 0 S 0.0 0.0 3:12.92 ksoftirqd/0
8 root 20 0 0 0 0 I 0.0 0.0 35:31.52 rcu_sched
9 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh
10 root rt 0 0 0 0 S 0.0 0.0 1:06.76 migration/0
11 root rt 0 0 0 0 S 0.0 0.0 0:37.36 watchdog/0
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
-
VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。
-
RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。
-
SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。
-
%MEM 是进程使用物理内存占系统总内存的百分比。
top 输出时,要注意两点。
第一,虚拟内存通常并不会全部分配物理内存。从上面的输出,你可以发现每个进程的虚拟内存都比常驻内存大得多。
第二,共享内存 SHR 并不一定是共享的,比方说,程序的代码段、非共享的动态链接库,也都算在 SHR 里。当然,SHR 也包括了进程间真正共享的内存。所以在计算多个进程的内存使用时,不要把所有进程的 SHR 直接相加得出结果。
标签:20,oom,0.0,排查,内存,Linux,进程,root From: https://www.cnblogs.com/lurenjiashuo/p/linux-memory.html