Linux'taki bir sistemin çekirdek sayısını nasıl öğrenebilirim?


231

Sistemimde kaç tane çekirdek olduğunu bulmak istedim, bu yüzden aynı soruyu Google'da aradım. lscpuKomut gibi bazı komutlar aldım . Bu komutu denediğimde bana şu sonucu verdi:

$ 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

Özellikle, bu çıktı şunları gösterir:

  • CPU (lar): 4
  • Soket başına çekirdek (ler): 4
  • CPU ailesi: 6

Bunlardan hangisi Linux sisteminin çekirdeğini gösterir?

Çekirdek sayısını söyleyecek başka bir komut var mı, yoksa bunun tamamen yanlış olduğunu varsayıyor muyum?


1
tüm kullanıcılar için basit komutum: $ grep precessor / proc / cpuinfo | wc -l
แ แนวหน้า

6
Metin resminiz çok yardımcı değil . Bir editöre kopyalanamaz ve çok iyi bir şekilde indekslenmez, yani aynı problemi olan diğer kullanıcıların cevabı burada bulması daha az olasıdır. Lütfen ilgili metni doğrudan dahil etmek için yazınızı düzenleyin (tercihen transkripsiyon hatalarını önlemek için kopyala + yapıştır kullanarak).
Toby Speight

Yanıtlar:


117

Soket başına soket ve çekirdeklere bakmak zorundasınız. Bu durumda 4 çekirdekli (soket başına çekirdek) 1 fiziksel işlemciniz (soket) vardır.


1
Bir soket, soket başına iki cpus var, bu da toplam 2 anlamına geliyor. Ancak, 4 cpus yazıyor. Eğer nprocdenersem 4 tane geri alırım. Kullanılması cat /proc/cpuinfoBen 4 almak ve böylece bu cevabı görünüyor en azından benim durum için, yanlıştır.
SPRBRN

14
Hiper iş parçacığınız varsa yok. Hala 2 fiziksel çekirdeğiniz var, ancak her bir çekirdek / proc / cpuinfo dosyasını iki kez gösteriyor. Coreid altına dikkatlice bakarsanız, her coreid'in iki kez listelendiğini görebilirsiniz. Ayrıca bayrakların altında ht bayrağını görebilirsiniz.
user1403360

237

Tam bir görüntü elde etmek için çekirdek başına iplik sayısına, soket başına çekirdek ve soket sayısına bakmanız gerekir . Bu sayıları çarparsanız , sisteminizde CPU sayısını elde edersiniz .

CPUs = Her çekirdek için çekirdek X soket başına X çekirdek

CPU'lar çalıştırdığınızda gördüğünüz şeydir htop(bunlar fiziksel CPU'lara eşit değildir).

İşte bir masaüstü bilgisayardan bir örnek:

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

Ve bir sunucu:

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

nprocCPU çıkışına karşılık gelen çıkış lscpu. Yukarıdaki masaüstü bilgisayar için bunun bildirdiği 8 CPU ile eşleşmesi gerekir lscpu:

$ nproc --all
8

Çıktısı /proc/cpuinfobu bilgiyle eşleşmelidir, örneğin yukarıdaki masaüstü sistemde 8 işlemci (CPU) ve 4 çekirdek (çekirdek kimliği 0-3) olduğunu görebiliriz:

$ 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

cpu coresTarafından rapor /proc/cpuinfoiçin karşılık gelir Core(s) per sockettarafından rapor lscpu. Yukarıdaki masaüstü bilgisayar için bunun lscpu tarafından bildirilen her soket için 4 Çekirdek (ler) ile eşleşmesi gerekir:

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

Sorunuza özel olarak cevap vermek için, soket başına sahip olduğunuz çekirdek sayısını, sahip olduğunuz soket sayısı ile çarparak kaç çekirdeğiniz olduğunu söylersiniz.

Çekirdek = Soket başına Çekirdek X Prizleri

Masaüstünün üstündeki örnek sistemler için 4 çekirdekli:

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

Sunucunun 16'sı varken:

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

Bir başka yararlı yardımcı program dmidecodesoket bilgisi başına çıktıdır. Yukarıda listelenen sunucu sistemlerinde soket başına 8 çekirdek ve soket başına 16 konu görmeyi bekliyoruz:

$ 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

lscpuKomut örneğin, kontrol etmek isteyebilirsiniz kullanışlı bir dizi seçenek vardır:

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

Detaylar man lscpuiçin bakınız.

Özetle:

  • Soket, çekirdek ve dişlerin farkında olmanız gerekir
  • Farklı bağlamlarda farklı şeyler ifade ettiği için CPU terimine dikkat etmeniz gerekir.

12
Bu kabul edilen cevap olmalı
gansub

2
Katılıyorum. Konuyu daha iyi açıklamak için bu kabul edilen cevap olmalıdır.
Rafael,

lscpu --all --extendedEklemenin yararlı bir ek olacağını düşünüyorum ama bu belirli makinelere artık erişemiyorum.
htaccess

Ayrıca awk ve açık bir çarpma lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
işleminden kaçınabilirsiniz

@ Jakub Klinkovský, bunu belirttiğiniz için teşekkür ederim, ancak bu durumda ben aslında çarpımını göstermek istiyorum Socket(s) * Core(s) per socket. Az önce söylediklerime göre echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') )), insanların tam olarak neyle çarpıldığını görebilmeleri için daha iyi olacağını tahmin ediyorum ...
htaccess

61

Bu bilgiyi nproc(1)komutla alabilirsiniz.

$ nproc --all
12

Kök ayrıcalıkları gerektirmez.


10
Bu yanlıştır, nproc çıktısı lscpu'dan gelen CPU sayısına karşılık gelir. Eğer çok iş parçacıklı çekirdekleriniz varsa, nproc çıktısı sahip olduğunuz çekirdek sayısı ile eşleşmeyecektir.
htaccess

2
Kök olmayan bir çözüm için, kesmek üst ve 1'i kullanmak olacaktır. Bu, mevcut çekirdek sayısını gösterecektir . Neden "kullanılabilir" olduğunu gördüm, çünkü altta yatan donanımın bir bulut altyapısı gibi daha fazla çekirdeğe sahip olabileceğinden.
Atlamalı Tavşan

@htaccess En azından Ubuntu'da bu, doğru sayıda çevrimiçi mantıksal CPU çıkışı verir
Wil

1
@htaccess tamam anladım. Genellikle bir linux duffer, kaç tane çekirdeğin mevcut mantık iş parçacığı anlamına geldiğini sorduğunda. Teknik olarak konuşursak, linux donanım iplikleri 'cpus' olarak adlandırmak yanlıştır. Makinenizde 2 çekirdek ve 4 SMT donanım ipliği olan 1 CPU vardır. Sonuç olarak CPU ve Çekirdeklerin ne anlama geldiği konusunda çok fazla belirsizlik var. Ama şimdi ne demek istediğini anlıyorum Ty.
Wil,

1
@ Evet, bunu yukarıdaki cevabımda söylerim: "Farklı bağlamlarda farklı şeyler ifade ettiği için CPU terimine dikkat etmeniz gerekir". Şahsen ben "çekirdeği" mantıksal işlem birimlerine değil, işlemcideki fiziksel çekirdeğe (yani fiziksel işlem birimlerine) eşitlemiyorum.
htaccess

19

Cevabın karışmaması için, birkaç basit bilgisayar mimarisi kavramını anlamanız gerekir:

  • Linux sisteminizde işlemleri ("programlar") çalıştırıyorsunuz . Her işlem bir veya daha fazla iş parçacığından oluşur
  • Her iplik ayrı bir talimat dizisidir . Paralel olarak iki diş açılabilir.
  • Her komut yürütülecek bir CPU'ya verilir . Bir CPU, bir talimatın bitlerinin ne anlama geldiğini belirleyen ve bununla ne yapacağına karar veren bir mantığı vardır.
  • Farklı talimat türleri vardır. Bir CPU içindeki karar mantığı, farklı talimatları farklı donanım birimlerine gönderir . Örneğin, aritmetik komutlar aslında bir ALU (aritmetik / mantık birimi) tarafından gerçekleştirilirken, bellekten yükleme / saklama komutları bir tür hafıza birimi tarafından yürütülür .

  • Bir çekirdek gerçek yürütme donanım kümesine değinmektedir (yani, her çekirdek bir ALU, bir bellek birimi, var vs ...)

  • Bir çekirdeği paylaşan birden fazla CPU'ya sahip olabilirsiniz - buna hiper-diş çekme denir.

    • Fikir: thread A şu anda aritmetik işlem yaparken, B thread bellekten bir şey yüklüyor. Bu doğru olduğunda, A ve B dişleri birbirlerinin yoluna girmeden tek bir çekirdeği verimli bir şekilde paylaşabilir (A, ALU'yu kullanır, B bellek birimini kullanır). Elbette, bazen her iki program da ALU’yu isteyecek ve daha sonra birbirlerini beklemeliler ...
  • Bir soket , anakart üzerindeki bir yonganın yerleştirildiği fiziksel yuvadır . Bu yonga üzerinde belirli sayıda çekirdek var.

Örnekler:

OP'nin örneği:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • bir yonga içeren bir fiziksel soket
  • 4 fiziksel çekirdek (toplam 4 ALU ve 4 bellek birimi düşünün)
  • Yalnızca 1 iş parçacığı bir çekirdeğe (hiper iş parçacığı yok) talimat verebilir.
  • çekirdek başına bir CPU veya 4 * 1 = 4 CPU

Başka bir örnek:

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

Her biri 4 fiziksel çekirdekli bir çip içeren ve toplam 8 çekirdekli iki fiziksel soket. İki iş parçacığı her bir çekirdeğe talimatlar verir (bu makine hiper iş parçacığına sahiptir), yani her çekirdeğe bağlı iki CPU olması gerekir, bu da toplam 8 * 2 = 16 CPU olur.

İlk makine, herhangi bir zamanda, tam olarak dört talimatı verebilir. İkinci makine, herhangi bir zamanda 8 ila 16 talimatı gerçekleştirebilir: 16, yalnızca her bir CPU çifti farklı talimatlar yürütürken elde edilir ve böylece bir çekirdeği beklemeden paylaşabilir.


14

cat /proc/cpuinfoHer bir çekirdek için bir yığın veri verecek komutu kullanabilirsiniz . Her yığın bu bilgiyle başlar:

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

Çekirdekler 0'dan başlayarak numaralandırılmıştır, bu nedenle son yığın processor : 3bu durumda olduğu gibi diyorsa , makinenizde 4 çekirdek bulunur.


Bilgiyi ayrıntılı olarak açıklayan bu komut için teşekkür
ederim

Tek linerli bir komut için kullanabilirsinizgrep -c ^processor /proc/cpuinfo
Wildcard

5
getconf _NPROCESSORS_ONLN

(getconf, glibc'nin bir parçasıdır)


1
Bu biraz farklıdır (ve bazı ihtiyaçlar için faydalıdır). Şu anda çevrimiçi olan işlemcilerin sayısıdır (yani çalışan işlemler için kullanılabilir). Bir veya daha fazla çevrimdışı duruma getirilmişse (örneğin, hazırda bekletme sırasında veya işlemci eklerken / çıkarırken), toplam CPU sayısından az olabilir.
Toby Speight

Ve getconf _NPROCESSORS_CONFsize yapılandırılan işlemci sayısını gösterir. Bu C makrosunun içindeki bu makroların her ikisinin de değerini, sysconf()işlevini kullanarak alabilirsiniz . Yazın man sysconfdaha fazla bilgi için.
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

Ne var t 4dmidecode için do? Sayımlar ve etkinleştirilmiş satırlar nasıl çarpılır? Örneğinizde 2 çekirdek veya 6 veya 12 veya 24 veya başka bir sayı var mı?
Xen2050

@ Xen2050 4olduğu processorbkz linux.die.net/man/8/dmidecode . Ancak 4argüman olarak kullanmak kötü bir uygulamadır.
JohnKoch

bash: dmidecode: command not found
Cameron Hudson,

3
$ grep -c processor /proc/cpuinfo
8

Tek ihtiyacın olan bu. Hyperthreading'in açık veya kapalı olmasına bakılmaksızın, çevrimiçi çekirdek sayısıdır.

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

Başka bir kolay yol.


2
Bu basit, ama sorunun doğru olduğundan emin değilim. Çekirdek sayısını istedi: (çekirdek! = Cpus) eğer hiper-diş etkinse. Sistemimin 24 çekirdeği var: hiper iş parçacığında 48 cpus. Ayrıca, verilen ikinci komutun kullanılması 49ls -d /sys/devices/system/cpu/cpu* | wc -l gösterdi, çünkü dizinler arasında bir dizin var . cpuidlecpuN
Andrew Falanga

0

Bu yolu buldum:

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

0

Sadece @htaccess'in cevabına biraz bilgi eklemek istiyorum.

CentOS 6.x'te dmidecode, Core / Thread sayısı bilgisini vermez ve aslında 'CPU'yu' soket 'değil, lscpu'da' CPU 'veya' Çekirdek 'olarak kabul eder.


Cevap bu değilse, yorum olarak ekleyin.
Mongrel

@Mongrel Yorum olarak eklemek istedim ancak yorum yapmak 50 itibar gerektiriyor
PickBoy

-2

CPU ailesi burada önemli değil.

  • CPU (lar) = fiziksel soketler
  • Soket başına çekirdek (ler) - dediği gibi
  • bu nedenle toplam çekirdek sayısı = CPU (lar) * Soket başına çekirdek (ler)

Senin durumunda, toplam 4 tam çekirdeğin var.

Ayrıca önemli olabilecek, "çekirdek başına iş parçacığı" dır. Ama 1'in var, yani senin durumunda değil.


1
İşlemci (ler) inizi açıklamada Soket (ler) ile karıştırıyorsunuz.
jlliagre

1
Jlliagre'ın dediği gibi bu yanlış. Cores = Cores per socket X Sockets, cevabımdaki açıklamaya bakınız.
htaccess

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.