| 1 | boot.kernelParams = [ |
| 2 | "tsc=reliable" # Force TSC как основной clocksource |
| 3 | "nohz_full=2-$(nproc)" # Tickless kernel на всех CPU кроме 0,1 |
| 4 | "skew_tick=1" # Позволяет дрейф jiffies ±1ms |
| 5 | ]; |
| 6 | |
| 7 | |
| 8 | Нет, "nohz_full=2-$(nproc)" прямо так вставить нельзя — NixOS не интерполирует bash-выражения в строках kernelParams. |
| 9 | |
| 10 | Правильные варианты для NixOS |
| 11 | 1. Статическая строка (самый простой) |
| 12 | text |
| 13 | boot.kernelParams = [ |
| 14 | "nohz_full=2-7" # Для 8 ядер (0-7), исключая core0+1 |
| 15 | ]; |
| 16 | Как посчитать: nproc → 8 ядер = CPUs 0-7 → 2-7 |
| 17 | |
| 18 | 2. Динамически через lib (идеально) |
| 19 | text |
| 20 | { lib, ... }: |
| 21 | let |
| 22 | cpuCount = lib.trivial.length (builtins.genList (x: x) (lib.trivial.nproc or 8)); # Фикс для Nix eval |
| 23 | in { |
| 24 | boot.kernelParams = [ |
| 25 | "nohz_full=2-${toString (cpuCount - 1)}" |
| 26 | ]; |
| 27 | } |
| 28 | Результат: nohz_full=2-7 автоматически. |
| 29 | |
| 30 | 3. Для HyperThreading (Ryzen/Intel рекомендуют) |
| 31 | Исключайте пары core+HT-силблинг: |
| 32 | |
| 33 | text |
| 34 | # 8T/4C → исключаем CPU0+4 (первая пара) |
| 35 | nohz_full=1-3,5-7 |
| 36 | Проверить HT в htop: F2 → Columns → Processor → SMT |
| 37 | |
| 38 | Что делает nohz_full |
| 39 | text |
| 40 | CPU0,1 ← housekeeping (systemd, IRQ, timers) |
| 41 | CPU2-7 ← tickless (0Hz когда idle) → +5-15% perf в Rust/async workloads |
| 42 | Проверка после reboot: |
| 43 | |
| 44 | bash |
| 45 | cat /proc/cmdline # nohz_full=2-7 |
| 46 | dmesg | grep "NOHZ" # [NOHZ] Full dynticks CPUs: 2-7 |
| 47 | perf stat -e irq_vectors # Меньше векторов на isolated CPUs |
| 48 | Рекомендация для performance.nix |
| 49 | text |
| 50 | boot.kernelParams = [ |
| 51 | "nohz_full=2-${toString (lib.trivial.length (builtins.genList (x: x) 7))}" |
| 52 | "tsc=reliable" |
| 53 | "mitigations=off" # Уже обсуждали |
| 54 | ]; |
aquafire / kernel_params.txt
Last active 6 months ago