Mac OS X'te * mantıksal * çekirdeklerin sayısı nasıl bulunur?


382

Mac OS X çalıştırırken komut satırından makinede kaç çekirdek olduğunu nasıl anlarsınız? Linux'ta şunu kullanıyorum:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)

Mükemmel değil, ama yakın. Bunun beslenmesi amaçlanmıştır make, bu nedenle gerçek sayıdan 1 daha yüksek bir sonuç verir. Ve yukarıdaki kodun Perl'de daha yoğun yazılabileceğini veya grep, wc ve cut kullanılarak yazılabileceğini biliyorum, ancak yukarıda kısaca özlü ve okunabilirlik arasında iyi bir ödünleşmeye karar verdim.

ÇOK GEÇ DÜZENLEME: Sadece açıklığa kavuşturmak için: Kaç tane mantıksal çekirdeğin mevcut olduğunu soruyorum , çünkü bu kaç tane eşzamanlı işin makeortaya çıkmasını istediğime karşılık geliyor. Chris Lloyd tarafından daha da rafine edilen jkp'nin yanıtı tam olarak ihtiyacım olan şeydi. YMMV.


Linux için, şunu kullanarak eklemek zorunda grep ^processor /proc/cpuinfo | wc -l
kalmıyorum


Bu bir çaylak sorusu ise özür dilerim ama mantıksal çekirdekler demek istediğinde fiziksel çekirdekler mi demek istiyorsun? Terimler nasıl farklı (ya da farklı)? Sadece daha iyi ne istediğini anlamak için.
Charlie Parker

Hayır, fiziksel çekirdekler demek istemiyorum. Fiziksel çekirdek, bir çekirdeği uygulayan bir yonga üzerindeki bir grup transistördür. Mantıksal çekirdek, işletim sisteminin ve kullanıcı programlarının çekirdeği gibi görünen bir şeydir. Çok sayıda durumda, bunlar aynıdır. Bununla birlikte, Intel'in Hyperthreading teknolojisi (ve belki de diğerleri), her fiziksel çekirdeğin iki mantıksal çekirdek olarak görünmesini sağlar.
Mike DeSimone

Yanıtlar:


797

Bunu sysctl yardımcı programını kullanarak yapabilirsiniz :

sysctl -n hw.ncpu

6
2011 ortalarında bir 1.7GHz MacBook Air'de, bu komut 4 diyor. Tutarsızlığı açıklayabilir misiniz?
Joshua Flanagan

13
@JoshuaFlanagan Makinede kaç tane fiziksel çekirdek var ve bu yonga nedir? Örneğin, 2 fiziksel çekirdeğe sahip bir çekirdek i7 ise, 4 olarak gösterilecektir, çünkü çip hiper iş parçacığı destekliyor ve kendisini 4 adreslenebilir çekirdeğe sahipmiş gibi işletim sistemine sunuyor.
jkp

142
Gerçekten önemsiyorsanız, sysctl hw.physicalcpuveya seçeneklerin tümünü sysctl hw.logicalcpugenel olarak deneyin sysctl hw.
Değişken Uzunluk Kodlayıcı

23
Editörler: Lütfen yanıtımı kabul ettikten yıllar sonra değiştirmeyin.
Mike DeSimone

2
El Capitan çalıştıran 2015'in başlarında Mac'te çalışmaz. "Hatayı alıyorum:" hw.ncpu "bilinmeyen bir anahtar". /Etc/sysctl.conf dosyasında cpu ile ilgili bir girdi de yoktur. Donmuş Alev'in cevabı işe yaradı.
TheGT

130

Daha da kolay:

sysctl -n hw.ncpu

2
Bu raporlanan sayı aslında çekirdek sayısı iki katıdır işlemcinizin hiper iş parçacığı destekliyor.
mikeazo

3
bu bana 4 veriyor, ancak system_profiler SPHardwareDataTypeinanabileceğim bir model kullandığımda `` Model Tanıtıcısı: MacBookPro9,2 İşlemci Adı: Intel Core i5 İşlemci Hızı: 2.5 GHz İşlemci Sayısı: 1 Toplam Çekirdek Sayısı: 2`
Ciasto piekarz

31

Bu çapraz platform olmalıdır. En azından Linux ve Mac OS X için.

python -c 'import multiprocessing as mp; print(mp.cpu_count())'

Biraz yavaş ama işe yarıyor.


18

Bunu C'de yapmak için sysctl (3) fonksiyon ailesini kullanabilirsiniz:

int count;
size_t count_len = sizeof(count);
sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0);
fprintf(stderr,"you have %i cpu cores", count);

Çekirdekleri sayan "hw.logicalcpu" yerine kullanılacak ilginç değerler şunlardır:

hw.physicalcpu - The number of physical processors available in the current power management mode.

hw.physicalcpu_max - The maximum number of physical processors that could be available this boot.

hw.logicalcpu - The number of logical processors available in the current power management mode.

hw.logicalcpu_max - The maximum number of logical processors that could be available this boot.

Mike, düzenleme için teşekkürler, oldplen'in bir giriş parametresi olduğunu fark etmedi.
alfwatt

14

system_profiler SPHardwareDataType 1 işlemci ve 4 çekirdeğim olduğunu gösteriyor.

[~] system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro9,1
      Processor Name: Intel Core i7
      Processor Speed: 2.6 GHz
      Number of Processors: 1
      Total Number of Cores: 4

      <snip>

[~] 

Ancak, sysctl aynı fikirde değil:

[~] sysctl -n hw.logicalcpu
8
[~] sysctl -n hw.physicalcpu
4
[~] 

Ancak sysctl doğru görünüyor, çünkü tüm CPU yuvalarını alması gereken bir program çalıştırdığımda, bu programın CPU zamanının% 800'üne yakın bir zaman aldığını görüyorum top:

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  

3
Hyperthreading'i iş yerinde görüyorsunuz. Bu, her çekirdeğin iki yürütme iş parçacığını (pthreads gibi işletim sistemi iş parçacığıyla aynı olması gerekmez) işlemesini sağlar. Sonuç olarak, MacOS her fiziksel çekirdeğe iki mantıksal çekirdek gibi davranır.
Mike DeSimone

Merhaba @MikeDeSimone bana CentOS durumunda hiper iş parçacığının iş yerinde olup olmadığını nasıl kontrol edeceğimizi gösterebilir misiniz?
Ciasto piekarz


@Ciastopiekarz Hiper iş parçacığının, işletim sisteminin yaptığı bir şeyden ziyade CPU mimarisinin (Intel) bir özelliği olduğundan eminim, tüm mesele işletim sisteminin fiziksel bir cpu olduğunu düşünmesini sağlamaktır: sx 2 mantıksal çekirdek herhangi bir şey yapmadan onlara erişmek için özel. Yani CPU'nuz bir Intel ise (tüm Mac'ler Intel ile birlikte gelir) evet, hiper iş parçacığına sahipsiniz. Ancak, CentOS'u bir PC'de çalıştırıyorsanız, bir AMD işlemciniz olabilir. Hiper iş parçacığı yoktur, ancak genellikle aynı (veya daha düşük) fiyata iki kat daha fazla çekirdek ile geldiklerinden pratik bir fark olduğundan emin değilim.
Erk

@Erk İşletim sistemi farkı bilir, aslında, CPU'lar ve Çekirdekler arasındaki farkı ve bir fiziksel üzerinde çalışan birden çok iş parçacığını bilir. sysctl hw.physicalcpusize kaç tane fiziksel işlemci çekirdeği olduğunu, sysctl hw.logicalcpukaç tane mantıksal cpus olduğunu gösterecektir. Windows / OSX / Linux gibi işletim sistemleri, birden fazla CPU'nuz var gibi görünmesini sağlamak için çalışır (ne tür olduğuna bakılmaksızın). İşletim sistemi linux gibi hangi cpu, çekirdekler, iş parçacığı kullanılabileceğini yapılandırmanıza izin verir.
Rahly

10
$ system_profiler | grep 'Total Number Of Cores'

2
daha hızlı: $ system_profiler SPHardwareDataType | grep 'Toplam Çekirdek Sayısı'
kent

6
Yazma süresini eklerseniz daha yavaş
High Performance Mark

2
Bir bash senaryosunda; yazma süresi önemsizdir.
Mike DeSimone

3
Apple çıktının biçimlendirmesini değiştirmiş gibi görünüyor. Büyük / küçük harflere dikkat edin: Daha önce 'Toplam Çekirdek Sayısı' idi, şimdi 'Toplam Çekirdek Sayısı' ... ya o ya da daha önce yanlış yazmıştım ... bunun için üzgünüm!
kent

3
kullanabilirsinizgrep -i
Skylar Saveland

8

system_profiler | grep "Cores"Komutu kullanın .

Bende:

MacBook Pro Retina, 2012 Ortası.

İşlemci: 2.6 GHz Intel Core i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

Wikipedia'ya göre, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) 8 fiziksel çekirdekli Core i7 yoktur, bu nedenle Hyperthreading fikri böyle olmalıdır. Doğruluk sysctliçin system_profilerdeğeri yok sayın ve kullanın . Asıl soru, diğer süreçleri kesintiye uğratmadan uygulamaları 4 çekirdekli (uzun derleme işleri?) Verimli bir şekilde çalıştırabilip çalıştıramayacağınızdır.

4 çekirdekli paralel bir derleyici çalıştırmanın, normal işletim sistemi işlemlerini önemli ölçüde etkilediği görülmemektedir. Bu yüzden belki de 8 çekirdek olarak davranmak o kadar da kötü değil.


1
Mantıksal çekirdeklerin sayısına eşit sayıda süreç ortaya çıkarmak (not ettiğiniz gibi HyperThreading durumunda fiziksel çekirdek sayısının iki katı) benim için oldukça iyi bir performans gösterdi.
Mike DeSimone

7

Jkp'nin bir yorumda söylediği gibi, bu gerçek fiziksel çekirdek sayısını göstermez. fiziksel çekirdek sayısını elde etmek için aşağıdaki komutu kullanabilirsiniz:

system_profiler SPHardwareDataType

Amaç kaç süreçle ortaya çıkacağını belirlemekti make, bu yüzden jkp'nin cevabı (mantıksal çekirdek sayısı) en iyi uyuyor.
Mike DeSimone

3

Aşağıdaki komut CPU'nuz hakkında tüm bilgileri verir

$ sysctl -a | sort | grep cpu

Güzel, ama ne istendi değil.
Mike DeSimone

1

AÇIKLAMA

Bu soru OP o sayısını istediğini söylemedi sorulduğunda MANTIKLI çekirdekleri yerine gerçek almak için bir yol, çekirdek sayısı mantıklı bu cevap yüzden (hayır cinas tasarlamak) cevaplarını gerçek , gerçek bir fiziksel çekirdek sayısını değil işletim sisteminin hiper iş parçacıklı vudu ile sanallaştırmaya çalıştığı sayı.

YOSEMİT'TE KOL YETİŞTİRME

OS X Yosemite'deki garip bir hata (ve muhtemelen yaklaşan El Capitan gibi daha yeni sürümler) nedeniyle küçük bir değişiklik yaptım. (STDERR'ı görmezden gelirseniz eski sürüm hala mükemmel bir şekilde çalıştı, bu da tüm değişikliklerin sizin için yaptığıdır.)


Burada verilen diğer cevaplar

  1. yanlış bilgi verir
  2. komut uygulamasındaki bir hata nedeniyle hiçbir bilgi vermez
  3. inanılmaz derecede yavaş çalışıyor ( tamamlamak için bir dakikanın daha iyi kısmını alıyor ) veya
  4. çok fazla veri verir ve bu nedenle etkileşimli kullanım için yararlı olabilir, ancak verileri programlı olarak kullanmak istiyorsanız işe yaramaz (örneğin, bundle install --jobs 3numaranın sayıdan 3daha az olmasını istediğiniz gibi bir komutun girişi olarak) sahip olduğunuz veya en azından çekirdek sayısından daha fazla olmayan)

Sadece çekirdek sayısını, güvenilir, doğru, makul bir şekilde hızlı ve ek bilgi veya hatta cevap etrafında fazladan karakter elde etmenin yolu şudur:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '

3
sysctl -n hw.ncpuMac Pro'umu çalıştırdım ve bu sorunların hiçbirine sahip değildim .
Mike DeSimone

Açıkçası tüm Mac türlerini test etmedim, ancak bazen doğru olduğunu düşünüyorum . Ancak, sysctlmakinemde doğru sonuçlar vermiyor ve diğerleri de aynı şeyi bildirdi. Her zaman doğru sonuçlar vermek için güvenilmezse, güvenilir ve doğru olarak kabul edilemez.
iconoclast

Ayrıca, gördüğünüz hatalı davranışı ve hangi platformlarda gördüğünüzü açıklayabilirsiniz, böylece sysctluser1706991 gibi düzgün çalışma sınırları daha iyi bilinir.
Mike DeSimone

Diğerleri bunun hiper iş parçacığından kaynaklandığını öne sürdüler, bu nedenle sysctl ile gördüğünüz sayı, aslında çok fazla olmasa da, sistemin simüle etmeye çalıştığı çekirdek sayısıdır. Doğru sayılar istiyorsanız, yöntemimi kullanın. Bilgisayarın kaç tane çekirdeğe sahip olduğunu bilmek istiyorsanız, sysctl kullanın.
iconoclast

@iconoclast bunu test ederken 'Toplam Çekirdek Sayısının' lokalize olduğunu gördüm. OS X İngilizce dışında herhangi bir değere ayarlanmışsa çözümünüz başarısız olur. Sona erdi:sysctl -n hw.physicalcpu_max
CO

1

Bir Açık MacBook Pro, çalışan Mavericks , sysctl -a | grep hw.cpusadece bazı şifreli ayrıntıları dönecektir. Çok daha ayrıntılı ve erişilebilir bilgi bu machdep.cpubölümde açıklanmaktadır, yani:

sysctl -a | grep machdep.cpu

Özellikle, HyperThreading(HT) işlemcili işlemciler için toplam numaralandırılmış CPU sayısını ( logical_per_package) fiziksel çekirdek sayısının ( cores_per_package) iki katı olarak görürsünüz .

sysctl -a | grep machdep.cpu  | grep per_package

2008'in başlarında Mac Pro'mda, bu bana 4 veriyor. Gerçek dört çekirdekli CPU çekirdeği olduğundan çekirdek sayısı 8'dir.
Mike DeSimone

sysctl machdep.cpu diğer tüm gereksiz bilgileri okumak yerine de çalışır.
HSN

1

Orijinal soruda belirtilmedi (her ne kadar bunun bir seçenek olmadığını yorumlarda OP yazısını gördüm), ancak macOS'ta birçok geliştiricinin Homebrew paket yöneticisi yüklü.

Bu soruya rastlayan gelecekteki geliştiriciler için, Homebrew'un kurulu olduğu varsayımı (veya gereksinimi) var olduğu sürece (örneğin, bir şirketteki bir mühendislik organizasyonunda), pakette nprocbulunan yaygın GNU ikili dosyalarından biridir coreutils.

brew install coreutils

Eğer yazma tercih edeceğini komut varsa (Linux + MacOS için) yerine iki kez veya önlemek için bir kez ifaramak olsun veya olmasın bilmek OS algılamak gerekir blokları nprocvs sysctl -n hw.logicalcpu, bu olabilir daha iyi bir seçenek.


0

Yukarıdaki 2 iyi yanıt için yorumlar:

1) jkp tarafından kabul edilen cevap (ve yorumlar): hw.ncpu, hw.logicalcpu lehine kaldırıldı ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) Karl Ehr tarafından 2014 güncellemesi: bilgisayarımda (2.5 ghz intel core i7 ile), sysctl -a | grep machdep.cpu | grep per_packagefarklı sayılar döndürür:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

İstenen değerler:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Hangi eşleşme:

hw.physicalcpu: 4

hw.logicalcpu: 8


0

Bu daha taşınabilir bir şekilde yapılabilir:

$ nproc --all
32

MacOS ve Linux ile uyumludur.


2
nprocmacOS Mojave'de mevcut görünmüyor.
Mike DeSimone

Bana bildirdiğiniz için teşekkürler, Mike. nprochomebrew aracılığıyla önemsiz bir kurulum.
Jay Taylor

Çalıştığım sistemin internet bağlantısı kesildi, bu yüzden homebrew yardımcı olmuyor. "
Kıvırmak
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.