はじめに
RHEL 9 のバイナリ互換 OS をメモリ 1GB の VPS インスタンスで動かしたとき、カーネル予約領域を大量に持って行かれたのでメモ。
OS | Rocky Linux release 9.1 (Blue Onyx) (Red Hat Enterprise Linux 9.1 互換) |
サーバ環境 | WebARENA Indigo 1GB プラン |
生じた現象
メモリ 1GB 契約なのに free
で確認すると 0.75GB しかない!
$ free
total used free shared buff/cache available
Mem: 783012 218668 521272 5708 161148 564344
Swap: 0 0 0
一方で、メモリ割り当て自体は確かに 1GB になっている。
$ dmesg | grep Memory:
[ 0.024424] Memory: 254716K/1048164K available (14344K kernel code, 6001K rwdata, 9208K rodata, 2740K init, 7196K bss, 337100K reserved, 0K cma-reserved)
対処
上記 dmesg
の Memory の行で 337100K reserved
と言っているので誰かが予約してるのは間違いなさそう。
kdump (crashkernel) の設定を見てみると…
$ dmesg | grep crashkernel
[ 0.000000] Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-162.12.1.el9_1.0.2.x86_64 root=UUID=ea04cdfa-052b-49b2-a501-72637011cc66 ro console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M console=tty0
[ 0.006655] Reserving 192MB of memory at 576MB for crashkernel (System RAM: 1023MB)
crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M
とある。
メモリ 1GB だから Reserving 192MB of memory
のログ通り 192MB 予約されている模様。
Red Hat の資料にも、
64 ビット ARM アーキテクチャーでは、利用可能なメモリーが 1 GB を超える場合にのみ crashkernel のデフォルトパラメーターが機能します
と記載されている。
いくらカーネルクラッシュ時の解析がしづらくなると言われても、メモリ 0.75GB じゃ普通に動かすだけでもメモリ不足になりそうなので kdump を無効化する。
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
-GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M console=tty0"
+GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=2G-4G:192M,4G-64G:256M,64G-:512M console=tty0"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
crashkernel=1G...
を全部消してもいいけど、1G
を 2G
にすることで結果的にメモリの予約を無効にする消極的対応とした。
kdump 自体が起動しないようにして、GRUB の設定変更を反映して再起動。
# systemctl disable kdump
# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot
再起動後、メモリの状況を確認してみる。
$ free
total used free shared buff/cache available
Mem: 979620 253756 743780 4492 110764 725864
Swap: 0 0 0
これでよさそう。解決。
補足
当然ながら、本家本元の RHEL 9.1 でも同じ設定となっている。
※Red Hat Developer でタダで使ってる自宅サーバの RHEL で確認。
$ grep crashkernel /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=c2f63eb5-965f-4cf8-bcd4-ad550c2724c6"
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 9.1 (Plow)