oom_score
OOM (メモリ不足) は、実際にはカーネルの保護メカニズムです。プロセスのメモリ使用量を監視し、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
total used free shared buff/cache available
Mem: 3514764 940248 219344 73716 2355172 2219028
Swap: 0 0 0
free の出力はテーブルであり、その中の値はデフォルトですべてバイト単位です。このテーブルは合計 2 行 6 列で構成されており、この 2 行は物理メモリ Mem とスワップ パーティション Swap の使用量を表しており、6 列の各列の意味は次のとおりです。
-
最初の列の total は合計メモリ サイズです。
-
2 番目の列は used で、共有メモリを含む使用済みメモリのサイズです。
-
3 列目の free は、未使用のメモリのサイズです。
-
4 番目の列のsharedは、共有メモリのサイズです。
-
5 番目の列 buff/cache は、キャッシュとバッファのサイズです。
-
最後の列は、新しいプロセスで使用できるメモリの量です。
ここでは、最後の列にある使用可能なメモリに特に注意してください。利用可能には、未使用のメモリだけでなく、再利用可能なキャッシュも含まれるため、一般に未使用のメモリよりも大きくなります。ただし、一部のキャッシュは使用されている可能性があるため、すべてのキャッシュをリサイクルできるわけではありません。
上
上部ではプロセスのメモリ使用量を確認できます
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 直接相加得出结果。
Buffer & Cache
Buffer 是对磁盘数据的缓存
Cache 是文件数据的缓存
它们既会用在读请求中,也会用在写请求中。
磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。
在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也就是文中所讲的 Cache 和 Buffer 区别。