Bagaimana cara mengetahui jumlah inti suatu sistem di Linux?

231

Saya ingin mengetahui berapa inti yang dimiliki sistem saya, jadi saya mencari pertanyaan yang sama di Google. Saya mendapat beberapa perintah seperti lscpuperintah. Ketika saya mencoba perintah ini, itu memberi saya hasil berikut:

$ 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

Secara khusus, output ini menunjukkan:

  • CPU: 4
  • Inti per soket: 4
  • Keluarga CPU: 6

Manakah dari mereka yang menunjukkan inti dari sistem Linux?

Apakah ada perintah lain untuk memberi tahu jumlah inti, atau apakah saya berasumsi bahwa itu sepenuhnya salah?

Tuan ASquare
sumber
1
perintah sederhana saya untuk semua pengguna: $ grep precessor / proc / cpuinfo | wc -l
สมหวัง แนวหน้า
6
Gambar teks Anda tidak terlalu membantu . Itu tidak dapat disalin ke editor, dan itu tidak mengindeks dengan sangat baik, yang berarti bahwa pengguna lain dengan masalah yang sama lebih kecil kemungkinannya untuk menemukan jawabannya di sini. Harap edit posting Anda untuk memasukkan teks yang relevan secara langsung (lebih disukai menggunakan copy + paste untuk menghindari kesalahan transkripsi).
Toby Speight

Jawaban:

117

Anda harus melihat soket dan inti per soket. Dalam hal ini Anda memiliki 1 CPU fisik (socket) yang memiliki 4 core (core per socket).

pengguna1403360
sumber
1
Saya punya satu soket, dua CPU per soket, sehingga itu berarti total 2. Namun, ia mengatakan 4 CPU. Jika saya mencoba, nprocsaya mendapatkan 4 kembali. Menggunakan cat /proc/cpuinfosaya mendapatkan 4, dan dengan demikian sepertinya jawaban ini salah, setidaknya untuk situasi saya.
SPRBRN
14
Tidak jika Anda memiliki hyper threading. Anda masih memiliki 2 inti fisik tetapi setiap inti ditampilkan di / proc / cpuinfo dua kali. Jika Anda melihat dengan hati-hati di bawah coreid Anda dapat melihat bahwa Anda memiliki masing-masing coreid terdaftar dua kali. Juga di bawah bendera Anda dapat melihat bendera ht.
user1403360
237

Untuk mendapatkan gambar yang lengkap, Anda perlu melihat jumlah utas per inti, inti per soket dan soket . Jika Anda mengalikan angka-angka ini, Anda akan mendapatkan jumlah CPU di sistem Anda.

CPUs = Threads per core X core per soket X socket

CPU adalah apa yang Anda lihat ketika Anda menjalankan htop(ini tidak sama dengan CPU fisik).

Ini adalah contoh dari mesin desktop:

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

Dan server:

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

Output nprocsesuai dengan jumlah CPU dari lscpu. Untuk mesin desktop di atas, ini harus sesuai dengan 8 CPU yang dilaporkan oleh lscpu:

$ nproc --all
8

Output dari /proc/cpuinfoharus sesuai dengan informasi ini, misalnya pada sistem desktop di atas kita dapat melihat ada 8 prosesor (CPU) dan 4 core (core id 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

The cpu coresdilaporkan oleh /proc/cpuinfoberkorespondensi ke Core(s) per socketdilansir lscpu. Untuk mesin desktop di atas, ini harus sesuai dengan 4 Core per socket yang dilaporkan oleh lscpu:

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

Untuk secara spesifik menjawab pertanyaan Anda, Anda memberi tahu berapa inti yang Anda miliki dengan mengalikan jumlah inti yang Anda miliki per soket dengan jumlah soket yang Anda miliki.

Core = Core per soket X Soket

Sebagai contoh sistem di atas desktop memiliki 4 core:

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

Sementara server memiliki 16:

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

Utilitas lain yang bermanfaat adalah dmidecodeyang mengeluarkan informasi per soket. Dalam hal sistem server yang tercantum di atas, kami mengharapkan untuk melihat 8 core per socket dan 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

The lscpuperintah memiliki sejumlah pilihan yang berguna yang Anda mungkin ingin memeriksa, misalnya:

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

Lihat man lscpudetailnya.

Singkatnya:

  • Anda harus mengetahui soket, inti dan benang
  • Anda harus berhati-hati dengan istilah CPU karena ini berarti hal yang berbeda dalam konteks yang berbeda
htaccess
sumber
12
Ini seharusnya jawaban yang diterima
gansub
2
Saya setuju. Ini harus menjadi jawaban yang diterima karena lebih baik menjelaskan subjek.
Rafael
Saya pikir menambahkan lscpu --all --extendedakan menjadi tambahan yang berguna tetapi saya tidak lagi memiliki akses ke mesin-mesin khusus ini.
htaccess
Anda juga dapat menghindari awk dan perkalian eksplisit:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský
@ Jakub Klinkovský, terima kasih telah menunjukkan itu, tetapi dalam hal ini saya ingin benar-benar menunjukkan penggandaan Socket(s) * Core(s) per socket. Mengingat apa yang baru saja saya katakan, saya kira echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))akan lebih baik sehingga orang dapat melihat dengan tepat apa yang sedang dikalikan ...
htaccess
62

Anda dapat memperoleh informasi ini dengan nproc(1)perintah

$ nproc --all
12

Itu tidak memerlukan hak root.

Anthony Ananich
sumber
10
Ini tidak benar, output dari nproc sesuai dengan jumlah CPU dari lscpu. Jika Anda memiliki core multithreaded maka output dari nproc tidak akan cocok dengan jumlah core yang Anda miliki.
htaccess
2
Untuk solusi non-root, peretasan akan menggunakan top dan tekan 1. Ini akan menunjukkan jumlah core yang tersedia . Mengapa saya melihat "tersedia" adalah karena perangkat keras yang mendasarinya mungkin memiliki lebih banyak inti seperti infra cloud.
Hopping Bunny
@htaccess Setidaknya di Ubuntu, ini menghasilkan jumlah yang benar dari CPU logis online
Wil
1
@ htaccess ok saya mengerti. Biasanya ketika duffer linux bertanya berapa core yang mereka maksud, berapa banyak thread logis yang tersedia. Secara teknis, linux salah untuk menyebut utas perangkat keras 'CPU'. Mesin Anda memiliki 1 CPU dengan 2 Cores dan 4 utas perangkat keras SMT. Ada sejumlah besar ambiguitas dalam arti CPU dan Cores sebagai hasilnya. Tapi aku mengerti maksudmu sekarang, ty.
Wil
1
@Apakah ya saya sebut ini dalam jawaban saya di atas: "Anda harus berhati-hati dengan istilah CPU karena ini berarti hal yang berbeda dalam konteks yang berbeda". Secara pribadi saya tidak menyamakan "core" dengan unit pemrosesan logis tetapi dengan core fisik dalam prosesor (yaitu unit pemrosesan fisik).
htaccess
19

Agar jawabannya tidak membingungkan, Anda perlu memahami beberapa konsep arsitektur komputer sederhana:

  • Anda menjalankan proses ("program") pada sistem linux Anda. Setiap proses terdiri dari satu atau lebih utas
  • Setiap utas merupakan urutan instruksi yang terpisah . Dua utas dapat dieksekusi secara paralel.
  • Setiap instruksi diberikan ke CPU untuk dieksekusi. CPU memiliki logika yang mengetahui arti bit-bit instruksi dan memutuskan apa yang harus dilakukan dengannya.
  • Ada berbagai jenis instruksi. Logika keputusan di dalam CPU akan mengirimkan instruksi yang berbeda ke unit perangkat keras yang berbeda . Sebagai contoh, instruksi aritmatika sebenarnya dilakukan oleh ALU (unit aritmatika / logika), sedangkan instruksi yang memuat / menyimpan dari memori dieksekusi oleh semacam unit memori .

  • Sebuah inti merujuk pada satu set perangkat keras eksekusi aktual (yaitu setiap inti memiliki ALU, unit memori, dll ...)

  • Anda dapat memiliki banyak CPU yang berbagi satu inti - ini disebut hyperthreading.

    • Idenya: utas A saat ini sedang melakukan aritmatika, sedangkan utas B sedang memuat sesuatu dari memori. Ketika itu benar, utas A dan B dapat secara efisien berbagi satu inti tanpa saling menghalangi (A menggunakan ALU, B menggunakan unit memori). Tentu saja, kadang-kadang kedua program menginginkan ALU, dan kemudian mereka harus menunggu satu sama lain ...
  • Sebuah socket adalah slot fisik pada motherboard di mana chip dimasukkan. Chip ini memiliki sejumlah inti di dalamnya.

Contoh:

Contoh OP:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • satu soket fisik, yang berisi chip dengan
  • 4 core fisik (pikirkan 4 ALU dan 4 unit memori total)
  • Hanya 1 utas yang dapat mengeluarkan instruksi ke inti (tidak ada hyperthreading), yang berarti ada
  • satu CPU per inti, atau 4 * 1 = 4 CPU

Contoh lain:

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

Dua soket fisik, masing-masing berisi chip dengan 4 inti fisik, membuat total 8 inti. Dua utas dapat mengeluarkan instruksi untuk masing-masing inti (mesin ini memiliki hiphreading), artinya harus ada dua CPU yang melekat pada masing-masing inti, sehingga total 8 * 2 = 16 CPU

Mesin pertama dapat mengeksekusi tepat empat instruksi pada waktu dan periode tertentu. Mesin kedua dapat menjalankan antara 8 dan 16 instruksi pada waktu tertentu: 16 akan dicapai hanya ketika setiap pasangan CPU menjalankan berbagai jenis instruksi dan dengan demikian dapat berbagi inti tanpa menunggu.

stokastik
sumber
14

Anda juga dapat menggunakan perintah cat /proc/cpuinfoyang akan menampilkan sepotong data untuk setiap inti. Setiap chunk dimulai dengan info ini:

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

Core diberi nomor mulai dari 0, jadi jika chunk terakhir mengatakan processor : 3seperti dalam kasus ini, mesin Anda memiliki 4 core.

dr01
sumber
Terima kasih perintah ini menjelaskan informasi secara terperinci. :)
Mr ASquare
Untuk perintah satu-liner, Anda dapat menggunakangrep -c ^processor /proc/cpuinfo
Wildcard
5
getconf _NPROCESSORS_ONLN

(getconf adalah bagian dari glibc)

LR
sumber
1
Itu sedikit berbeda (dan berguna untuk beberapa kebutuhan). Ini adalah jumlah prosesor yang sedang online sekarang (yaitu tersedia untuk menjalankan proses). Ini mungkin kurang dari jumlah total CPU jika satu atau lebih telah offline (misalnya selama hibernasi atau saat menambahkan / menghapus prosesor).
Toby Speight
Dan getconf _NPROCESSORS_CONFmembuat Anda jumlah prosesor yang dikonfigurasi. Anda bisa mendapatkan nilai dari kedua makro ini di dalam kode sumber C juga, dengan menggunakan sysconf()fungsinya. Ketikkan man sysconfuntuk informasi lebih lanjut.
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
reli
sumber
Apa yang t 4dilakukan untuk dmidecode? Bagaimana jumlah & garis yang diaktifkan berlipat ganda? Apakah contoh Anda menunjukkan 2 core, atau 6, atau 12, atau 24, atau nomor lain?
Xen2050
@ Xen2050 4adalah processor, lihat linux.die.net/man/8/dmidecode . Tetapi menggunakan 4sebagai argumen adalah praktik yang buruk.
JohnKoch
bash: dmidecode: command not found
Cameron Hudson
3
$ grep -c processor /proc/cpuinfo
8

Itu yang kamu butuhkan. Ini adalah jumlah inti online, terlepas dari apakah hyperthreading aktif atau tidak.

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

Cara mudah lainnya.

jwc
sumber
2
Ini sederhana, tapi saya tidak yakin itu akurat untuk pertanyaan itu. Dia meminta jumlah core: (core! = Cpus) jika hyperthreading diaktifkan. Sistem saya memiliki 24 core: 48 cpus saat hyper-threaded. Juga, menggunakan perintah kedua yang disediakan ls -d /sys/devices/system/cpu/cpu* | wc -lmenunjukkan 49 karena ada direktori di cpuidleantara cpuNdirektori.
Andrew Falanga
0

Saya menemukan cara ini:

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

Hanya ingin menambahkan beberapa info ke jawaban @htaccess.

Dalam CentOS 6.x, dmidecode tidak menampilkan informasi jumlah Core / Thread, dan sebenarnya menganggap 'CPU' sebagai 'CPU' atau 'Core' di lscpu, bukan 'socket'.

PickBoy
sumber
Jika ini bukan jawabannya, tambahkan ini sebagai komentar.
Mongrel
@Mongrel Saya ingin menambahkan sebagai komentar tetapi berkomentar membutuhkan 50 reputasi
PickBoy
-2

Keluarga CPU tidak relevan di sini.

  • CPU = soket fisik
  • Inti per soket - seperti yang tertulis
  • jadi jumlah total core = CPU * Core per socket

Dalam kasus Anda, Anda memiliki total 4 core penuh.

Yang juga penting, adalah "Utas per inti". Tapi Anda punya 1, jadi tidak dalam kasus Anda.

Tomasz Klim
sumber
1
Anda membingungkan CPU dengan Socket dalam deskripsi Anda.
jlliagre
1
Seperti yang dikatakan jlliagre, ini tidak benar. Cores = Cores per socket X Sockets, lihat deskripsi dalam respons saya.
htaccess
-3

Cara mudah untuk mengetahui jumlah CPU adalah dengan mengeluarkan perintah di bawah ini:

cat /proc/interrupts | egrep -i 'cpu'
Sousa Gaspar
sumber
1
Mengganggu, atau cpuinfo?
Jeff Schaller
Dan hitung dengan opsi -c?
Jeff Schaller