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


231

Volevo scoprire quanti core ha il mio sistema, quindi ho cercato la stessa domanda su Google. Ho ricevuto alcuni comandi come il lscpucomando. 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?


1
il mio semplice comando per tutti gli utenti: $ grep precessor / proc / cpuinfo | wc -l
สมหวัง แนวหน้า

6
L'immagine del testo non è molto utile . Non può essere copiato in un editor e non indicizza molto bene, il che significa che altri utenti con lo stesso problema hanno meno probabilità di trovare la risposta qui. Si prega di modificare il tuo post per incorporare il testo pertinente direttamente (preferibilmente utilizzando la copia + incolla per evitare errori di trascrizione).
Toby Speight,

Risposte:


117

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


1
Ho un socket, due cpus per socket, quindi ciò significherebbe un totale di 2. Tuttavia, dice 4 cpus. Se provo nprocottengo 4 indietro. Usando cat /proc/cpuinfoottengo 4, e quindi questa risposta sembra sbagliata, almeno per la mia situazione.
SPRBRN,

14
Non se hai hyper threading. Hai ancora 2 core fisici ma ogni core mostra due volte in / proc / cpuinfo. Se guardi attentamente sotto coreid puoi vedere che ogni coreid è elencato due volte. Anche sotto le bandiere puoi vedere la bandiera ht.
user1403360

237

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 CPU sul tuo sistema.

CPU = Thread per core X core per socket X socket

Le CPU sono ciò che vedi quando corri 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 nproccorrisponde al conteggio della CPU da lscpu. Per la macchina desktop sopra questa dovrebbe corrispondere alle 8 CPU segnalate da lscpu:

$ nproc --all
8

L'output di /proc/cpuinfodovrebbe 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 coressegnalato da /proc/cpuinfocorrisponde al Core(s) per socketsegnalato 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 è dmidecodequali output per informazioni sui 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 lscpucomando ha una serie di opzioni utili che che hanno la possibilità di controllare, ad esempio:

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

Vedi man lscpuper 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

12
Questa dovrebbe essere la risposta accettata
gansub,

2
Sono d'accordo. Questa dovrebbe essere la risposta accettata in quanto spiega meglio l'argomento.
Rafael,

Penso che aggiungere lscpu --all --extendedsarebbe un'aggiunta utile, ma non ho più accesso a queste macchine particolari.
htaccess

Puoi anche evitare awk e una moltiplicazione esplicita:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský

@Jakub Klinkovský, grazie per averlo sottolineato, ma in questo caso voglio davvero dimostrare la moltiplicazione di Socket(s) * Core(s) per socket. Dato quello che ho appena detto, credo che echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))sarebbe meglio in modo che le persone possano vedere esattamente ciò che si sta moltiplicando ...
htaccess

62

È possibile ottenere queste informazioni tramite nproc(1)comando

$ nproc --all
12

Non richiede i privilegi di root.


10
Questo non è corretto, l'output di nproc corrisponde al conteggio della CPU da lscpu. Se hai core multithread, l'output di nproc non corrisponderà al numero di core che hai.
htaccess,

2
Per una soluzione non root, un trucco sarebbe usare top e premere 1. Questo mostrerà il numero di core disponibili . Perché ho visto "disponibile" è perché l'hardware sottostante potrebbe avere più core come un cloud infra.
Hopping Bunny

@htaccess Almeno su Ubuntu, questo genera il numero corretto di CPU logiche online
Wil

1
@htaccess ok Ho capito. Di solito quando un duffer di Linux chiede quanti core significano quanti thread logici sono disponibili. Tecnicamente parlando, linux ha sbagliato a chiamare i thread hardware 'cpus'. La macchina dispone di 1 CPU con 2 core e 4 thread hardware SMT. C'è una grande quantità di ambiguità nel significato di CPU e core. Ma capisco cosa intendevi adesso, ty.
Wil

1
@Se lo chiamo nella mia risposta sopra: "Devi stare attento al termine CPU in quanto significa cose diverse in contesti diversi". Personalmente non equiparare i "core" alle unità di elaborazione logica ma ai core fisici nel processore (ovvero le unità di elaborazione fisica).
htaccess

19

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 è data a una 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 diverse unità hardware . Ad esempio, le istruzioni aritmetiche vengono effettivamente eseguite da una ALU (unità aritmetica / logica), mentre le istruzioni che caricano / memorizzano dalla memoria vengono eseguite da una sorta di unità 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, e quindi dovranno aspettarsi ...
  • Un 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 ogni coppia di CPU sta eseguendo diversi tipi di istruzioni e quindi può condividere un core senza aspettare.


14

È inoltre possibile utilizzare il comando cat /proc/cpuinfoche 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 : 3come in questo caso, la tua macchina ha 4 core.


Grazie a questo comando che descrive le informazioni in dettaglio. :)
Sig. ASquare,

Per un comando da una riga, puoi usaregrep -c ^processor /proc/cpuinfo
Wildcard il

5
getconf _NPROCESSORS_ONLN

(getconf fa parte di glibc)


1
È leggermente diverso (e utile per alcune esigenze). È il numero di processori che sono online ora (cioè disponibili per i processi in esecuzione). Potrebbe essere inferiore al numero totale di CPU se una o più CPU sono state messe offline (ad esempio durante l'ibernazione o durante l'aggiunta / rimozione di processori).
Toby Speight,

E getconf _NPROCESSORS_CONFti dà il numero di processori configurati. Puoi ottenere il valore di entrambe queste macro anche all'interno di un codice sorgente C, usando la sysconf()funzione. Digitare man sysconfper ulteriori informazioni.
Galaxy

4
[root@xxxxx ~]#  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

A cosa t 4serve dmidecode? Come si moltiplicano i conteggi e le linee abilitate? Il tuo esempio mostra 2 core, o 6, o 12, o 24 o qualche altro numero?
Xen2050

@ Xen2050 4è processor, vedi linux.die.net/man/8/dmidecode . Ma usare 4come argomento è una cattiva pratica.
JohnKoch,

bash: dmidecode: command not found
Cameron Hudson,

3
$ 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.


2
Questo è semplice, ma non sono sicuro che sia preciso alla domanda. Ha chiesto il numero di core: (core! = Cpus) se l'hyperthreading è abilitato. Il mio sistema ha 24 core: 48 cpus quando hyper-thread. Inoltre, l'utilizzo del secondo comando fornito ha ls -d /sys/devices/system/cpu/cpu* | wc -lmostrato 49 perché esiste una directory cpuidletra le cpuNdirectory.
Andrew Falanga,

0

Ho trovato in questo modo:

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

0

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".


Se questa non è la risposta, aggiungila come commento.
Ibrido

@Mongrel Volevo aggiungere come commento ma commentare richiede 50 reputazione
PickBoy

-2

La famiglia di CPU è irrilevante qui.

  • CPU (s) = socket fisici
  • Core (s) per socket - come dice
  • quindi numero totale di core = CPU (s) * Core (s) per socket

Nel tuo caso, hai un totale di 4 core completi.

Ciò che può anche essere importante, è "Discussione (i) per core". Ma ne hai 1, quindi non nel tuo caso.


1
Stai confondendo le CPU con i socket nella tua descrizione.
jlliagre,

1
Come dice jlliagre, questo non è corretto. Cores = Cores per socket X Sockets, vedi la descrizione nella mia risposta.
htaccess,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.