第4章 外部カーネルパラメーターへの重要な変更
この章では、システム管理者向けに、Red Hat Enterprise Linux 9.6 で配布されるカーネルの重要な変更点の概要を説明します。これらの変更には、たとえば、追加または更新された proc
エントリー、sysctl
と sysfs
のデフォルト値、ブートパラメーター、カーネル設定オプション、または注目すべき動作の変更などが含まれます。
新しいカーネルパラメーター
arm64.no32bit_el0=
[ARM64]
32 ビットアプリケーションの実行を無条件で無効にします。
con3215_drop=
[S390]
形式: y|n|Y|N|1|0
true に設定すると、コンソールバッファーがいっぱいになると、3215 コンソールにデータをドロップします。この場合、3270 ターミナルエミュレーター (x3270 など) を使用している Operator は、コンソール出力を進めてカーネルを継続させるために Clear キーを押す必要がなくなります。これにより、3270 ターミナルエミュレーターがアクティブな場合に、起動時間がはるかに短縮されます。3270 ターミナルエミュレーターが使用されていない場合、このパラメーターは効果がありません。
stress_hpt=
[PPC]
ハッシュページテーブルのカーネル HPT エントリーの数を制限し、カーネルアドレスのハッシュページテーブル障害の割合を増やします。
kvm.enable_virt_at_load=
[KVM,ARM64,LOONGARCH,MIPS,RISCV,X86]
有効にすると、KVM は、KVM のロード時にハードウェアで仮想化を有効にし、KVM がアンロードされると (KVM がモジュールとして構築されている場合) 仮想化を無効にします。
無効にすると、KVM は、仮想マシンを作成して破棄するときに、オンデマンドで仮想化を動的に有効または無効にします。つまり、仮想マシンの数を 0⇒1 および 1⇒0 に移行します。
モジュールのロード時に仮想化を有効にすることで、0⇒1 仮想マシンの作成時に発生する可能性のある遅延を回避できます。これは、KVM がすべてのオンライン CPU に対して仮想化の有効化を直列に実行するためです。KVM のロード時に仮想化を有効にすると、その "代償" として、仮想化ハードウェアを"所有"しようとする out-of-tree のハイパーバイザーの使用が妨げられる可能性があります。
kvm-arm.wfe_trap_policy=
[KVM,ARM]
KVM 仮想マシンの WFE 命令トラップを設定するタイミングを制御します。トラップは許可されますが、CPU アーキテクチャーでは保証されません。
trap: WFE 命令トラップを設定します。
notrap: WFE 命令トラップをクリアします。
kvm-arm.wfi_trap_policy=
[KVM,ARM]
KVM 仮想マシンの WFI 命令トラップを設定するタイミングを制御します。トラップは許可されますが、CPU アーキテクチャーでは保証されません。
trap: WFI 命令トラップを設定します。
notrap: WFI 命令トラップをクリアします。
config_acs=
形式: <ACS flags>@<pci_dev>[; …]
1 つ以上の PCI デバイスを (上で指定された形式で) 指定します。必要に応じてフラグを先頭に付け、セミコロンで区切ることができます。フラグで指定された内容に基づいて、特定の機能が有効化、無効化、またはそのまま維持されます。
ACS フラグは以下のように定義されます。
bit-0
- ACS ソースの検証
bit-1
- ACS 変換ブロッキング
bit-2
- ACS P2P 要求リダイレクト
bit-3
- ACS P2P 完了リダイレクト
bit-4
- ACS アップストリーム転送
bit-5
- ACS P2P Egress 制御
bit-6
- ACS ダイレクト変換 P2P
各ビットには、次のマークを付けることができます。
0
: 強制的に無効にします。
1
: 強制的に有効にします。
X
: 変更なし
たとえば、pci=config_acs=10x と指定すると、ACS をサポートするすべてのデバイスに対して、P2P リクエストリダイレクトを有効化し、変換ブロッキングを無効化して、ソースの検証は電源投入時やファームウェア設定のまま変更しないようにします。
これにより、デバイス間の分離が解除され、IOMMU グループにさらに多くのデバイスが配置される可能性があります。
rcutree.nocb_nobypass_lim_per_jiffy=
[KNL]
コールバックオフロードされた (rcu_nocbs) CPU では、RCU は →nocb_bypass リストを使用することで、コールバックの集中によって発生するロック競合を軽減します。ただし、コールバックが大量に発生しない通常のケースでは、→nocb_bypass リストとそのロックによる余分なオーバーヘッドを回避するために、RCU はメインの →cblist に直接キューイングします。ただし、単一の jiffy 中にキューイングされているコールバックが多すぎると、RCU はコールバックを →nocb_bypass キューに事前にキューイングします。"too many" の定義は、このカーネルブートパラメーターで提供されます。
rcutree.nohz_full_patience_delay=
[KNL]
コールバックオフロードされた (rcu_nocbs) CPU では、猶予期間が指定したミリ秒の期間に達するまでは、RCU を干渉しないようにします。デフォルトはゼロです。大きな値の上限は 5 秒です。すべての値は、jiffies で表現できる最も近い値に切り捨てられます。
rcutree.rcu_divisor=
[KNL]
この CPU にキューイングされているコールバックの数から、コールバック呼び出しのバッチ上限 (bl) を計算するために使用する右シフトの回数を設定します。結果は、rcutree.blimit カーネルパラメーターの値によって下にバインドされます。bl コールバックごとに、softirq ハンドラーが終了し、CPU が他の作業を行えるようになります。
このコールバック呼び出しのバッチ制限は、オフロードされていないコールバック呼び出しのみに適用されることに注意してください。オフロードされたコールバックは、代わりに rcuoc kthread のコンテキストで実行されます。kthread は、他のタスクと同様にスケジューラーによってプリエンプションされます。
rcutree.enable_rcu_lazy=
[KNL]
電力を節約するために、RCU コールバックをバッチ処理し、一定の遅延後、メモリー圧迫時、またはコールバックリストが大きくなりすぎた場合にフラッシュします。
rcutree.rcu_normal_wake_from_gp=
[KNL]
synchronize_rcu() 呼び出しの遅延を短縮します。このアプローチでは、synchronize_rcu() 呼び出し元を独自に追跡し、call_rcu[_hurry]() パスを使用しないため、通常のコールバックと対話しません。これは通常の猶予期間であることに注意してください。
有効にする方法:
echo 1 > /sys/module/rcutree/parameters/rcu_normal_wake_from_gp、またはブートパラメーター "rcutree.rcu_normal_wake_from_gp=1" を渡します。
デフォルトは 0 です。
削除されたカーネルパラメーター
clocksource.max_cswd_read_retries=
[KNL]
クロックが不安定とマークされるまでの外部遅延による clocksource_watchdog() の再試行回数。デフォルトは 2 回の再試行です。つまり、テスト対象のクロックの読み取りが 3 回試行されます。
disable_cpu_apicid=
[X86,APIC,SMP]
形式: <int>
起動時に無効化される対応する CPU の最初の APIC ID の数。主に、kdump 2nd カーネルで、AP から BSP への送信が原因でシステムのリセットやハングを発生させずに BSP が複数の CPU のウェイクアップを無効にするために使用されます。
カーネルパラメーターの変更
amd_iommu=
[HW,X86_64]
システム内の AMD IOMMU ドライバーにパラメーターを渡します。
以下の値が使用できます。
fullflush
- 非推奨。iommu.strict=1 と同等です。
off
- システム内で見つかった AMD IOMMU を初期化しないでください。
force_isolation
- すべてのデバイスのデバイス分離を強制します。IOMMU ドライバーは、必要に応じて分離要件を解除できなくなりました。このオプションは iommu=pt をオーバーライドしません。
force_enable
- IOMMU を有効にするとバグが発生することがわかっているプラットフォームで、IOMMU を強制的に有効にします。このオプションは注意して使用してください。
pgtbl_v1
- DMA-API (デフォルト) には v1 ページテーブルを使用します。
pgtbl_v2
- DMA-API には v2 ページテーブルを使用します。
irtcachedis
- 割り込み再マッピングテーブル (IRT) キャッシュを無効にします。
nohugepages
- v1 ページテーブルのページサイズを 4 KiB に制限します。
v2_pgsizes_only
- v1 ページテーブルに使用されるページサイズを 4 KiB、2 Mib、または 1 GiB に制限します。
debug_guardpage_minorder=
[KNL]
CONFIG_DEBUG_PAGEALLOC が設定されている場合、このパラメーターにより、buddy allocator によって意図的に空き状態に保持される (そして、その結果として保護される) ページの指数 (order) を制御できます。値を大きくすると、ランダムなメモリー破損を検出する可能性が高くなりますが、通常のシステム用のメモリー容量が減少します。可能な最大値は MAX_PAGE_ORDER/2 です。このパラメーターを 1 または 2 に設定すると、CPU がランダムなメモリー位置に書き込む (またはそこから読み取る) ときにカーネルまたはドライバーコードのバグによって発生するランダムなメモリー破損の問題のほとんどを特定できます。ただし、一部のメモリー破壊の問題は、バグのあるハードウェアやファームウェア、またはドライバーによる不適切な DMA プログラミング (メモリーがバスレベルで書き込まれ、CPU の MMU がバイパスされる場合) によって引き起こされます。この問題は CONFIG_DEBUG_PAGEALLOC では検出できないため、このオプションは問題の追跡には役立ちません。
page_reporting.page_reporting_order=
[KNL]
最小のページレポート指数。
形式: <integer>
最小のページレポート指数を調整します。この値が MAX_PAGE_ORDER を超えると、ページレポートが無効になります。
preempt=
[KNL]
CONFIG_PREEMPT_DYNAMIC が有効な場合、プリエンプションモードを選択します。none: cond_resched() 呼び出しに限定。voluntary: cond_resched() および might_sleep() 呼び出しに限定。full: 明示的にプリエンプションが無効化されていない任意のセクションで、いつでもプリエンプションが可能。タスクは、競合しているスピンロックを保持します (そのクリティカルセクションがロック自体を超えて明示的にプリエンプションが無効化されていない限り)。
sched_thermal_decay_shift=
[非推奨] [KNL, SMP]
スケジューラーのサーマルプレッシャーシグナルに対して減衰シフトを設定します。サーマルプレッシャーシグナルは、他のスケジューラーの pelt のデフォルトの減衰期間に従います。
usb-storage.delay_use=
[UMS]
新しいデバイスが論理ユニットに対してスキャンされるまでの遅延 (秒単位)。デフォルトは 1 です。必要に応じて、値に "ms" の接尾辞がある場合の遅延 (ミリ秒単位)。例: delay_use=2567ms.
新しい sysctl パラメーター
skb_defer_max
skb を割り当てた CPU によって解放される、CPU ごとの skb リストの最大サイズ (単位: skb)。これまでのところ、TCP スタックによって使用されています。
デフォルト: 64
変更された sysctl パラメーター
overcommit_memory
この値には、メモリーのオーバーコミットを有効にするフラグが含まれます。
このフラグが 0 の場合、カーネルはユーザー空間からのメモリー要求サイズを、合計メモリーとスワップの合計と比較し、明らかなオーバーコミットを拒否します。
このフラグが 1 の場合、カーネルは実際にメモリーが不足するまでは常に十分なメモリーがあるかのように振る舞います。
このフラグが 2 の場合、カーネルは "never overcommit" ポリシーを使用し、あらゆるメモリーのオーバーコミットを防ごうとします。user_reserve_kbytes は、このポリシーに影響することに注意してください。
この機能は非常に便利です。malloc() によって大量のメモリーを "念のため" に確保しておきながら、そのほとんどを使用しないプログラムが多数あるからです。
デフォルト値は 0 です。
詳細は、Documentation/mm/overcommit-accounting.rst および mm/util.c::__vm_enough_memory() を参照してください。