Linux カーネルアップデートのメモ

CentOSカーネルをアップデートした際のメモです。

検証環境

経緯

ブラウザでのアクセスや 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_64CONFIG_LOCKUP_DETECTOR=yn に書き換れば解決!といった記事を多く見かけましたが、これは自動生成のファイルらしく、書き換えてリブートしても元に戻っていました。(カーネルのリビルドが必須?)

当該仮想マシンは 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

アップデート後の状況

CentOSLinux カーネルのバージョン互換など色々調べずに進めてしまいましたが、アップデート後一ヶ月ほど経っても問題なく動いています。
最初に「サーバの動作が重たくなっている」との問題を挙げて本検証を行いましたが、同様の環境をふたつ用意し、片方だけカーネルのバージョンアップを行ってみても動作的な部分に改善は見られませんでした。

vCPU の変更

また、別の修正箇所として仮想マシンの vCPU 数が 2 コアになっていた部分を 1 コアに変更したところ動作が軽くなり、問題が解決されました。
ハイパーバイザ上で仮想マシンが複数の vCPU を使用している場合、物理 CPU のスケジューリングの関係から vCPU の割り当て待ちが発生してしまうため、1 コアで足りるのであればその方が安定稼働するようです。

カーネルが怪しいと睨んでおきながら別の被疑箇所をしれっと変えて解決してしまい微妙な検証結果になってしまいました…。OS だけでなくハイパーバイザ側からの視点でも考えられるように精進します。

参考サイト

カーネルの不具合について

アップデートについて