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

381

Jak możesz stwierdzić w wierszu poleceń, ile rdzeni znajduje się na komputerze, gdy korzystasz z systemu Mac OS X? W systemie Linux używam:

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

To nie jest idealne, ale jest blisko. Ma to zostać nakarmione make, dlatego daje wynik o 1 wyższy niż rzeczywista liczba. Wiem, że powyższy kod może być napisany gęstszy w Perlu lub może być napisany przy pomocy grep, wc i cut, ale zdecydowałem, że powyższy kod jest dobrym kompromisem między zwięzłością a czytelnością.

BARDZO PÓŹNA EDYCJA: Tylko dla wyjaśnienia: pytam, ile rdzeni logicznych jest dostępnych, ponieważ odpowiada to liczbie jednoczesnych zadań, które chcę makeodrodzić. Odpowiedź jkp, dopracowana przez Chrisa Lloyda, była dokładnie tym , czego potrzebowałem. YMMV.

Mike DeSimone
źródło
W przypadku Linuksa grep ^processor /proc/cpuinfo | wc -l
unikam
3
Zobacz stackoverflow.com/questions/6481005/… Zanotuj nprocpolecenie.
Mike DeSimone
przepraszam, jeśli jest to pytanie nooba, ale kiedy masz na myśli rdzenie logiczne, masz na myśli rdzenie fizyczne? Czym różnią się warunki (lub nie)? Aby zrozumieć, o co prosisz lepiej.
Charlie Parker
Nie, nie mam na myśli fizycznych rdzeni. Rdzeń fizyczny to grupa tranzystorów w układzie scalonym, który implementuje rdzeń. Rdzeń logiczny to coś, co wydaje się być rdzeniem systemu operacyjnego i programów użytkownika. W ogromnej liczbie przypadków są one takie same. Jednak technologia Hyperthreading Intela (i być może inne) sprawia, że ​​każdy fizyczny rdzeń wygląda jak dwa logiczne rdzenie.
Mike DeSimone,

Odpowiedzi:

796

Możesz to zrobić za pomocą narzędzia sysctl :

sysctl -n hw.ncpu
jkp
źródło
6
Na MacBooku Air z połowy 2011 roku 1,7 GHz to polecenie mówi 4. Podejrzewałem jednak, że tak naprawdę ma tylko 2 rdzenie, a system_profiler SPHardwareDataType wydaje się zgadzać. Czy możesz wyjaśnić tę rozbieżność?
Joshua Flanagan
13
@JoshuaFlanagan, ile rdzeni fizycznych ma maszyna i jaki to układ? Jeśli jest to na przykład rdzeń i7 z 2 fizycznymi rdzeniami, wyświetli się jako 4, ponieważ układ obsługuje hiperwątkowość i przedstawia się w systemie operacyjnym, jakby miał 4 rdzenie adresowalne.
jkp
142
Jeśli naprawdę Cię to obchodzi, wypróbuj sysctl hw.physicalcpulub sysctl hw.logicalcpuogólnie sysctl hwwszystkie opcje.
Coder o zmiennej długości,
23
Redakcja: Proszę nie zmieniać odpowiedzi wiele lat po jej zaakceptowaniu.
Mike DeSimone
2
Nie działa na komputerach Mac z początkiem 2015 r. Z systemem El Capitan. Pojawia się „błąd:„ hw.ncpu ”to nieznany klucz”. W pliku /etc/sysctl.conf nie ma również wpisu dotyczącego procesora. Odpowiedź Frozen Flame zadziałała.
TheGT
130

Jeszcze łatwiej:

sysctl -n hw.ncpu
mlbright
źródło
2
Zgłoszona liczba jest w rzeczywistości dwukrotnie większa niż liczba rdzeni, o ile procesor obsługuje hiperwątkowość.
mikeazo
3
to daje mi 4, ale kiedy używam, w system_profiler SPHardwareDataTypeco mogę wierzyć `Identyfikator modelu: MacBookPro9,2 Nazwa procesora: Intel Core i5 Prędkość procesora: 2,5 GHz Liczba procesorów: 1 Całkowita liczba rdzeni:
2`
31

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

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

Trochę wolno, ale działa.

Frozen Flame
źródło
18

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);

Interesującymi wartościami do zastosowania zamiast „hw.logicalcpu”, które liczą rdzenie, są:

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
źródło
Mike, dzięki za edycję, nie zdawał sobie sprawy, że oldplen był parametrem wejściowym.
alfwatt
14

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, ponieważ kiedy uruchamiam program, który powinien zajmować wszystkie gniazda procesora, widzę, że ten program zajmuje prawie 800% czasu procesora (w top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
użytkownik1706991
źródło
3
W pracy widzisz Hyperthreading. Dzięki temu każdy rdzeń obsługuje dwa wątki wykonania (niekoniecznie takie same jak wątki systemu operacyjnego, takie jak pthreads). W rezultacie MacOS traktuje każdy rdzeń fizyczny jak dwa rdzenie logiczne.
Mike DeSimone
Witaj @ MikeDeSimone, czy możesz mi pokazać, jak sprawdzić, czy hiperwątkowość działa w przypadku CentOS?
Ciasto piekarz
@Ciastopiekarz Jestem dość pewien, że hiperwątkowanie jest cechą architektury procesora (Intel), a nie czymś, co robi system operacyjny. Myślę, że chodzi o to, aby system operacyjny sądził, że ma fizyczne rdzenie logiczne cpu: sx 2 bez konieczności robienia czegokolwiek specjalne, aby uzyskać do nich dostęp. Więc jeśli twój procesor to Intel (wszystkie komputery Mac są wyposażone w Intel), to tak, masz hiperwątkowość. Jeśli jednak uruchomisz CentOS na komputerze, możesz mieć procesor AMD. Nie mają hiperwątkowości, ale ponieważ zwykle mają dwa razy więcej rdzeni w tej samej (lub niższej) cenie, nie jestem pewien, czy istnieje praktyczna różnica.
Erk
@Erk System operacyjny zna różnicę, w rzeczywistości zna różnicę między procesorami i rdzeniami, a także wieloma wątkami działającymi fizycznie. sysctl hw.physicalcpupokaże, ile fizycznych rdzeni procesora jest dostępnych, sysctl hw.logicalcpupokaże, ile logicznych procesorów jest dostępnych. Systemy operacyjne, takie jak Windows / OSX / Linux, robią wszystko, aby wyglądało na to, że masz wiele procesorów (niezależnie od tego, jaki to jest typ). Linux jak OS umożliwia konfigurację, które jednostki centralne, rdzenie i wątki mogą być używane.
Rahly,
10
$ system_profiler | grep 'Total Number Of Cores'
Kent
źródło
2
szybciej: $ system_profiler SPHardwareDataType | grep „Całkowita liczba rdzeni”
kent
6
wolniej jednak, jeśli uwzględnisz czas pisania
High Performance Mark
2
Jest w skrypcie bash; czas pisania nie ma znaczenia.
Mike DeSimone
3
wygląda na to, że Apple zmieniło formatowanie wyjścia. Zwróć uwagę na wielkie litery: poprzednio była to „Całkowita liczba rdzeni”, teraz jest to „Całkowita liczba rdzeni” ... albo to, albo wcześniej źle to wpisałem ... przepraszam!
Kent
3
możesz użyćgrep -i
Skylar Saveland
8

Użyj system_profiler | grep "Cores"polecenia.

Mam:

MacBook Pro Retina, połowa 2012 r.

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 rdzeniami fizycznymi, więc pomysł Hyperthreading musi być obecny . Zignoruj sysctli użyj system_profilerwartości dla dokładności. Prawdziwe pytanie brzmi: czy możesz efektywnie uruchamiać aplikacje z 4 rdzeniami (długie zadania kompilacji?) Bez przerywania innych procesów.

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

Sieć N8
źródło
1
Spawnowanie pewnej liczby procesów równej liczbie rdzeni logicznych (dwukrotność liczby rdzeni fizycznych w przypadku HyperThreading, jak zauważasz) wypadło dla mnie całkiem dobrze.
Mike DeSimone
7

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

system_profiler SPHardwareDataType
Tohid
źródło
Celem było ustalenie make, z iloma procesami się odradzać, więc odpowiedź jkp (liczba rdzeni logicznych) najlepiej pasuje.
Mike DeSimone
3

Poniższe polecenie zawiera wszystkie informacje o procesorze

$ sysctl -a | sort | grep cpu
asmaier
źródło
Fajnie, ale nie o to pytano.
Mike DeSimone,
1

WYJAŚNIENIE

Kiedy zadano to pytanie, OP nie powiedział, że chce raczej liczby rdzeni LOGICZNYCH niż rzeczywistej liczby rdzeni, więc ta odpowiedź logicznie (bez zamierzonej gry słów) odpowiada w sposób umożliwiający uzyskanie rzeczywistej liczby rzeczywistych rdzeni fizycznych, a nie liczba, którą system operacyjny próbuje wirtualizować za pomocą voodoo hiperwątkowości.

AKTUALIZACJA USTERKI W YOSEMITE

Z powodu dziwnego błędu w systemie OS X Yosemite (i prawdopodobnie nowszych wersjach, takich jak nadchodzący El Capitan), wprowadziłem niewielką modyfikację. (Stara wersja nadal działała doskonale, jeśli po prostu zignorujesz STDERR, co jest wszystkim, co robi dla Ciebie modyfikacja).


Każda inna odpowiedź tutaj

  1. podaje nieprawidłowe informacje
  2. nie podaje żadnych informacji z powodu błędu w implementacji polecenia
  3. działa niewiarygodnie wolno (zajmuje to większą część minuty ), lub
  4. daje zbyt dużo danych, a zatem może być przydatny do użytku interaktywnego, ale jest bezużyteczny, jeśli chcesz korzystać z danych programowo (na przykład jako dane wejściowe do polecenia takiego jak miejsce, w bundle install --jobs 3którym liczba 3ma być o jeden mniejsza od liczby posiadanych rdzeni, a przynajmniej nie więcej niż ich liczba)

Sposób na uzyskanie tylko liczby rdzeni, niezawodnie, poprawnie, rozsądnie szybko i bez dodatkowych informacji lub nawet dodatkowych znaków wokół odpowiedzi, jest następujący:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
ikonoklasta
źródło
3
Właśnie uruchomiłem sysctl -n hw.ncpukomputer Mac Pro i nie miałem żadnych z tych problemów.
Mike DeSimone
Oczywiście nie testowałem na wszystkich typach komputerów Mac, ale uwierzę, że czasami jest to dokładne. Jednak sysctlnie daje dokładnych wyników na moim komputerze, a inni zgłosili to samo. Jeśli nie można polegać na tym, że zawsze daje dokładne wyniki, to nie może być uważane za wiarygodne i dokładne.
iconoclast
Możesz także wyjaśnić błędne zachowanie, które widzisz, i platformy, na których je widzisz, więc granice sysctlprawidłowego działania są lepiej znane, tak jak zrobił to użytkownik 17070991.
Mike DeSimone
Inni sugerują, że jest to spowodowane hiperwątkowością, więc liczba widoczna w sysctl to liczba rdzeni, które system próbuje symulować, nawet jeśli tak naprawdę nie ma ich tak wiele. Jeśli chcesz dokładnych liczb, skorzystaj z mojej metody. Jeśli chcesz wiedzieć, ile rdzeni komputer udaje, użyj sysctl.
iconoclast
@iconoclast w testowaniu tego stwierdziłem, że „całkowita liczba rdzeni” jest zlokalizowana. Jeśli OS X jest ustawiony na cokolwiek innego niż angielski, Twoje rozwiązanie zawiedzie. Skończyło się na:sysctl -n hw.physicalcpu_max
CO
1

Na MacBook Pro z systemem Mavericks , sysctl -a | grep hw.cpupowróci tylko jakieś tajemnicze szczegóły. W machdep.cpusekcji tej ujawniono znacznie bardziej szczegółowe i dostępne informacje , tj .:

sysctl -a | grep machdep.cpu

W szczególności w przypadku procesorów z HyperThreading(HT) zobaczysz całkowitą wyliczoną liczbę procesorów ( logical_per_package) jako dwukrotność liczby fizycznych rdzeni ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
Karl Ehr
źródło
Na moim Mac Pro z początku 2008 roku daje mi to 4. Rzeczywista liczba rdzeni wynosi 8, ponieważ ma dwa czterordzeniowe układy CPU.
Mike DeSimone
sysctl machdep.cpu działa również zamiast czytać wszystkie inne niepotrzebne informacje.
hsn
1

Nie zostało to określone w pierwotnym pytaniu (chociaż widziałem OP w komentarzach, że nie była 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, o ile istnieje założenie (lub wymaganie) instalowania Homebrew (np. W organizacji inżynierskiej w firmie), nprocjest jednym ze wspólnych plików binarnych GNU, które są zawarte w coreutilspakiecie.

brew install coreutils

Jeśli masz skrypty, które wolisz pisać raz (dla Linux + macOS) zamiast dwa razy, lub aby uniknąć ifbloków, w których musisz wykryć system operacyjny, aby wiedzieć, czy zadzwonić nprocvs sysctl -n hw.logicalcpu, może to być lepsza opcja.

Ryan Parman
źródło
0

Komentarze do 2 dobrych odpowiedzi powyżej:

1) ponownie zaakceptowana odpowiedź (i komentarze) autorstwa jkp: hw.ncpu jest najwyraźniej wycofana na korzyść hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) ponownie aktualizacja Karla Ehra z 2014 r .: na moim komputerze (z rdzeniem Intel Core i7 2,5 GHz) sysctl -a | grep machdep.cpu | grep per_packagezwraca różne liczby:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Pożądane wartości to:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Które dopasowanie:

hw.physicalcpu: 4

hw.logicalcpu: 8

znak
źródło
0

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

$ nproc --all
32

Kompatybilny z macOS i Linux.

Jay Taylor
źródło
2
nprocnie wydaje się być dostępny w systemie macOS Mojave.
Mike DeSimone,
Dzięki za poinformowanie mnie, Mike. nprocto prosta instalacja przez Homebrew.
Jay Taylor,
System, który uruchomiłem, został odłączony od Internetu, więc Homebrew nie pomaga. Nie można użyć niczego, co wymaga „curl site | sudo bash”
Mike DeSimone