概要
ちょいと sar -W
を使うことがあって ソースを調べた話です
sar -W とは?
sar -W
で 一秒間にスワップインしたページ / スワップアウトしたページを参照できる
hiboma@example:~$ sar -W 1 Linux 5.15.0-25-generic (example) 06/20/22 _x86_64_ (4 CPU) 12:25:22 pswpin/s pswpout/s 12:25:23 0.00 0.00 12:25:24 0.00 0.00 12:25:25 0.00 0.00
以下は man の説明を引用したものです
-W Report swapping statistics. The following values are displayed: pswpin/s Total number of swap pages the system brought in per second. pswpout/s Total number of swap pages the system brought out per second.
sar -W はどのファイルから値を取っているのか?
この数値はどこから取ってるのだったかな? と気になったのでソースを調べました。
ソースを clone します
ghq get git@github.com:sysstat/sysstat.git
pswpin
でソースを grep ( ag ) して、それっぽいコードを探してアタリをつける。ヘッダファイルの 👈 っぽいですね。
$ ag pswpin ... 略m rd_stats.h 156: unsigned long pswpin __attribute__ ((aligned (8))); 👈 pcp_stats.c 282: snprintf(buf, sizeof(buf), "%lu", ssc->pswpin); xml_stats.c 399: "pswpin=\"%.2f\" " 401: S_VALUE(ssp->pswpin, ssc->pswpin, itv),
ヘッダファイルを読む
rd_stats.h で struct stats_swap
なる構造体を見つける。次は、この構造体が参照されている関数を探す。
/* Structure for swapping statistics */ struct stats_swap { unsigned long pswpin __attribute__ ((aligned (8))); unsigned long pswpout __attribute__ ((aligned (8))); };
関数を探す
C のソースを読むときは Emacs が手に馴染んでいるので、 GNU Global で絞り込む
sscanf してるのが怪しいですね。ジャンプすると read_vmstat_swap() という関数です
read_vmstat_swap を読む
read_vmstat_swap() で pswpin / pswapout の値を取ってるみたいですね。 /proc/vmstat
を読んでるようです。
/* *************************************************************************** * Read swapping statistics from /proc/vmstat. * * IN: * @st_swap Structure where stats will be saved. * * OUT: * @st_swap Structure with statistics. * * RETURNS: * 1 on success, 0 otherwise. *************************************************************************** */ __nr_t read_vmstat_swap(struct stats_swap *st_swap) { FILE *fp; char line[128]; if ((fp = fopen(VMSTAT, "r")) == NULL) return 0; while (fgets(line, sizeof(line), fp) != NULL) { if (!strncmp(line, "pswpin ", 7)) { /* Read number of swap pages brought in */ sscanf(line + 7, "%lu", &st_swap->pswpin); } else if (!strncmp(line, "pswpout ", 8)) { /* Read number of swap pages brought out */ sscanf(line + 8, "%lu", &st_swap->pswpout); } } fclose(fp); return 1; }
/proc/vmstat
で grep して調べてみると、あったあった
hiboma@example:~$ grep pswp /proc/vmstat pswpin 0 pswpout 0
感想
- 10分くらいで調べて、10分でエントリ書き下した
- イマドキなシステムだと sar をあえて使うケースは少なくなってきてるとは思う
- /proc から kernel の実装に飛び込んで深追いもできるので、いい材料だとは思うんす