nproc

Wyświetla liczbę dostępnych jednostek przetwarzających (rdzeni CPU).

nproc to malutkie narzędzie z pakietu GNU coreutils, które wypluwa jedną liczbę: ile jednostek przetwarzających (rdzeni/wątków CPU) jest dostępnych dla bieżącego procesu. Brzmi banalnie, ale to ulubieniec skryptów: zamiast wpisywać na sztywno „użyj 8 wątków”, pytasz system, ile faktycznie ma do dyspozycji, i dynamicznie skalujesz make, kompilację, przetwarzanie obrazów czy kontener. Co ważne, domyślnie nproc pokazuje liczbę dostępnych rdzeni — z uwzględnieniem maski przypięcia CPU (affinity) i limitów cgroups — a nie wszystkich zainstalowanych. To często myli ludzi w kontenerach.

Składnia i najważniejsze opcje

Podstawowe wywołanie to po prostu nproc [opcje] — bez argumentów dostajesz gołą liczbę.

  • --all — pokazuje liczbę zainstalowanych procesorów, ignorując maskę affinity, cgroups i zmienne OpenMP. Przydatne, gdy chcesz znać „fizyczne” możliwości maszyny, a nie limit procesu.
  • --ignore=N — odejmuje N jednostek od wyniku (np. żeby zostawić rdzeń dla systemu). Wynik nigdy nie spadnie poniżej 1.
  • --help — krótka pomoc i lista opcji.
  • --version — wersja narzędzia (czyli wersja coreutils).

Dodatkowo wynik bywa modyfikowany przez zmienne środowiskowe OpenMP: OMP_NUM_THREADS ustawia wartość zwracaną, a OMP_THREAD_LIMIT jej górny limit.

Przykłady użycia

  • nproc — wypisuje liczbę rdzeni dostępnych dla procesu, np. 8. Najczęstsze użycie.
  • nproc --all — pokazuje wszystkie zainstalowane rdzenie, nawet jeśli proces ma przypisaną tylko część.
  • make -j"$(nproc)" — kompiluje, używając tylu zadań równoległych, ile masz rdzeni. Klasyk przyspieszający budowanie.
  • make -j"$(nproc --ignore=2)" — to samo, ale zostawia 2 rdzenie wolne, żeby pecet nie zamarł podczas kompilacji.
  • taskset -c 0,1 nproc — ograniczasz proces do rdzeni 0 i 1, a nproc grzecznie zwróci 2, pokazując efekt maski affinity.

Częste błędy i pułapki

Największa pułapka to kontenery (Docker, Kubernetes). Jeśli ograniczysz kontenerowi CPU przez cgroups, nproc może i tak zwrócić liczbę wszystkich rdzeni hosta (zależnie od wersji coreutils i sposobu limitowania), przez co make -j"$(nproc)" odpali kilkadziesiąt wątków na limicie 2 rdzeni — i wszystko się zatka. W takich miejscach weryfikuj realny limit, np. odczytując pliki cgroup.

Drugi mit: nproc liczy wątki logiczne, a nie fizyczne rdzenie. Z Hyper-Threadingiem 4-rdzeniowy CPU pokaże 8. To nie błąd — po prostu pamiętaj o różnicy. Jeśli potrzebujesz topologii fizycznej, sięgnij po lscpu. I drobiazg: nproc to coreutils, więc na BSD/macOS go nie ma — tam użyj sysctl -n hw.ncpu.

Powiązane komendy: lscpu, /proc/cpuinfo (cat), getconf _NPROCESSORS_ONLN, taskset, sysctl, htop, free.