sarとproc
どうも、smorisakiです。
私は普段、ミラクル・リナックスにてプロダクトサポートをしているのですが、
この間お客様からの問合せで次の様な質問を受けました。
「sarで表示されるメモリの値は/procのmeminfoの値と同じか?」
因みにsarとはシステムのCPUやメモリ、ディスクI/O等の負荷データを表示するツールです。
sarは/procの中を見ているというのは良く聞く話だと思われます。
お客様への回答は「その通りです」なのですが、本当にそうなのかソースコードを確認してみることにしました。
結果は以下です。
OS:MIRACLE LINUX 2.1
sysstat(sarはsysstatパッケージに含まれています)のバージョン:4.0.7
(1)/proc/meminfoの値を取得している部分
対象ファイル:sadc.c
関数名:read_proc_meminfo()
/* Open meminfo file */
if ((memfp = fopen(MEMINFO, "r")) == NULL) { ←/proc/meminfoを開く
file_stats.tlmkb = 0;
file_stats.frmkb = 0;
file_stats.shmkb = 0;
file_stats.bufkb = 0;
file_stats.camkb = 0;
file_stats.tlskb = 0;
file_stats.frskb = 0;
file_stats.nr_active_pages = 0;
file_stats.nr_inactive_dirty_pages = 0;
file_stats.nr_inactive_clean_pages = 0;
file_stats.inactive_target = 0;
return;
}
while (fgets(line, 64, memfp) != NULL) { ←ここより下でmeminfoの中身をfile_stats構造体に保存
if (!strncmp(line, "MemTotal:", 9))
/* Read the total amount of memory in kB */
sscanf(line + 10, "%8lu", &(file_stats.tlmkb));
else if (!strncmp(line, "MemFree:", 8))
/* Read the amount of free memory in kB */
sscanf(line + 10, "%8lu", &(file_stats.frmkb));
・・・
(2)保存した値を出力している部分
対象ファイル:sar.c
関数名:write_stats()
/* Print amount and usage of memory */
if (GET_MEM_AMT(act)) {
if (dis)
printf(_("\n%-11s kbmemfree kbmemused %%memused kbmemshrd kbbuffers kbcached kbswpfree kbswpused %%swpused\n"), cur_time[!curr]);
printf("%-11s %9lu %9lu", cur_time[curr], ←ここより下で構造体の中身を表示
file_stats[curr].frmkb,
file_stats[curr].tlmkb - file_stats[curr].frmkb);
・・・
実際の表示が以下なので、/procの中身を表示していると言うことが確認できました。
00:01:01 kbmemfree kbmemused %memused kbmemshrd kbbuffers kbcached kbswpfree kbswpused %swpused
00:11:01 24108 230388 90.53 884 19904 122220 976752 51368 5.00
※厳密に言うと、sadcにて読み込まれた/procの情報はsa**ファイル(バイナリ)となります。
その後、sarに渡し我々が読める形のsar**ファイルとなります。




コメント