Jak odkryć liczbę* logicznych * rdzeni w systemie Mac OS X?

Jak można stwierdzić, z linii poleceń, ile rdzeni jest na komputerze, gdy używasz Mac OS X? Na Linuksie używam:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
Nie jest idealny, ale jest blisko. Ma to na celu doprowadzenie do make, dlatego daje wynik o 1 wyższy od rzeczywistej liczby. I Wiem, że powyższy kod można pisać gęsto w Perlu lub można go pisać za pomocą grep, wc i cut, ale uznałem, że powyższy jest dobrą kompromitacją między zwięzłością a czytelność.

Bardzo późny EDIT: dla wyjaśnienia: pytam, ile rdzeni logicznych jest dostępnych, ponieważ odpowiada to liczbie jednoczesnych zadań, które chcę make Uruchomić. odpowiedź jkp, dopracowana przez Chrisa Lloyda, była dokładnie tym, czego potrzebowałem. YMMV.

Author: iconoclast, 2009-11-11

15 answers

Możesz to zrobić używając narzędzia sysctl:

sysctl -n hw.ncpu
 828
Author: jkp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-08 15:41:17

Jeszcze łatwiej:

sysctl -n hw.ncpu
 135
Author: mlbright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 07:15:47

To powinno być międzyplatformowe. Przynajmniej dla Linuksa i Mac OS X.

python -c 'import multiprocessing as mp; print(mp.cpu_count())'
Trochę wolno, ale działa.
 31
Author: Frozen Flame,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-25 11:12:38

Aby to zrobić w C, możesz użyć rodziny funkcji sysctl (3):

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

Ciekawe wartości do wykorzystania zamiast " hw.logicalcpu", który liczy rdzenie, to:

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.
 18
Author: alfwatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-13 01:07:25

system_profiler SPHardwareDataType pokazuje, że mam 1 procesor i 4 rdzenie.

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

[~] 

Jednak sysctl nie zgadza się:

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

Ale sysctl wydaje się poprawny, bo gdy uruchamiam program, który powinien zająć wszystkie sloty procesora, widzę, że ten program zajmuje blisko 800% czasu procesora (w top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
 14
Author: user1706991,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-02 17:59:36
$ system_profiler | grep 'Total Number Of Cores'
 10
Author: kent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-11 14:41:42

Użyj polecenia system_profiler | grep "Cores".

Mam:

[5] MacBook Pro Retina, Mid 2012.

Procesor: 2.6 GHz Intel Core i7

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

user$ sysctl -n hw.ncpu
8

Według Wikipedii, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) nie ma Core i7 z 8 fizycznymi rdzeniami, więc pomysł Hyperthreading musi być taki. Ignoruj sysctl i używaj wartości system_profiler dla dokładności. Prawdziwe pytanie brzmi, czy można wydajnie uruchamiać aplikacje z 4 rdzeniami (long compile jobs?) bez przerywania innych procesów.

Uruchomienie kompilatora równolegle z 4 rdzeniami nie wydaje się znacząco wpływać na zwykłe operacje systemu operacyjnego. Więc być może traktowanie go jako 8 Rdzeni nie jest takie złe.

 8
Author: NetworkN8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Jak powiedział jkp w komentarzu, to nie pokazuje rzeczywistej liczby fizycznych rdzeni. aby uzyskać liczbę fizycznych rdzeni, możesz użyć następującego polecenia:

system_profiler SPHardwareDataType
 7
Author: Tohid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-01 00:21:27

Nie zostało to określone w pierwotnym pytaniu (chociaż widziałem post OP w komentarzach, że nie jest to opcja), ale wielu programistów na macOS ma zainstalowanego menedżera pakietów Homebrew.

Dla przyszłych programistów, którzy natkną się na to pytanie, tak długo jak istnieje założenie (lub wymóg) instalacji Homebrew (np. w organizacji inżynierskiej w firmie), nproc jest jednym z powszechnych binariów GNU, które jest zawarte w pakiecie coreutils.

brew install coreutils

Jeśli masz skrypty, które wolisz napisać raz (dla Linuksa + macOS) zamiast dwa razy, lub aby uniknąć bloków if, w których musisz wykryć system operacyjny, aby wiedzieć, czy wywołać nproc vs sysctl -n hw.logicalcpu, to może być lepszą opcją.

 4
Author: Ryan Parman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-16 03:43:53

Poniższe polecenie daje Ci wszystkie informacje o Twoim procesorze

$ sysctl -a | sort | grep cpu
 3
Author: asmaier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 09:00:44

Wyjaśnienie

Kiedy zadano to pytanie, OP nie powiedział, że chce numer logiczne rdzenie zamiast rzeczywistej liczby rdzeni, więc ta odpowiedź logicznie (nie zamierzona gra słów) odpowiada sposobem uzyskania rzeczywistej liczby rzeczywistych fizycznych rdzeni, a nie liczby, którą system próbuje wirtualizować poprzez hyperthreading voodoo.

AKTUALIZACJA DO OBSŁUGI USTERKI W YOSEMITE

Ze względu na weird bug W OS X Yosemite (i ewentualnie nowszych wersjach, takich jak nadchodzący El Capitan), zrobiłem małą modyfikację. (Stara wersja nadal działała doskonale, jeśli po prostu zignorujesz STDERR, który jest wszystkim, co modyfikacja robi dla Ciebie.)


Każda inna odpowiedź tutaj

  1. podaje nieprawdziwe informacje
  2. nie podaje żadnych informacji, z powodu błędu w implementacji poleceń
  3. biegnie niewiarygodnie wolno (biorąc lepszą część a minute to complete), or
  4. daje zbyt dużo danych, a więc może być przydatny do interaktywnego użytku, ale jest bezużyteczny, jeśli chcesz użyć danych programowo (na przykład, jako wejście do polecenia, takiego jak bundle install --jobs 3, gdzie chcesz, aby liczba w miejsce 3 była o jeden mniejsza niż liczba rdzeni, które masz, lub przynajmniej nie więcej niż liczba rdzeni)
Sposób, aby uzyskać tylko liczbę rdzeni, niezawodnie, poprawnie, rozsądnie szybko i bez dodatkowych informacji lub nawet Dodatkowe znaki wokół odpowiedzi, jest to:
system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
 1
Author: iconoclast,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 21:46:53

Na MacBooku Pro z systemem Mavericks, sysctl -a | grep hw.cpu zwróci tylko kilka tajemniczych szczegółów. O wiele bardziej szczegółowe i dostępne informacje ujawniono w sekcji machdep.cpu, tj.:

sysctl -a | grep machdep.cpu

W szczególności, w przypadku procesorów z HyperThreading (HT), całkowita liczba procesorów (logical_per_package) będzie dwukrotnie większa niż liczba fizycznych rdzeni (cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
 1
Author: Karl Ehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-22 11:48:02

Komentarze do 2 dobrych odpowiedzi powyżej:

1) re zaakceptowana odpowiedź (i komentarze) jkp: hw.ncpu jest najwyraźniej przestarzały na rzecz hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) re aktualizacja 2014 przez Karla Ehr: na moim komputerze (z intel Core i7 2,5 ghz), sysctl -a | grep machdep.cpu | grep per_package zwraca różne liczby:

Machdep.cpu.logical_per_package: 16

Machdep.cpu.cores_per_package: 8

Pożądane wartości są:

Machdep.cpu.core_count: 4

Machdep.cpu.thread_count: 8

Które pasują:

Hw.physicalcpu: 4

Hw.logicalcpu: 8

 0
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 18:16:03

Można to zrobić w bardziej przenośny sposób:

$ nproc --all
32

Kompatybilny z macOS i Linux.

 0
Author: Jay Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-06 19:54:05

getconf działa zarówno w systemie Mac OS X, jak i Linux, na wszelki wypadek, gdybyś potrzebował kompatybilności z obydwoma systemami:

$ getconf _NPROCESSORS_ONLN
12
 0
Author: Pere Joan Martorell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-28 11:14:26