信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2019

5

7月

スワップのお話

テクログ

若いエンジニアとの技術的乖離をどうにかせねばっ!・・・と、

今時の技術を猛勉強している老兵エンジニアの大西です。

さて、今回は少し前に行った技講時にも質問がありましたのでスワップのお話を少し記そうと思います。サーバを扱うWeb屋としては基本中の基本ですが良かったら読んでみて下さいね。


スワップの前にメモリーのおさらいなど

メモリーといっても容量(サイズ)ではなく領域のお話になるのですが・・・メモリ上にはザックリとおおまかに2種類の領域が存在しますよね。1つは「ユーザプロセス空間」で、

もう1つが「ファイルキャッシュ」。この2種類の領域においてshrinkの比率が設定されていて、この設定を司っているのが vm.swappiness となります。(shrink: 解放あるいはスワップアウト)


vm.swappiness

この vm.swappiness ですがカーネル 2.6.32-303 を境にその意味が大きく変更されました。2.6.32-303未満では[vm.swappiness=0]は最小比率となりユーザプロセス空間をshrinkします。一方2.6.32-303以降では[vm.swappiness=0]の時はユーザプロセス空間はshrinkされません。これは2.6.32-303以降、つまり現カーネルにおいては[vm.swappiness=0]だと解放可能な使用済ユーザプロセス空間が残り続ける事が予想されるので、[vm.swappiness=0]ではなく[vm.swappiness=1]の方が良いのだ・・・となるわけです。


メモリーおさらい基礎知識

サーバを扱っているエンジニアの方はよくよく目にすると思いますがあらためて記してみます。

  • Anonymous Memory[Pages]

スワップが必要でかつ解放不可能なメモリー。

ユーザプロセス空間などがこれに当たります。

  • File-backed Memory[Pages]

ディスクなどへ書き出す事で解放可能なメモリーです。


/proc/meminfo を見てみる
  • Active(anon)

匿名ページのアクティブ分

  • Inactive(anon)

終了プロセスなどの解放可能な匿名ページ

  • Active(file)

File-backedのアクティブ分

  • Inactive(file)

解放可能なFile-backed

AnonPages

約 Active(anon) + Inactive(anon)

Buffers + Cached

約 Active(file) + Inactive(file)


vm.swappiness=100 とは?

この状態は Anonymous と File-backed のスワップ比率が同じ状態になります。

カーネルのプログラム関数 get_scan_ratio() において、

anon_prio = sc->swappiness;

file_prio = 200 - sc->swappiness;

とあり、[vm.swappiness=100]の場合は anon_prio も file_prio も同じスワップ比率となります。


カーネルを覗いてみる

mm/vmscan.c に get_scan_ratio() があります。

static void get_scan_ratio(・・・) {

anon_prio = sc->swappiness;

file_prio = 200 - sc->swappiness;


// vm.swappiness=0 の場合は常に ap=0

ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1);


ap /= reclaim_stat->recent_rotated[0] + 1;

fp = file_prio * (reclaim_stat->recent_scanned[1] + 1);

fp /= reclaim_stat->recent_rotated[1] + 1;


/* Normalize to percentages */

percent[0] = 100 * ap / (ap + fp + 1); <- Anonymousの比率は ap=0 なので 0

percent[1] = 100 - percent[0]; <- こちらは File-backedの比率


[vm.swappiness=0]にすると Anonymous の比率が 0 なのでスワップが発生しない事になりますね。


実験してみた

メモリー数十メガバイトという仮想サーバを作りそのサーバ上で数ギガバイトの圧縮データを zless してみた。

  • vm.swappiness=0 -> スワップは発生しませんが、OOM Killer が発生しました。
  • vm.swappiness=1 -> スワップが発生しましたが、プロセスはダウンしませんでした。


結論

今時の Linux でスワップをぎりぎりまで我慢させたい場合は、vm.swappiness を 0 にするのではなく 1 にしよう。


ちなみに OOM Killer についてもよく技講にて質問されます。気が向いたら次回のブログ担当の時にでも。


この記事を書いた人

マスオさん

ひろくん

所 属:
WEBインテグレーション事業部
出身地:
神奈川県
仕事内容:
部長・マネージメント