Linux カーネルアップデートのメモ
検証環境
経緯
ブラウザでのアクセスや SSH によるログインなど、全体的にサーバの動作が重くなっていたり、定期バックアップの取得に失敗していたりと何かとサーバが不調だったため対策を講じる必要が出てきました。
調査
CPU、メモリともにリソース使用率の推移グラフを見てもスパイクしている箇所は見受けられず、OS 側から見ても特にリソースが逼迫しているようには見えませんでした。
/var/log/messages
を確認すると以下のカーネルログが見られました。
Apr 10 02:49:13 server01 kernel: NMI watchdog: BUG: soft lockup - CPU#1 stuck for 26s! [kworker/1:0:4309] Apr 10 02:49:13 server01 kernel: NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s! [irqbalance:508]
このログを頼りに調査したところ、オーバーコミットの発生による影響もしくはカーネルのバグである線が濃厚なようです。
/boot/config-3.10.0-514.el7.x86_64
の CONFIG_LOCKUP_DETECTOR=y
を n
に書き換れば解決!といった記事を多く見かけましたが、これは自動生成のファイルらしく、書き換えてリブートしても元に戻っていました。(カーネルのリビルドが必須?)
当該仮想マシンは vSphere 上で稼働させているためオーバーコミットは十分ありえますが、上述したように使用率としては健全な状態に見えています。
根本解決にはならないかもしれませんが、構築してからしばらく経っているので、ビルドの経験を積むことも兼ねてカーネルのバージョンを上げてみます。
アップデート検証
現在のカーネルと OS 確認
# uname -r 3.10.0-514.el7.x86_64 # cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)
ビルド用パッケージのインストール
# yum groupinstall "Development Tools" # yum install ncurses-devel openssl-devel bc elfutils-libelf-devel
groupinstall では 110MB ほどのパッケージがリストアップされました。
最新安定版カーネルのインストール
2019/04/22 時点で最新の 5.0.9 をダウンロードします。
# cd /usr/src/kernels # curl -O https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.9.tar.xz # xz -d linux-5.0.9.tar.xz # tar xvf linux-5.0.9.tar # cd linux-5.0.9
現在のカーネル設定をコピーする
# cp -p /boot/config-3.10.0-514.el7.x86_64 ./.config # yes "" | make oldconfig
カーネルのコンパイルとインストール
make コマンドでコンパイルが開始します。今回の環境では 2 時間強かかりました。
# make
必要なモジュールをインストールし、カーネルをインストールします。こちらは数分で完了しました。
# make modules_install # make install
起動するカーネルの変更
デフォルトで起動されるカーネルバージョンを表示します。
# grub2-editenv list saved_entry=CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)
追加したカーネルは menuentry
で検索をすると表示されます。
# less /etc/grub2.cfg menuentry 'CentOS Linux (5.0.9) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-cb2f2052-d71c-4e4e-860d-f74283c2983b' { (略)
awk
コマンドで必要な部分だけ抜き出します。
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (5.0.9) 7 (Core) CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-f1b3f5b09f324f4bb9d41b8c224a66f5) 7 (Core)
上から順に 0 から始まるエントリとなっているため、今回用意したカーネル CentOS Linux (5.0.9) 7 (Core)
に相当する 0 を設定して再起動します。
# grub2-set-default 0 # grub2-editenv list saved_entry=0 # reboot
カーネルの確認
# uname -r 5.0.9
アップデート後の状況
CentOS と Linux カーネルのバージョン互換など色々調べずに進めてしまいましたが、アップデート後一ヶ月ほど経っても問題なく動いています。
最初に「サーバの動作が重たくなっている」との問題を挙げて本検証を行いましたが、同様の環境をふたつ用意し、片方だけカーネルのバージョンアップを行ってみても動作的な部分に改善は見られませんでした。
vCPU の変更
また、別の修正箇所として仮想マシンの vCPU 数が 2 コアになっていた部分を 1 コアに変更したところ動作が軽くなり、問題が解決されました。
ハイパーバイザ上で仮想マシンが複数の vCPU を使用している場合、物理 CPU のスケジューリングの関係から vCPU の割り当て待ちが発生してしまうため、1 コアで足りるのであればその方が安定稼働するようです。
カーネルが怪しいと睨んでおきながら別の被疑箇所をしれっと変えて解決してしまい微妙な検証結果になってしまいました…。OS だけでなくハイパーバイザ側からの視点でも考えられるように精進します。
参考サイト
カーネルの不具合について
- 【CentOS】BUG: soft lockup - CPU# のメッセージ
- SMP 対応の仮想マシンで実行中の Linux カーネルからソフト ロックアップ メッセージが出力される (1009996)