GRUBの設定でカーネルが認識するメモリ容量を制限する

もう年末です。今年のISUCONではpixivさんの社内ISUCONで練習させていただきました。

inside.pixiv.net

その時に気になったことがありまして。インスタンスタイプがc4.largeなのにメモリが1Gしかなくて、なんでかなーと。

$ free -m
             total       used       free     shared    buffers     cached
Mem:           998        236        762         12         11        105
-/+ buffers/cache:        119        879
Swap:            0          0          0

$ cat /proc/meminfo 
MemTotal:        1022972 kB

c4.largeのメモリは3.75GBのはずですが、1Gしか認識されていません。

どこかで制限しているのだろうけど・・・OSが認識していない、OSが起動する前に制限してる?ブートローダー?と思ったらそうでした。

/boot/grub/grub.cfg を確認すると、 mem=1G という記述があります!

linux   /boot/vmlinuz-3.16.0-4-amd64 root=UUID=e0f20fc2-3ca6-416b-8907-4050fe6120ab ro mem=1G init=/bin/systemd console=hvc0 console=ttyS0

この設定を変えてみます。 /boot/grub/grub.cfg を直接変更するのではなく、 /etc/default/grub を編集します。

参考 GRUB を設定する 〜 GRUB 2 編 - いますぐ実践! Linuxシステム管理 / Vol.202

/etc/default/grub を確認してみると

$ cat /etc/default/grub | grep GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX_DEFAULT="init=/bin/systemd console=hvc0 console=ttyS0"
GRUB_CMDLINE_LINUX="mem=1G"

ありますねー、 mem=1G という記述が。 GRUB_CMDLINE_LINUX にはカーネルの起動パラメータを記述できます。ここに起動パラメータを記述してOSが認識するメモリ容量を制限していました。

GRUB_CMDLINE_LINUX から mem=1G の記述を消して、以下のコマンド実行します。

$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done

再度 /boot/grub/grub.cfg を確認してみると mem=1G がなくなっています。

linux   /boot/vmlinuz-3.16.0-4-amd64 root=UUID=e0f20fc2-3ca6-416b-8907-4050fe6120ab ro  init=/bin/systemd console=hvc0 console=ttyS0

インスタンスを再起動して、確認してみると

$ free -m
             total       used       free     shared    buffers     cached
Mem:          3774        245       3529         16         11        109
-/+ buffers/cache:        124       3650
Swap:            0          0          0

$ cat /proc/meminfo 
MemTotal:        3865596 kB

使用できるメモリが増えました!