GRUB 開機參數¶
設定 isolated cores、停用 C-state、預配 hugepages。修改後必須重開機。
Tapio 保留 1 顆 CPU(範例為 CPU 3,BIOS 留 4 顆 active 後的最後一核)作為 NetThread 專用運算核心,完全與 OS 排程隔離;CalcThread 不再隔離,與 OS / helper threads 共用其餘核心。本章所有設定均以此為前提;若 active 核心數不同,請參照末節說明調整編號。
完整 cmdline¶
audit=0 mce=ignore_ce tsc=reliable idle=poll \
processor.max_cstate=0 intel_pstate=disable intel_idle.max_cstate=0 \
pcie_aspm.policy=performance cpuidle.off=1 cpufreq.off=1 \
mitigations=off nosoftlockup \
isolcpus=managed_irq,domain,3 nohz_full=3 rcu_nocbs=3 \
hugepagesz=2M hugepages=256
參數對照¶
| 參數 | 用途 |
|---|---|
audit=0 |
停用 audit 子系統的開銷 |
mce=ignore_ce |
忽略可修正 machine check errors(避免中斷雜訊) |
tsc=reliable |
信任 TSC 作為 clocksource,跳過校正 |
idle=poll |
CPU 永不進入 C-state,以 busy-poll 取代 halt |
processor.max_cstate=0 |
禁止 processor C-state 轉換 |
intel_pstate=disable |
停用 intel_pstate driver,改用 acpi-cpufreq 手動控制 |
intel_idle.max_cstate=0 |
停用 intel_idle 深層休眠狀態 |
pcie_aspm.policy=performance |
停用 PCIe Active State Power Management |
cpuidle.off=1 |
完全停用 cpuidle framework |
cpufreq.off=1 |
停用頻率縮放 |
mitigations=off |
停用 Spectre/Meltdown 緩解以換取效能 |
nosoftlockup |
停用 soft lockup detector(避免隔離核心上誤警) |
isolcpus=managed_irq,domain,3 |
domain = scheduler 隔離;managed_irq = 排除該 CPU 不參與 kernel managed IRQ affinity 計算 |
nohz_full=3 |
隔離核心進入 tickless 模式(無 timer 中斷) |
rcu_nocbs=3 |
將 RCU callbacks offload 離開隔離核心 |
hugepagesz=2M hugepages=256 |
開機時預先保留 512MB hugepage 供程式使用 |
isolcpus 的兩個 flag
domain= scheduler 隔離(原本isolcpus=3的隱含語義)managed_irq= 排除該 CPU 不參與 multi-queue driver(NIC/megasas/nvme)的 managed IRQ affinity 計算
詳見 IRQ Affinity。
套用方式¶
必須用 grubby,不能只改設定檔
直接修改 /etc/default/grub 後執行 grub2-mkconfig 不會生效。
RHEL 9 必須用 grubby 才能實際寫入開機參數。
重開機後務必檢查 /proc/cmdline 確認參數真的存在。
# 1. 修改 /etc/default/grub(留作紀錄)
sudo vi /etc/default/grub
# 2. 用 grubby 實際寫入 BLS entries
sudo grubby --update-kernel=ALL --args="audit=0 mce=ignore_ce tsc=reliable idle=poll \
processor.max_cstate=0 intel_pstate=disable intel_idle.max_cstate=0 \
pcie_aspm.policy=performance cpuidle.off=1 cpufreq.off=1 \
mitigations=off nosoftlockup \
isolcpus=managed_irq,domain,3 nohz_full=3 rcu_nocbs=3 \
hugepagesz=2M hugepages=256"
# 3. 驗證(看每個 kernel 對應的 args)
sudo grubby --info=ALL
# 4. 重開機生效
sudo reboot
# 5. 重開機後驗證
cat /proc/cmdline
# 應該看到上面所有 args
CPU 編號的選擇¶
範例採用 BIOS 停用多餘核心、僅留 4 顆 active 的配置(active = CPU 0–3),3 是其中最後一顆,獨佔給 NetThread。BIOS 鎖核的目的是讓這顆 hot core 取得更高的 turbo bin。
若 BIOS 留下的 active 核心數不同,請取「最後一顆」做為隔離核:
- 4 active:isolate
3 - 6 active:isolate
5 - 8 active:isolate
7
Tapio.toml 必須對齊:
net_thread_cpu 必須完全等於 GRUB 的 isolcpus 隔離核,否則 NetThread 不會 pin 在 isolated core 上,效能會大幅退步。calc_thread_cpu 設為 -1(不綁定),讓 CalcThread 與 OS / helper threads 共用其餘核心,由 kernel scheduler 自行調度。
排錯¶
-
重開機後
/proc/cmdline沒看到參數 → 你只改了/etc/default/grub,沒跑grubby。回去用grubby --update-kernel=ALL --args=... -
isolcpus 設了但 CPU 3 上仍有 process 排程 → 看
/proc/<pid>/status的Cpus_allowed_list。Kernel thread 可能仍佔用,但 user-space 不會。 用top -p $(pgrep -d, .)觀察隔離核心應該空閒(0% util) -
hugepage 配置失敗 →
cat /proc/meminfo | grep -i huge看HugePages_Total。若 = 0,可能 memory fragmentation 過嚴重,需更早期(boot time)配置 — GRUB 比 sysctl 可靠