知っている:
- ディスクを使用したページングとスワッピング
- /proc/io はディスク I/O 情報を提供します。
しかし、わかりません。/proc/<pid>/ioRAMで実行する必要がありますが、ページングとスワッピングによってディスクに移動されるI / Oが含まれています。数字を書く/proc/<pid>/ioページングとスワップI / Oを含めますか?
答え1
私も同じ問題があったので、スワップの使用とI / O計算についていくつかの実験を行うことにしました。
私は大量のメモリを要求し、データで埋める簡単なプログラムを書いています。
#include <malloc.h>
#include <string.h>
#include <stdio.h>
int main() {
for (int i = 0; i < 5000; i++) {
void* ptr = malloc(1000000);
memset(ptr, 42, 1000000);
}
// Hang for a while to allow us analyze /proc.
puts("Finished");
while(1);
return 0;
}
その後、実行を開始して、実行ごとに要求されたメモリ量(5G、10G、12Gなど)を増やし/proc/$PID/io
ます/proc/$PID/status
。次のパラメータは実行ごとに変わりません/proc/$PID/io
(これらのパラメータはシステムコールレベルIO統計):
rchar: 1948
wchar: 9
syscr: 7
syscw: 1
次の2つのパラメータ(ベース:カーネル procfs ドキュメント)は、プロセスによって引き起こされる物理ディスクI / Oが0に設定されていることを示します(通常、プログラムイメージは以前の実行ですでにメモリにキャッシュされているため、物理execve
ディスクI / Oは発生しません)。
read_bytes: 0
write_bytes: 0
RAMサイズ(16G)に近づくと、カーネルはプログラムメモリ(〜4G)を大幅に交換し始めます。
$ cat /proc/$PID/status | grep VmSwap
VmSwap: 3908152 kB
同時に、いくつかの奇妙な値が表示されます/proc/$PID/io
。
read_bytes: 307200
write_bytes: 0
カーネルがスワップを開始するとゼロ以外の値が表示され、ほぼ一定にread_bytes
(〜300k)維持されますが、プロセスで使用されるスワップの量は後続の実行ごとに増加します(OOMKillerがトリガされ始めるまで)。
私はこの実験を何度も繰り返しましたが、絵は同じままです。write_bytes
常に0で、read_bytes
0から300〜400k程度の小さい(スワップされたメモリ量と比較して)値に移動しました。
これをもとに/proc/$PID/io
考慮してはいけないようだ。実際の交換の読み書きしかし、これはいくつか説明します。スワップ使用による内部カーネル活動。