Préface:
Le problème avec les /proc/cpuinfo
réponses basées sur le fait qu'elles analysent les informations destinées à la consommation humaine et n'ont donc pas de format stable conçu pour l'analyse de la machine : le format de sortie peut différer d'une plate-forme à l'autre et de conditions d'exécution; l'utilisation lscpu -p
sur Linux (et sysctl
sur macOS) contourne ce problème .
getconf _NPROCESSORS_ONLN
/ getconf NPROCESSORS_ONLN
ne fait pas de distinction entre les processeurs logiques et physiques .
Voici un sh
extrait (compatible POSIX) qui fonctionne sur Linux et macOS pour déterminer le nombre de processeurs logiques ou physiques - en ligne - ; voir les commentaires pour plus de détails.
Utilise lscpu
pour Linux et sysctl
pour macOS.
Note terminologique : CPU désigne la plus petite unité de traitement vue par le système d'exploitation. Les cœurs non hyper-threading correspondent chacun à 1 CPU, tandis que les cœurs hyper-threading contiennent plus de 1 (généralement: 2) - logique - CPU.
Linux utilise la taxonomie suivante [1] , en commençant par la plus petite unité:
CPU < core < socket < book < node
avec chaque niveau comprenant 1 ou plusieurs instances du niveau inférieur suivant.
#!/bin/sh
# macOS: Use `sysctl -n hw.*cpu_max`, which returns the values of
# interest directly.
# CAVEAT: Using the "_max" key suffixes means that the *maximum*
# available number of CPUs is reported, whereas the
# current power-management mode could make *fewer* CPUs
# available; dropping the "_max" suffix would report the
# number of *currently* available ones; see [1] below.
#
# Linux: Parse output from `lscpu -p`, where each output line represents
# a distinct (logical) CPU.
# Note: Newer versions of `lscpu` support more flexible output
# formats, but we stick with the parseable legacy format
# generated by `-p` to support older distros, too.
# `-p` reports *online* CPUs only - i.e., on hot-pluggable
# systems, currently disabled (offline) CPUs are NOT
# reported.
# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
# Linux: Simply count the number of (non-comment) output lines from `lscpu -p`,
# which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] &&
sysctl -n hw.logicalcpu_max ||
lscpu -p | egrep -v '^#' | wc -l)
# Number of PHYSICAL CPUs (cores).
# Linux: The 2nd column contains the core ID, with each core ID having 1 or
# - in the case of hyperthreading - more logical CPUs.
# Counting the *unique* cores across lines tells us the
# number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] &&
sysctl -n hw.physicalcpu_max ||
lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)
# Print the values.
cat <<EOF
# of logical CPUs: $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF
[1] documentation macOSsysctl (3)
Notez que les systèmes dérivés de BSD autres que macOS - par exemple, FreeBSD - ne prennent en charge que la hw.ncpu
clé pour sysctl
, qui sont obsolètes sur macOS; Je ne suis pas clair sur lequel des nouvelles clés hw.npu
correspond à: hw.(logical|physical)cpu_[max]
.
Astuce du chapeau à @teambob pour aider à corriger la commande Physical-CPU-count lscpu
.
Attention : la lscpu -p
sortie n'inclut PAS de colonne "livre" (la man
page mentionne "livres" comme une entité entre socket et nœud dans la hiérarchie taxonomique). Si des "livres" sont en cours de lecture sur un système Linux donné ( est-ce que quelqu'un sait quand et comment? ), La commande physical-CPU-count peut sous- signaler (ceci est basé sur l'hypothèse que les lscpu
ID de rapports qui ne sont pas uniques sur des niveaux supérieurs entités de niveau ; par exemple: 2 cœurs différents de 2 sockets différents pourraient avoir le même ID).
Si vous enregistrez le code ci-dessus en tant que, par exemple, un script shellcpus
, le rendez exécutable avec chmod +x cpus
et le placez dans un dossier dans votre $PATH
, vous verrez une sortie telle que la suivante:
$ cpus
logical 4
physical 4
[1] Xaekai met en lumière ce qu'est un livre : "un livre est un module qui contient une carte de circuit imprimé avec des sockets CPU, des sockets RAM, des connexions IO le long du bord et un crochet pour l'intégration du système de refroidissement. Ils sont utilisés dans les mainframes IBM . Pour plus d'informations: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
cat
avantawk
, de toute façon: il suffitawk '<script>' /proc/cpuinfo
, comme ça:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. Et vous entrez sans "moins un".