跳轉到

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 必須對齊

[system]
net_thread_cpu = 3
calc_thread_cpu = -1

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>/statusCpus_allowed_list。Kernel thread 可能仍佔用,但 user-space 不會。 用 top -p $(pgrep -d, .) 觀察隔離核心應該空閒(0% util)

  • hugepage 配置失敗cat /proc/meminfo | grep -i hugeHugePages_Total。若 = 0,可能 memory fragmentation 過嚴重,需更早期(boot time)配置 — GRUB 比 sysctl 可靠