Bagaimana menemukan jumlah inti * logis * di Mac OS X?

382

Bagaimana Anda bisa tahu, dari baris perintah, berapa core yang ada di mesin ketika Anda menjalankan Mac OS X? Di Linux, saya menggunakan:

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

Itu tidak sempurna, tetapi dekat. Ini dimaksudkan untuk mendapatkan makan make, itulah sebabnya ia memberikan hasil 1 lebih tinggi dari jumlah sebenarnya. Dan saya tahu kode di atas dapat ditulis lebih padat di Perl atau dapat ditulis menggunakan grep, wc, dan cut, tapi saya memutuskan di atas adalah tradeoff yang baik antara keringkasan dan keterbacaan.

EDIT SANGAT TERLAMBAT: Hanya untuk memperjelas: Saya bertanya berapa banyak core logis yang tersedia, karena ini sesuai dengan berapa banyak pekerjaan simultan yang saya ingin makehasilkan. Jawaban jkp, yang kemudian disempurnakan oleh Chris Lloyd, adalah persis apa yang saya butuhkan. YMMV.

Mike DeSimone
sumber
Untuk linux, saya menghindari harus menambahkan satu dengan menggunakan:grep ^processor /proc/cpuinfo | wc -l
courtlandj
3
Lihat stackoverflow.com/questions/6481005/... Catat nprocperintahnya.
Mike DeSimone
maaf jika ini adalah pertanyaan noob tetapi ketika maksud Anda core logis maksud Anda core fisik? Bagaimana perbedaan istilah (atau tidak)? Hanya untuk memahami apa yang Anda minta lebih baik.
Charlie Parker
Tidak, maksud saya bukan inti fisik. Inti fisik adalah sekelompok transistor pada sebuah chip yang mengimplementasikan inti. Inti logis adalah sesuatu yang tampaknya menjadi inti untuk sistem operasi dan program pengguna. Dalam sejumlah besar kasus, ini adalah sama. Namun, teknologi Hyperthreading Intel (dan mungkin yang lain) membuat setiap inti fisik muncul sebagai dua inti logis.
Mike DeSimone

Jawaban:

797

Anda dapat melakukan ini menggunakan utilitas sysctl :

sysctl -n hw.ncpu
jkp
sumber
6
Pada pertengahan 2011 1.7GHz MacBook Air, perintah ini mengatakan 4. Namun, saya menduga itu benar-benar hanya memiliki 2 core, dan system_profiler SPHardwareDataType tampaknya setuju. Bisakah Anda menjelaskan perbedaannya?
Joshua Flanagan
13
@ JoshuaFlanagan berapa banyak core fisik yang dimiliki mesin dan chip apa itu? Jika itu adalah core i7 dengan 2 core fisik misalnya, ia akan ditampilkan sebagai 4 karena chip mendukung hyper-threading dan menampilkan dirinya ke OS seolah-olah memiliki 4 core yang dapat dialamatkan.
jkp
142
Jika Anda benar-benar peduli, coba sysctl hw.physicalcpuatau sysctl hw.logicalcpu, dan secara umum sysctl hwuntuk semua opsi.
Variabel Panjang Coder
23
Editor: Tolong jangan ubah jawaban bertahun-tahun setelah saya menerimanya.
Mike DeSimone
2
Tidak berfungsi pada Awal 2015 Mac yang menjalankan El Capitan. Saya mendapatkan "error:" hw.ncpu "adalah kunci yang tidak dikenal". Tidak ada entri terkait cpu di /etc/sysctl.conf juga. Jawaban Frozen Flame berhasil.
TheGT
130

Lebih mudah lagi:

sysctl -n hw.ncpu
mlbright
sumber
2
Jumlah yang dilaporkan oleh ini sebenarnya dua kali lipat jumlah core adalah prosesor Anda mendukung hyper-threading.
mikeazo
3
ini memberi saya 4, tetapi ketika saya menggunakan system_profiler SPHardwareDataTypeyang saya yakini `Model Identifier: MacBookPro9,2 Nama Prosesor: Intel Core i5 Kecepatan Prosesor: 2,5 GHz Jumlah Prosesor: 1 Total Jumlah Core: 2`
Ciasto piekarz
31

Ini harus lintas platform. Setidaknya untuk Linux dan Mac OS X.

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

Sedikit lambat tapi berhasil.

Api Beku
sumber
18

Untuk melakukan ini di C Anda dapat menggunakan keluarga sysctl (3) fungsi:

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

Nilai menarik untuk digunakan sebagai pengganti "hw.logicalcpu", yang menghitung inti, adalah:

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.
alfwatt
sumber
Mike, terima kasih atas hasil editnya, tidak menyadari bahwa oldplen adalah parameter masuk-keluar.
alfwatt
14

system_profiler SPHardwareDataType menunjukkan saya punya 1 prosesor dan 4 core.

[~] 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>

[~] 

Namun, sysctl tidak setuju:

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

Tetapi sysctl tampaknya benar, ketika ketika saya menjalankan sebuah program yang harus mengambil semua slot CPU, saya melihat program ini mengambil hampir 800% dari waktu CPU (dalam top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
pengguna1706991
sumber
3
Anda melihat Hyperthreading sedang bekerja. Ini memungkinkan setiap inti menangani dua utas eksekusi (tidak harus sama dengan utas OS, seperti pthreads). Akibatnya, MacOS memperlakukan setiap inti fisik sebagai dua inti logis.
Mike DeSimone
Halo @ MikeDeSimone dapatkah Anda menunjukkan kepada saya bagaimana cara memeriksa apakah hyper threading bekerja jika menggunakan CentOS?
Ciasto piekarz
@Ciastopiekarz Saya cukup yakin hyper threading adalah fitur dari arsitektur CPU (Intel) daripada sesuatu yang dilakukan oleh OS, saya pikir intinya adalah membuat OS berpikir itu memiliki cpu fisik: sx 2 core logis tanpa harus melakukan apa-apa khusus untuk mengaksesnya. Jadi jika CPU Anda adalah Intel (semua Mac datang dengan Intel) maka ya, Anda memiliki hyper threading. Namun, jika Anda menjalankan CentOS di PC, Anda mungkin memiliki prosesor AMD. Mereka tidak memiliki hyper threading tetapi karena mereka biasanya datang dengan core dua kali lebih banyak pada harga yang sama (atau lebih rendah) saya tidak yakin ada perbedaan praktis.
Erk
@Erk OS mengetahui perbedaannya, pada kenyataannya, ia mengetahui perbedaan antara CPU dan Cores serta beberapa utas yang berjalan pada fisik. sysctl hw.physicalcpuakan menunjukkan berapa banyak core cpu fisik yang tersedia untuk Anda, sysctl hw.logicalcpuakan menunjukkan berapa banyak CPU logis yang tersedia untuk Anda. OS seperti Windows / OSX / Linux melakukan semua pekerjaan membuatnya seolah-olah Anda memiliki beberapa CPU (terlepas dari apa jenisnya). Seperti linux OS memungkinkan Anda untuk mengkonfigurasi cpu, core, threading yang dapat digunakan.
Rahly
10
$ system_profiler | grep 'Total Number Of Cores'
kent
sumber
2
lebih cepat: $ system_profiler SPHardwareDataType | grep 'Total Jumlah Cores'
kent
6
lebih lambat meskipun jika Anda memasukkan waktu mengetik
High Performance Mark
2
Ada dalam skrip bash; waktu mengetik tidak relevan.
Mike DeSimone
3
tampak seolah-olah Apple telah mengubah format output. Perhatikan penggunaan huruf kapital: sebelumnya adalah 'Total Number Of Cores' sekarang ini adalah 'Total Number of Cores' ... entah itu atau saya salah ketik sebelumnya ... maaf tentang itu!
kent
3
Anda bisa menggunakangrep -i
Skylar Saveland
8

Gunakan system_profiler | grep "Cores"perintah.

Saya punya:

MacBook Pro Retina, Pertengahan 2012.

Prosesor: 2,6 GHz Intel Core i7

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

user$ sysctl -n hw.ncpu
8

Menurut Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) tidak ada Core i7 dengan 8 core fisik sehingga ide Hyperthreading harus menjadi kasusnya. Abaikan sysctldan gunakan system_profilernilai untuk akurasi. Pertanyaan sebenarnya adalah apakah Anda dapat menjalankan aplikasi dengan 4 core secara efisien (pekerjaan kompilasi panjang?) Tanpa mengganggu proses lain.

Menjalankan kompiler yang diparalelkan dengan 4 core tampaknya tidak secara dramatis mempengaruhi operasi OS biasa. Jadi mungkin memperlakukannya sebagai 8 core tidak terlalu buruk.

NetworkN8
sumber
1
Memunculkan sejumlah proses sama dengan jumlah inti logis (dua kali jumlah inti fisik dalam kasus HyperThreading, seperti yang Anda perhatikan) telah melakukan cukup baik bagi saya.
Mike DeSimone
7

Seperti yang dikatakan jkp dalam komentar, itu tidak menunjukkan jumlah sebenarnya dari inti fisik. untuk mendapatkan jumlah inti fisik Anda dapat menggunakan perintah berikut:

system_profiler SPHardwareDataType
Tohid
sumber
Tujuannya adalah untuk menentukan berapa banyak proses yang akan muncul make, jadi jawaban jkp (jumlah core logis) paling cocok.
Mike DeSimone
3

Perintah berikut memberi Anda semua informasi tentang CPU Anda

$ sysctl -a | sort | grep cpu
asmaier
sumber
Bagus, tapi tidak apa yang diminta.
Mike DeSimone
1

KLARIFIKASI

Ketika pertanyaan ini diajukan, OP tidak mengatakan bahwa dia menginginkan jumlah core LOGICAL daripada jumlah core yang sebenarnya , jadi jawaban ini secara logis (tidak ada pun intended) menjawab dengan cara untuk mendapatkan jumlah sebenarnya dari core fisik nyata, bukan nomor yang OS coba untuk virtualisasi melalui voodoo hyperthreading.

PEMBARUAN UNTUK MENANGANI Cacat DI YOSEMITE

Karena bug aneh di OS X Yosemite (dan mungkin versi yang lebih baru, seperti El Capitan yang akan datang), saya telah membuat modifikasi kecil. (Versi lama masih berfungsi dengan baik jika Anda mengabaikan STDERR, yang merupakan modifikasi bagi Anda.)


Setiap jawaban lain yang diberikan di sini juga

  1. memberikan informasi yang salah
  2. tidak memberikan informasi, karena kesalahan dalam implementasi perintah
  3. berjalan sangat lambat (mengambil bagian terbaik dari satu menit untuk menyelesaikan), atau
  4. memberikan terlalu banyak data, dan dengan demikian mungkin berguna untuk penggunaan interaktif, tetapi tidak berguna jika Anda ingin menggunakan data secara terprogram (misalnya, sebagai input ke perintah seperti di bundle install --jobs 3mana Anda ingin nomor di tempat 3menjadi satu kurang dari angka core yang Anda miliki, atau setidaknya tidak lebih dari jumlah core)

Cara mendapatkan jumlah inti, andal, benar, cukup cepat, dan tanpa informasi tambahan atau bahkan karakter tambahan di sekitar jawabannya, adalah ini:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
iconoclast
sumber
3
Saya hanya berlari sysctl -n hw.ncpudi Mac Pro dan tidak mengalami masalah itu.
Mike DeSimone
Saya jelas belum menguji pada semua jenis Mac, tetapi saya akan percaya Anda bahwa kadang - kadang akurat. Namun, sysctltidak memberikan hasil yang akurat pada mesin saya, dan orang lain telah melaporkan hal yang sama. Jika tidak bisa diandalkan untuk selalu memberikan hasil yang akurat, maka itu tidak dapat dianggap andal dan akurat.
iconoclast
Anda juga bisa menjelaskan perilaku keliru yang Anda lihat, dan platform apa yang Anda lihat, sehingga batasan sysctloperasi yang tepat lebih dikenal, seperti yang dilakukan pengguna1706991.
Mike DeSimone
Yang lain telah menyarankan bahwa ini disebabkan oleh hyper threading, jadi angka yang Anda lihat dengan sysctl adalah jumlah core yang coba disimulasikan oleh sistem, walaupun sebenarnya tidak memiliki banyak. Jika Anda ingin angka yang akurat, gunakan metode saya. Jika Anda ingin tahu berapa core yang dimiliki komputer, gunakan sysctl.
iconoclast
@iconoclast dalam pengujian ini saya menemukan bahwa 'Total Jumlah Cores' terlokalisasi. Jika OS X diatur ke apa pun selain bahasa Inggris, solusi Anda gagal. Akhirnya menggunakan:sysctl -n hw.physicalcpu_max
CO
1

Pada MacBook Pro yang menjalankan Maverick , sysctl -a | grep hw.cpuhanya akan mengembalikan beberapa detail samar. Informasi yang jauh lebih terperinci dan dapat diakses diungkapkan di machdep.cpubagian ini, yaitu:

sysctl -a | grep machdep.cpu

Khususnya, untuk prosesor dengan HyperThreading(HT), Anda akan melihat jumlah total CPU yang disebutkan ( logical_per_package) dua kali lipat dari jumlah inti fisik ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
Karl Ehr
sumber
Pada awal 2008 Mac Pro saya, itu memberi saya 4. Jumlah sebenarnya dari core adalah 8, karena memiliki dua chip CPU quad-core.
Mike DeSimone
sysctl machdep.cpu juga berfungsi alih-alih membaca semua informasi yang tidak perlu lainnya.
hsn
1

Itu tidak ditentukan dalam pertanyaan asli (walaupun saya melihat posting OP di komentar bahwa ini bukan pilihan), tetapi banyak pengembang di macOS memiliki manajer paket Homebrew diinstal.

Untuk pengembang masa depan yang menemukan pertanyaan ini, selama asumsi (atau persyaratan) Homebrew yang dipasang ada (misalnya, dalam organisasi rekayasa di perusahaan), nprocadalah salah satu binari GNU umum yang termasuk dalam coreutilspaket.

brew install coreutils

Jika Anda memiliki script yang Anda lebih memilih untuk menulis sekali (untuk Linux + MacOS) bukan dua kali, atau untuk menghindari ifblok mana Anda perlu untuk mendeteksi OS untuk mengetahui apakah atau tidak untuk memanggil nprocvs sysctl -n hw.logicalcpu, ini mungkin menjadi pilihan yang lebih baik.

Ryan Parman
sumber
0

Komentar untuk 2 balasan bagus di atas:

1) apakah balasan yang diterima (dan komentar) oleh jkp: hw.ncpu tampaknya sudah tidak digunakan lagi karena hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) saat pembaruan 2014 oleh Karl Ehr: di komputer saya (dengan 2,5 ghz intel core i7), sysctl -a | grep machdep.cpu | grep per_packagemengembalikan nomor yang berbeda:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Nilai yang diinginkan adalah:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Yang cocok:

hw.physicalcpu: 4

hw.logicalcpu: 8

Menandai
sumber
0

Ini dapat dilakukan dengan cara yang lebih portabel:

$ nproc --all
32

Kompatibel dengan macOS dan Linux.

Jay Taylor
sumber
2
nprocsepertinya tidak tersedia di macOS Mojave.
Mike DeSimone
Terima kasih telah memberi tahu saya, Mike. nprocadalah instalasi sepele melalui homebrew.
Jay Taylor
Sistem yang saya jalankan terputus dari internet, jadi homebrew tidak membantu. Tidak dapat menggunakan apa pun yang membutuhkan "situs keriting | sudo bash"
Mike DeSimone