sar -W の pswpin/s pswpout/s がどのファイルから読まれているか調べる

概要

ちょいと 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 はどのファイルから値を取っているのか?

この数値はどこから取ってるのだったかな? と気になったのでソースを調べました。

github.com

ソースを 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/vmstatgrep して調べてみると、あったあった

hiboma@example:~$ grep pswp /proc/vmstat
pswpin 0
pswpout 0

感想

  • 10分くらいで調べて、10分でエントリ書き下した
  • イマドキなシステムだと sar をあえて使うケースは少なくなってきてるとは思う
  • /proc から kernel の実装に飛び込んで深追いもできるので、いい材料だとは思うんす