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

1voto

Totaly FuRy Punkte 11

Zählung der "core id" per "physical id"-Methode mit awk mit Rückgriff auf die "Prozessor"-Zählung, wenn die "core id" nicht verfügbar ist (wie bei der Himbeere)

echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }' /proc/cpuinfo)

1voto

Rachid K. Punkte 3069

Eine weitere Antwort unter den zahlreichen vorherigen. Es ist möglich, die cgroups zu verwenden, wenn sie verfügbar sind. Die cpuset Untersystem liefert die Liste der aktiven CPUs. Diese kann in der obersten cGruppe der Hierarchie in /sys/fs/cgroup . Zum Beispiel:

$ cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus
0-3

Dann wäre ein Parsing des letzteren notwendig, um die Anzahl der aktiven CPUs zu erhalten. Der Inhalt dieser Datei ist eine durch Kommata getrennte Liste von CPU-Sets.

Hier ist ein Beispiel mit tr um die Liste in einzelne Ausdrücke zu zerlegen und mit sed um die Intervalle in arithmetische Operationen zu übersetzen, die an expr :

#!/bin/sh

# For test purposes, the CPU sets are passed as parameters
#cpuset=`cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus`
cpuset=$1

ncpu=0
for e in `echo $cpuset | tr ',' ' '`
do
  case $e in

    # CPU interval ==> Make an arithmetic operation
    *-*) op=`echo $e | sed -E 's/([0-9]+)-([0-9]+)/\2 - \1 + 1/'`;;

    # Single CPU number
    *) op=1;;

  esac

  ncpu=`expr $ncpu + $op`

done

echo $ncpu

Hier sind einige Beispiele für Ausführungen mit verschiedenen Arten von CPU-Sets:

$ for cpuset in "0" "0,3" "0-3" "0-3,67" "0-3,67,70-75" "0,1-3,67,70-75"
> do
>   ncpu.sh $cpuset
> done
1
2
4
5
11
11

0voto

Lê Tư Thành Punkte 1033

Python 3 bietet auch einige einfache Möglichkeiten, sie zu erhalten:

$ python3 -c "import os; print(os.cpu_count());"

4

$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"

4

0voto

syed Punkte 1

Zusammenfassung: zu erhalten physikalische CPUs dies tun:

grep 'core id' /proc/cpuinfo | sort -u

zu erhalten physisch y logisch CPUs tun dies:

grep -c ^processor /proc/cpuinfo

/proc << Dies ist die goldene Quelle für alle Informationen, die Sie über Prozesse und

/proc/cpuinfo << ist die goldene Quelle für alle CPU-Informationen.

0voto

F. Hauri Punkte 57640

Schneller, ohne Gabel

Dies funktioniert mit fast allen Shell .

ncore=0
while read line ;do
    [ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
  done </proc/cpuinfo
echo $ncore
4

Um kompatibel zu bleiben mit Shell , Bindestrich , busybox und andere, habe ich verwendet ncore=$((ncore+1)) 代わりに ((ncore++)) .

bash Version

ncore=0
while read -a line ;do
    [ "$line" = "processor" ] && ((ncore++))
  done </proc/cpuinfo
echo $ncore
4

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