RHEL 9 (互換 OS) をメモリ 1GB の環境で使うときは kdump の設定にご用心

# はじめに
RHEL 9 のバイナリ互換 OS をメモリ 1GB の VPS インスタンスで動かしたとき、カーネル予約領域を大量に持って行かれたのでメモ。

<table>
    <tr>
        <td>OS</td><td>Rocky Linux release 9.1 (Blue Onyx)<br />(Red Hat Enterprise Linux 9.1 互換)</td>
    </tr>
    <tr>
        <td>サーバ環境</td><td>WebARENA Indigo 1GB プラン</td>
    </tr>
</table>

# 生じた現象

メモリ 1GB 契約なのに `free` で確認すると 0.75GB しかない！

```shell-session
$ free
               total        used        free      shared  buff/cache   available
Mem:          783012      218668      521272        5708      161148      564344
Swap:              0           0           0
```

一方で、メモリ割り当て自体は確かに 1GB になっている。

```shell-session
$ 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) の設定を見てみると…

```shell-session
$ 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 の資料にも、

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_monitoring_and_updating_the_kernel/configuring-kdump-on-the-command-line_managing-monitoring-and-updating-the-kernel#con_configuring-kdump-memory-usage_configuring-kdump-on-the-command-line

> 64 ビット ARM アーキテクチャーでは、利用可能なメモリーが 1 GB を超える場合にのみ crashkernel のデフォルトパラメーターが機能します

と記載されている。

いくらカーネルクラッシュ時の解析がしづらくなると言われても、メモリ 0.75GB じゃ普通に動かすだけでもメモリ不足になりそうなので kdump を無効化する。

```diff_conf: /etc/default/grub
 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 の設定変更を反映して再起動。

```shell-session
# systemctl disable kdump
# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot
```

再起動後、メモリの状況を確認してみる。

```shell-session
$ 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](https://www.redhat.com/ja/explore/now-on-redhat/trial) でタダで使ってる自宅サーバの RHEL で確認。

```shell-session
$ 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)
```