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.
15 answers
Możesz to zrobić używając narzędzia sysctl:
sysctl -n hw.ncpu
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
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.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.
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
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'
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.
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
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ą.
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
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
- podaje nieprawdziwe informacje
- nie podaje żadnych informacji, z powodu błędu w implementacji poleceń
- biegnie niewiarygodnie wolno (biorąc lepszą część a minute to complete), or
- 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 miejsce3
była o jeden mniejsza niż liczba rdzeni, które masz, lub przynajmniej nie więcej niż liczba rdzeni)
system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
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
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
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.
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
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