risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come conoscere il numero di core di un sistema in Linux?

Volevo scoprire quanti core ha il mio sistema, quindi ho cercato la stessa domanda su Google. Ho ricevuto alcuni comandi come il comando lscpu. Quando ho provato questo comando, mi ha dato il seguente risultato:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1998.000
BogoMIPS:              5302.48
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              2048K
NUMA node0 CPU(s):     0-3

In particolare, questo output mostra:

  • CPU: 4
  • Core (s) per socket: 4
  • Famiglia CPU: 6

Quale di questi indica i core di un sistema Linux?

C'è qualche altro comando per dire il numero di core o sto assumendo che sia completamente sbagliato?

254
Mr ASquare

Devi guardare socket e core per socket. In questo caso hai 1 CPU fisica (socket) che ha 4 core (core per socket).

124
user1403360

Per ottenere un quadro completo è necessario esaminare il numero di thread per core, core per socket e socket . Se moltiplichi questi numeri otterrai il numero di CP sul tuo sistema.

CPU = Thread per core X core per socket X socket

Le CPU sono ciò che vedi quando esegui htop (non equivalgono alle CPU fisiche).

Ecco un esempio da una macchina desktop:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1

E un server:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2

L'output di nproc corrisponde al conteggio della CPU da lscpu. Per la macchina desktop sopra questa dovrebbe corrispondere alle 8 CPU riportate da lscpu:

$ nproc --all
8

L'output di /proc/cpuinfo Dovrebbe corrispondere a queste informazioni, ad esempio sul sistema desktop sopra possiamo vedere che ci sono 8 processori (CPU) e 4 core (ID core 0-3):

$ grep -E 'processor|core id' /proc/cpuinfo
processor   : 0
core id     : 0
processor   : 1
core id     : 0
processor   : 2
core id     : 1
processor   : 3
core id     : 1
processor   : 4
core id     : 2
processor   : 5
core id     : 2
processor   : 6
core id     : 3
processor   : 7
core id     : 3

Il cpu cores Riportato da /proc/cpuinfo Corrisponde alla Core(s) per socket riportata da lscpu. Per la macchina desktop sopra questa dovrebbe corrispondere ai 4 core per socket riportati da lscpu:

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

Per rispondere in modo specifico alla tua domanda dici quanti core hai moltiplicando il numero di core che hai per socket per il numero di socket che hai.

Core = Core per socket X Socket

Per i sistemi di esempio sopra il desktop ha 4 core:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4

Mentre il server ha 16:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16

Un'altra utile utility è dmidecode che genera informazioni per socket. Nel caso del sistema server sopra elencato ci aspettiamo di vedere 8 core per socket e 16 thread per socket:

$ Sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
    Socket Designation: CPU1
    Core Count: 8
    Thread Count: 16
    Socket Designation: CPU2
    Core Count: 8
    Thread Count: 16

Il comando lscpu ha una serie di opzioni utili che potresti provare, ad esempio:

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

Vedi man lscpu Per i dettagli.

In sintesi:

  • È necessario essere consapevoli di socket, core e thread
  • Devi stare attento al termine CPU in quanto significa cose diverse in contesti diversi
251
htaccess

È possibile ottenere queste informazioni tramite il comando nproc(1)

$ nproc --all
12

Non richiede i privilegi di root.

61
Anthony Ananich

Affinché la risposta non sia confusa, è necessario comprendere un paio di semplici concetti di architettura del computer:

  • Esegui processi ("programmi") sul tuo sistema linux. Ogni processo è costituito da uno o più thread
  • Ogni thread è una sequenza separata di istruzioni. Due thread possono essere eseguiti in parallelo.
  • Ogni istruzione viene dato a un CPU da eseguire. Una CPU ha una logica che capisce cosa significano i bit di un'istruzione e decide cosa farne.
  • Esistono diversi tipi di istruzioni. La logica decisionale all'interno di una CPU invierà le diverse istruzioni a diversi nità hardware. Ad esempio, le istruzioni aritmetiche sono effettivamente eseguite da un ALU (unità aritmetica/logica), mentre le istruzioni che caricano/memorizzano dalla memoria sono eseguite da una sorta di - nità di memoria.

  • Un core si riferisce a un set di hardware di esecuzione effettiva (ovvero ogni core ha un ALU, un'unità di memoria, ecc ...)

  • Puoi avere più CPU che condividono un core - questo si chiama hyperthreading.

    • L'idea: il thread A sta attualmente eseguendo l'aritmetica, mentre il thread B sta caricando qualcosa dalla memoria. Quando questo è vero, i thread A e B possono condividere in modo efficiente un singolo core senza intralciarsi a vicenda (A utilizza ALU, B utilizza l'unità di memoria). Certo, a volte entrambi i programmi vorranno l'ALU, quindi dovranno aspettarsi l'un l'altro ...
  • A socket è lo slot fisico sulla scheda madre in cui è inserito un chip. Questo chip ha un certo numero di core.

Esempi:

L'esempio del PO:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • un socket fisico, che contiene un chip con
  • 4 core fisici (pensa a 4 ALU e 4 unità di memoria totali)
  • Solo 1 thread può impartire istruzioni a un core (senza hyperthreading), il che significa che esiste
  • una CPU per core o 4 * 1 = 4 CPU

Un altro esempio:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

Due socket fisici, ciascuno contenente un chip con 4 core fisici, per un totale di 8 core. Due thread arrivano a impartire istruzioni a ciascun core (questa macchina ha hyperthreading), il che significa che ci devono essere due CPU collegate a ciascun core, per un totale di 8 * 2 = 16 CPU

La prima macchina può eseguire esattamente quattro istruzioni in qualsiasi momento, periodo. La seconda macchina può eseguire tra 8 e 16 istruzioni in qualsiasi momento: 16 saranno raggiunte solo quando ciascuna coppia di CPU sta eseguendo diversi tipi di istruzioni e quindi può condividere un core senza aspettare.

23
stochastic

Puoi anche usare il comando cat /proc/cpuinfo che genererà un blocco di dati per ciascun core. Ogni pezzo inizia con queste informazioni:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)

I core sono numerati a partire da 0, quindi se l'ultimo pezzo dice processor : 3 come in questo caso, la tua macchina ha 4 core.

14
dr01
getconf _NPROCESSORS_ONLN

(getconf fa parte di glibc)

7
L.R.
$ grep -c processor /proc/cpuinfo
8

Questo è tutto ciò di cui hai bisogno. È il numero di core online, indipendentemente dal fatto che l'hyperthreading sia attivo o meno.

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

Un altro modo semplice.

4
jwc
[[email protected] ~]#  dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
    Socket Designation: CPU1
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
    Socket Designation: CPU2
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
4
reli

Ho trovato in questo modo:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
1
Serge Roussak

Voglio solo aggiungere alcune informazioni alla risposta di @htaccess.

In CentOS 6.x, dmidecode non genera informazioni sul conteggio Core/Thread e in realtà considera "CPU" come "CPU" o "Core" in lscpu, non "socket".

0
PickBoy