684 Stimmen

Wie erhält man die Anzahl der CPUs/Kerne in Linux über die Befehlszeile?

Ich habe dieses Skript, aber ich weiß nicht, wie ich das letzte Element im Ausdruck erhalten kann:

cat /proc/cpuinfo | awk '/^processor/{print $3}'

Das letzte Element sollte die Anzahl der CPUs minus 1 sein.

15 Stimmen

Das müssen Sie nicht cat antes de awk trotzdem: einfach awk '<script>' /proc/cpuinfo und so weiter: awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo . Und du kommst ohne "minus eins" rein.

2 Stimmen

Um die Frage direkt zu beantworten, leiten Sie das nach tail -n 1 der die letzte Zeile übernimmt und ausgibt.

1 Stimmen

23voto

Fravadona Punkte 5192

Hier ist die Methode, die ich verwende, um die Anzahl der physischen Kerne zu zählen, die unter Linux online sind:

lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines

oder kurz gesagt:

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l

Beispiel (1 Steckdose):

> lscpu
...
CPU(s):                28
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             1
....
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14

Beispiel (2 Steckdosen):

> lscpu
...
CPU(s):                56
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             2
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28

Beispiel (4 Steckdosen):

> lscpu
...
CPU(s):                64
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32

18voto

ostrokach Punkte 14576

Sie können auch Python verwenden! um die Anzahl der physischen Kerne zu ermitteln:

$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4

Um die Anzahl der Hyperthreading-Kerne zu ermitteln:

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8

12voto

teambob Punkte 1880

Für die Gesamtzahl der physischen Kerne:

grep '^core id' /proc/cpuinfo |sort -u|wc -l

Auf Maschinen mit mehreren Sockeln (oder immer) multiplizieren Sie das obige Ergebnis mit der Anzahl der Sockel:

echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))

@mklement0 hat unten eine sehr schöne Antwort mit lscpu. Ich habe eine prägnantere Version in den Kommentaren geschrieben

10voto

Sergey Punkte 1484

Plattformübergreifende Lösung für Linux, MacOS, Windows:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")

10voto

mmu_man Punkte 99

Die Verwendung von getconf ist in der Tat der portabelste Weg, allerdings hat die Variable in BSD und Linux andere Namen als getconf, so dass man beide testen muss, wie dieser Gist vorschlägt: https://gist.github.com/jj1bdx/5746298 (enthält auch eine Solaris-Korrektur mit ksh)

Ich persönlich benutze:

$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1

Und wenn Sie dies in Python wollen, können Sie einfach den Syscall verwenden, den getconf verwendet, indem Sie das os-Modul importieren:

$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'

In Bezug auf nproc Es ist Teil der GNU Coreutils, also nicht standardmäßig in BSD verfügbar. Es verwendet sysconf() auch nach einigen anderen Methoden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X