8.7. カーネル
カーネルページサイズに依存する顧客アプリケーションは、ページサイズカーネルを 4k から 64k に移行するときに更新が必要になる場合がある
RHEL は、4k と 64k の両方のページサイズのカーネルと互換性があります。4K カーネルページサイズに依存する顧客アプリケーションは、4K から 64K ページサイズカーネルに移行するときに更新が必要になる場合があります。この既知の例には、jemalloc
および依存アプリケーションが含まれます。
jemalloc
メモリーアロケータライブラリーは、システムのランタイム環境で使用されるページサイズの影響を受けます。このライブラリーは、たとえば、--with-lg-page=16
または env JEMALLOC_SYS_WITH_LG_PAGE=16
(jemallocator
Rust クレートの場合) で設定されている場合、4k および 64k ページサイズのカーネルと互換性があるように構築できます。その結果、ランタイム環境のページサイズと、jemalloc
に依存するバイナリーのコンパイル時に存在したページサイズとの間に不一致が発生する可能性があります。その結果、jemalloc
ベースのアプリケーションを使用すると、次のエラーが発生します。
<jemalloc>: Unsupported system page size
<jemalloc>: Unsupported system page size
回避策: この問題を回避するには、以下のいずれかの方法を使用します。
- 適切なビルド設定または環境オプションを使用して、4k および 64k ページサイズと互換性のあるバイナリーを作成します。
-
最終的な 64k カーネルおよびランタイム環境で起動した後、
jemalloc
を使用するユーザー空間パッケージをビルドします。
たとえば、同じく jemalloc
を使用する fd-find
ツールを、cargo
Rust パッケージマネージャーを使用して構築できます。最後の 64k 環境では、cargo
コマンドを入力して、すべての依存関係の新しいビルドをトリガーし、ページサイズの不一致を解決します。
cargo install fd-find --force
# cargo install fd-find --force
Jira:RHELPLAN-147783[1]
dnf
を使用して最新のリアルタイムカーネルにアップグレードしても、複数のカーネルバージョンは並行してインストールされない
dnf
パッケージマネージャーを使用して最新のリアルタイムカーネルをインストールするには、パッケージの依存関係を解決して、新しいカーネルバージョンと現在のカーネルバージョンを同時に保持する必要があります。デフォルトでは、dnf
は、アップグレード中に古い kernel-rt
パッケージを削除します。
回避策: 現在の kernel-rt
パッケージを /etc/yum.conf
設定ファイルの installonlypkgs
オプションに追加します (例: installonlypkgs=kernel-rt
)。
installonlypkgs
オプションは、dnf
で使用されるデフォルトのリストに kernel-rt
を追加します。installonlypkgs
ディレクティブにリストされているパッケージは自動的には削除されないため、複数のカーネルバージョンの同時インストールがサポートされます。
複数のカーネルをインストールすると、新しいカーネルバージョンを使用するときにフォールバックオプションを使用できるようになります。
Jira:RHELPLAN-153123[1]
デフォルトでは、Delay Accounting
機能は SWAPIN
および IO%
統計列を表示しない
初期のバージョンとは異なり、Delayed Accounting
機能はデフォルトで無効になっています。その結果、iotop
アプリケーションは SWAPIN
および IO%
統計列を表示せず、次の警告を表示します。
CONFIG_TASK_DELAY_ACCT not enabled in kernel, cannot determine SWAPIN and IO%
CONFIG_TASK_DELAY_ACCT not enabled in kernel, cannot determine SWAPIN and IO%
taskstats
インターフェイスを使用する Delay Accounting
機能は、スレッドグループに属するすべてのタスクまたはスレッドの遅延統計を提供します。タスク実行の遅延は、カーネルリソースが利用可能になるのを待つときに発生します。たとえば、空き CPU が実行されるのを待っているタスクです。統計は、タスクの CPU 優先度、I/O 優先度、および rss
制限値を適切に設定するのに役立ちます。
回避策: 実行時または起動時に、delayacct
ブートオプションを有効化できます。
実行時に
delayacct
を有効にするには、次のように入力します。echo 1 > /proc/sys/kernel/task_delayacct
echo 1 > /proc/sys/kernel/task_delayacct
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドはシステム全体で機能を有効にしますが、このコマンドの実行後に開始したタスクに対してのみ有効であることに注意してください。
起動時に
delayacct
を永続的に有効にするには、次のいずれかの手順を使用します。/etc/sysctl.conf
ファイルを編集して、デフォルトのパラメーターをオーバーライドします。次のエントリーを
/etc/sysctl.conf
ファイルに追加します。kernel.task_delayacct = 1
kernel.task_delayacct = 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、Red Hat Enterprise Linux で sysctl 変数を設定する方法 を参照してください。
- システムを再起動して、変更を反映させます。
カーネルコマンドラインに
delayacct
オプションを追加します。詳細は、カーネルコマンドラインパラメーターの設定 を参照してください。
その結果、iotop
アプリケーションは SWAPIN
および IO%
統計列を表示します。
Jira:RHELPLAN-135779[1]
コア数が多いシステム上のリアルタイムカーネルのハードウェア認定には、skew-tick=1
ブートパラメーターを渡すことが必要になる場合がある
多数のソケットとコアカウントが大きい大規模なシステムまたは中規模のシステムでは、タイムキーピングシステムで使用される xtime_lock
のロック競合により、レイテンシーの急増が発生する可能性があります。その結果、マルチプロセッシングシステムでは、レイテンシーの急増やハードウェア認定の遅延が発生する可能性があります。
回避策: skew_tick=1
ブートパラメーターを追加することで、CPU ごとにタイマーティックをオフセットし、別のタイミングで開始できます。
ロックの競合を回避するには、skew_tick=1
を有効にします。
grubby
でskew_tick=1
パラメーターを有効にします。grubby --update-kernel=ALL --args="skew_tick=1"
# grubby --update-kernel=ALL --args="skew_tick=1"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 変更を有効にするために再起動します。
ブート中に渡すカーネルパラメーターを表示して、新しい設定を確認します。
cat /proc/cmdline
cat /proc/cmdline
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
skew_tick=1
を有効にすると、消費電力が大幅に増加するため、レイテンシーの影響を受けるリアルタイムワークロードを実行している場合にのみ有効にする必要があります。
Jira:RHEL-9318[1]
kdump
メカニズムは、LUKS 暗号化ターゲットで vmcore
ファイルをキャプチャーできない
Linux Unified Key Setup (LUKS) で暗号化されたパーティションを使用するシステムで kdump
を実行する場合、システムには一定量の使用可能なメモリーが必要です。使用可能なメモリーが必要なメモリー量より少ない場合、systemd-cryptsetup
サービスはパーティションのマウントに失敗します。その結果、2 番目のカーネルは LUKS 暗号化ターゲット上のクラッシュダンプファイルのキャプチャーに失敗します。
回避策: Recommended crashkernel value
をクエリーし、メモリーサイズを適切な値まで徐々に増やします。Recommended crashkernel value
は、必要なメモリーサイズを設定するための参考として役立ちます。
クラッシュカーネルの推定値を出力します。
kdumpctl estimate
# kdumpctl estimate
Copy to Clipboard Copied! Toggle word wrap Toggle overflow crashkernel
の値を増やして、必要なメモリー量を設定します。grubby --args=crashkernel=652M --update-kernel=ALL
# grubby --args=crashkernel=652M --update-kernel=ALL
Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動して、変更を反映させます。
reboot
# reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
これにより、LUKS で暗号化したパーティションがあるシステムで kdump
が正常に機能します。
Jira:RHEL-11196[1]
kdump
サービスが IBM Z システムで initrd
ファイルの構築に失敗する
64 ビットの IBM Z システムでは、s390-
subchannels などの znet
関連の設定情報が非アクティブな NetworkManager
接続プロファイルに存在する場合、kdump
サービスは初期 RAM ディスク (initrd
) のロードに失敗します。その結果、kdump
メカニズムは次のエラーで失敗します。
dracut: Failed to set up znet kdump: mkdumprd: failed to make kdump initrd
dracut: Failed to set up znet
kdump: mkdumprd: failed to make kdump initrd
回避策として、次のいずれかの解決策を使用してください。
znet
設定情報を持つ接続プロファイルを再利用して、ネットワークボンディングまたはブリッジを設定します。nmcli connection modify enc600 master bond0 slave-type bond
$ nmcli connection modify enc600 master bond0 slave-type bond
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 非アクティブな接続プロファイルからアクティブな接続プロファイルに
znet
設定情報をコピーします。nmcli
コマンドを実行して、NetworkManager
接続プロファイルを照会します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 非アクティブな接続からの設定情報でアクティブなプロファイルを更新します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 変更を有効にするために
kdump
サービスを再起動します。kdumpctl restart
# kdumpctl restart
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Jira:RHELPLAN-115732[1]
kmod
の weak-modules
がモジュールの相互依存関係で機能しない
kmod
パッケージによって提供される weak-modules
スクリプトは、どのモジュールがインストールされたカーネルと kABI 互換であるかを判別します。しかし、weak-modules
は、モジュールのカーネル互換性をチェックする際に、モジュールシンボルの依存関係を、そのビルド対象のカーネルの新しいリリースから古いリリースの順に処理します。結果として、異なるカーネルリリースに対して構築された相互依存関係を持つモジュールは互換性がないと解釈される可能性があるため、weak-modules
はこのシナリオでは機能しません。
回避策: 新しいカーネルをインストールする前に、最新のストックカーネルに対して追加モジュールをビルドまたは配置します。
Jira:RHELPLAN-126922[1]
Intel® i40e
アダプターが IBM Power10 で永続的に失敗する
IBM Power10 システムで i40e
アダプターに I/O エラーが発生すると、Enhanced I/O Error Handling (EEH) カーネルサービスがネットワークドライバーのリセットとリカバリーをトリガーします。 しかし、EEH は、i40e
ドライバーが事前に定義された EEH フリーズの最大値に達するまで、繰り返し I/O エラーを報告します。その結果、デバイスは EEH によって永続的に失敗します。
Jira:RHEL-15404[1]
64 ビット ARM CPU で正しくコンパイルされたドライバーでのプログラム失敗に関して dkms
が誤った警告を出す
Dynamic Kernel Module Support (dkms
) ユーティリティーは、4 kB および 64 kB のページサイズのカーネルで 64 ビット ARM CPU のカーネルヘッダーが動作することを認識しません。その結果、dkms
は、カーネルの更新時に kernel-64k-devel
パッケージがインストールされていない場合、正しくコンパイルされたドライバーでプログラムが失敗した理由に関して誤った警告を出します。
回避策: kernel-headers
パッケージをインストールします。このパッケージは、両タイプの ARM CPU アーキテクチャー用のヘッダーファイルを含むもので、dkms
とその要件に特化したものではありません。
Jira:RHEL-25967[1]
io_uring
が有効な場合、IBM Power システム (ppc64le
) でカーネルパニックが発生する
場合によっては、ppc64le
システムでは、集中的な入出力操作が原因で io_uring
カーネルパラメーターを使用するとカーネルパニックが発生することがあります。その結果、ppc64le
は動作を停止し、システムの再起動が必要になります。クラッシュ時にデータが失われる可能性があります。
回避策: 起動時に以下のカーネルパラメーターを追加して、io_uring
機能を無効にします。
module.builtin=io_uring=0
Jira:RHEL-28702[1]
UKI では、kdump
の起動に失敗する
Azure の機密仮想マシン上で統合カーネルイメージ (UKI) を有効にするために kernel-uki-virt
および kernel-modules-core
パッケージをインストールすると、kdump
サービスが起動に失敗します。その結果、kdump
は仮想マシン上で動作しません。
回避策: SELinux ポリシーを無効にして、仮想マシンを再起動します。これにより、kdump
サービスが実行されます。
Jira:RHEL-66119[1]