CentOS Stream8のサポート終了を期にCentOS Stream9にバージョンアップしてみました。
そうしたらバージョンアップ後にOSからメモリが200MBも減っているじゃないですか。VPS 1GBコースで2割も持っていかれるのは勿体ないので対処法を探します。
この段差はなんだ?
バージョンアップ後にMuninでリソースを確認していたら、最大メモリが200MB程度減っていることに気づきました。天使の取り分としては大きすぎる・・・

freeで確認するとtotalが767MiB(800MB)になっているので、Muninの誤検知ではなく、確かにOSから認識しているメモリが減っていることになります。
# free -h
total used free shared buff/cache available
Mem: 767Mi 392Mi 231Mi 25Mi 289Mi 375Mi
Swap: 4.0Gi 0B 4.0Gi
そこでネットを調べてみると、最大メモリが減るのはRHEL9&クローン系の正しい挙動とのこと。メモリが1GB以上ある場合crashkernel(メモリダンプ)用に200MB以上確保されるようです。
ということでdmesegのログを見るとOSからはメモリが1048160KB(約1GB)されていますが、一方で294200KB(約290MB)も予約(reserved)されていることがわかります。
# dmesg | grep Memory: [ 0.020822] Memory: 260860K/1048160K available (16384K kernel code, 5672K rwdata, 12872K rodata, 3972K init, 5700K bss, 294200K reserved, 0K cma-reserved)
そしてdmesegをcrashkernelで検索すると、メモリ1GBの場合は192MBが専用に割り当てられているようです。
# dmesg | grep crashkernel [ 0.000000] Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-479.el9.x86_64 root=UUID=680c1d43-bf5b-4656-b88d-1d6b4455cfe8 ro console=ttyS0,115200 console=tty0 consoleblank=0 quiet crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M [ 0.010269] Reserving 192MB of memory at 640MB for crashkernel (System RAM: 1023MB) [ 0.017544] Kernel command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-479.el9.x86_64 root=UUID=680c1d43-bf5b-4656-b88d-1d6b4455cfe8 ro console=ttyS0,115200 console=tty0 consoleblank=0 quiet crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M
crashkernelを0にしたいが/etc/default/grubを変更しても変化なし
そして/etc/default/grubのGRUB_CMDLINE_LINUX行にあるcrashkernel値を変更すると良いという記事を見つけたのですが、CentOS Stream8からバージョンアップしたからなのか、このサーバにはcrashkernelの記載がありません。
# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL="serial console" GRUB_SERIAL_COMMAND="serial --speed=115200" GRUB_CMDLINE_LINUX="console=ttyS0,115200 console=tty0 consoleblank=0 quiet" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true
試しにGRUB_CMDLINE_LINUX行にcrashkernel=0を加えてrobootしてみましたが効果はありませんでした。
# vi /etc/default/grub- GRUB_CMDLINE_LINUX="console=ttyS0,115200 console=tty0 consoleblank=0 quiet"
+ GRUB_CMDLINE_LINUX="console=ttyS0,115200 console=tty0 consoleblank=0 quiet crashkernel=0"
grubbyコマンドでcrashkernelを設定するらしい
そして公式ナレッジを読み進めていくと、ブートローダー設定はgrubbyコマンドで更新しなさいとのこと。
13.2. RHEL 9 での kdump メモリー使用量の設定
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/managing_monitoring_and_updating_the_kernel/configuring-kdump-memory-usage-on-rhel-9_configuring-kdump-on-the-command-line
crashkernelは細かな設定をできるようですがズバッと削減したいので今回はcrashkernel=0を設定し、反映させるためにOSをrebootします。
# grubby --update-kernel ALL --args "crashkernel=0" # shutdown -r now
reboot後にfreeを見るとtotalがしっかり192MiB増えています。dmesgからも”Reserving 192MB of memory at 640MB for crashkernel”の行が消えています。
# free -h
total used free shared buff/cache available
Mem: 959Mi 370Mi 509Mi 27Mi 244Mi 589Mi
Swap: 4.0Gi 0B 4.0Gi
# dmesg | grep Memory:
[ 0.018701] Memory: 260860K/1048160K available (16384K kernel code, 5672K rwdata, 12872K rodata, 3972K init, 5700K bss, 97588K reserved, 0K cma-reserved)
# dmesg | grep crashkernel
[ 0.000000] Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-479.el9.x86_64 root=UUID=680c1d43-bf5b-4656-b88d-1d6b4455cfe8 ro console=ttyS0,115200 console=tty0 consoleblank=0 quiet crashkernel=0
[ 0.016950] Kernel command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-479.el9.x86_64 root=UUID=680c1d43-bf5b-4656-b88d-1d6b4455cfe8 ro console=ttyS0,115200 console=tty0 consoleblank=0 quiet crashkernel=0
1GBから192MBもとられるのは痛いです(2回目
muninでもメモリ量が回復していることを確認しました。

それにしても1GBから192MBもcrashkernelにとられるのは厳しいと思います。CentOS8の時点でメモリ1.5GB以上を推奨してたような気がするので、せめて2GB以上からにして欲しかった。
※追記 カーネルアップデート後に再起動したら元に戻ったので暫定対処
grubby –update-kernel ALL….はインストールされているカーネルのパラメータを変更するコマンドなので、その後にインストールされたカーネルには影響しないんですね。
暫定対処として再起動タスクの直前にgrubbyコマンドを仕掛けることにしました。
/etc/cron.d/restart
51 5 1 * * root /usr/sbin/grubby --update-kernel ALL --args "crashkernel=0" && /sbin/shutdown -r now
正攻法があるはずなのでもっと勉強しなくては!