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 の実装に飛び込んで深追いもできるので、いい材料だとは思うんす

白河南湖公園〜那須高原 🚴

4/12(火) 休みを撮って白河南湖公園那須高原を走った記録。半袖 + 短パン (レーパン) でもほんのり暑いくらいの暑気だった

f:id:hiboma:20220412122055j:plain

f:id:hiboma:20220415120508p:plain

走行距離 93km 獲得標高 787m 。途中、調子悪くなったので早めに切り上げ

続きを読む

Linux の sysctl net.ipv4. icmp_echo_ignore_broadcasts / macOS (XNU) sysctl net.inet.icmp.bmcastecho の実装を読む

Linuxsysctl net.ipv4. icmp_echo_ignore_broadcasts と、 macOS / XNU の sysctl net.inet.icmp.bmcastecho の実装を調べたエントリです

何の sysctl ですか?

Linuxsysctl net.ipv4. icmp_echo_ignore_broadcastsCIS BenchmarksSmurf 攻撃対策として取り上げられています。

www.cisecurity.org

Smurf 攻撃とは何ですか?

Smurf 攻撃自体の説明は他のサイトで確認してください

ja.wikipedia.org

SMURF攻撃とは、攻撃者が標的となるサーバーをInternet Control Message Protocol(ICMP)パケットで圧倒させようとする分散サービス妨害(DDoS)攻撃です。1つまたは複数のコンピューターネットワークに対して、標的のデバイスのスプーフィングIPアドレスでリクエストを行うことにより、コンピューターネットワークは標的サーバーに応答し、初期攻撃トラフィックを増幅し、潜在的に標的を圧倒し、アクセス不能にします。この攻撃ベクトルは一般に、解決された脆弱性と見なされており、もはや流行していません。

引用: https://www.cloudflare.com/ja-jp/learning/ddos/smurf-ddos-attack

sysctl net.ipv4. icmp_echo_ignore_broadcasts の詳細

sysctl net.ipv4. icmp_echo_ignore_broadcasts あるいは /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts の説明を、Red Hat Cusotmer Portal から引用します。

icmp_echo_ignore_all 及び icmp_echo_ignore_broadcasts — 各ホストからの ICMP ECHO パケット、もしくはブロードキャスト及びマルチキャストのアドレスを起点とする ICMP ECHO パケットのみを無視することをそれぞれカーネルに許可します。0 の値は、カーネルによる応答を許可し、1 の値はパケットを無視します。

引用: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-dir-sys

macOS / XNU にも同様の sysctl 設定はあるのか?

macOS ( XNU ) では、Linux と同様に機能する sysctl として sysctl net.inet.icmp.bmcastecho が用意されています。なお、bmcastechoBroadcast Multicast Echo の略称のようです。

sysctl の実装を読もう

Smurf 攻撃の sysctl の設定方法を取り扱った記事はたくさんありますが、実装 (= カーネルのソース) まで踏み込んでるエントリは無いようなので、調べて見ましょう。

macOS ( XNU ) のソースも調べてました

続きを読む