カーネルパラメータでスワップ処理を調整する

スポンサーリンク

カーネルパラメータでスワップ処理(スワップアウト)を、物理メモリーを使い切るまで行わないように調整します。

スワップ処理のジレンマ

以前のシステムでは、アプリケーションが必要とするメモリー空間に対し、物理メモリーの容量が圧倒的に小さかったため、スワップ領域を設けてスワップ処理を行うことが必然でした。しかし、最近は、個人利用であっても搭載できる最大メモリー容量が大きくなったため、必ずしもスワップ処理が必然ではなくなりました。

かといって、スワップ領域がまったく不要であるかといえば、そうではありません。

もしものときには、スワップ処理で足りないメモリー空間を補い、突然のプロセスダウンを防ぐこと自体が目的のひとつであることに変わりはありません。また、そのスワップ使用率を監視することで、事前に物理メモリーが不足しているのではないか?という判断材料にすることもできます。

もうひとつの目的として、スワップ処理は、物理メモリー上にある不要なデータをスワップアウトすることで、物理メモリーの空間を有効に利用できますが、反面、必要とするデータが物理メモリー上にない場合は、スワップインしなければならないため、性能面で不利になってしまいます。

スワップ処理のジレンマ解決方法

サーバー用途として、メモリー不足による突然のプロセスダウンを防ぐため、メモリーをたくさん積みたいが、コスト面とハード面で限界がある。そのため、スワップ処理で、プロセスダウンを防ぐべきであるが、性能面を考慮すると、できるだけ、スワップアウトさせたくない。

これらを解決するため、カーネルパラメータで「swappiness」の値を変更してスワップ処理の頻度を調整します。

検証した環境

# cat /etc/os-release
NAME="AlmaLinux"
VERSION="9.2 (Turquoise Kodkod)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.2"
PLATFORM_ID="platform:el9"
PRETTY_NAME="AlmaLinux 9.2 (Turquoise Kodkod)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:9::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"

ALMALINUX_MANTISBT_PROJECT="AlmaLinux-9"
ALMALINUX_MANTISBT_PROJECT_VERSION="9.2"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.2"
# uname -r
5.14.0-284.11.1.el9_2.x86_64

swappinessの現在値を確認(規定値)

swappinessの規定値は「60」で、「0~100」の範囲で設定可能で、低い値を設定すると、スワップ処理に消極的になり、高い値を設定すれば、スワップ処理に積極的になります。

# cat /proc/sys/vm/swappiness ・・・ 現在の設定値を確認
60

swappinessの設定変更と動作確認

物理メモリーを使い切るまで、スワップ処理を行わないように、一時的に設定を変更します。

# echo 0 > /proc/sys/vm/swappiness ・・・ 一時的に設定値を変更
# cat /proc/sys/vm/swappiness
0 ・・・ 「0」の設定でメモリーを使い切るまでスワップ処理はされない

別ウィンドウで、メモリーの状態をループで表示させます。

# while true; do free -h; sleep 1; done
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       1.1Gi       2.1Gi        21Mi       580Mi       2.4Gi
Swap:          4.0Gi          0B       4.0Gi
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       1.1Gi       2.1Gi        21Mi       580Mi       2.4Gi
Swap:          4.0Gi          0B       4.0Gi
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       1.1Gi       2.1Gi        21Mi       580Mi       2.4Gi
Swap:          4.0Gi          0B       4.0Gi
   :(省略)

簡易的にメモリーに負荷をかけます。

$ /dev/null < $(yes) & /dev/null < $(yes) & /dev/null < $(yes) &
[1] 3215
[2] 3216
[3] 3217

物理メモリーを使い切ってから、スワップ領域が使われていることが確認できます。

   :(省略)
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       3.5Gi       108Mi        15Mi       207Mi        90Mi
Swap:          4.0Gi          0B       4.0Gi
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       3.6Gi        87Mi        10Mi        42Mi        20Mi
Swap:          4.0Gi        39Mi       4.0Gi
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       3.5Gi       153Mi       7.0Mi        42Mi        56Mi
Swap:          4.0Gi       208Mi       3.8Gi
   :(省略)

簡易的にメモリーに負荷をかけていたものを停止します。

$ kill %1 %2 %3

永続的に設定

カーネルパラメータの設定を永続的に行なう設定をします。

ちなみに、設定値を「100」にすると、パフォーマンスはガタ落ちになります。(試してないけど)

# cd /etc/sysctl.d
# vi 89-swappiness.conf
vm.swappiness = 0

マシンリブートを行います。

# systemctl reboot

現在値を確認します。

# cat /proc/sys/vm/swappiness
0

昨今では、HDDではなく、比較的寿命が短いと言われるSSDの利用をされているかたも多いと思います。SSDの寿命を延ばすためにも、有効な設定だと思います。