Question or issue on macOS:
How can you tell, from the command line, how many cores are on the machine when you’re running Mac OS X? On Linux, I use:
x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
It’s not perfect, but it’s close. This is intended to get fed to make, which is why it gives a result 1 higher than the actual number. And I know the above code can be written denser in Perl or can be written using grep, wc, and cut, but I decided the above was a good tradeoff between conciseness and readability.
VERY LATE EDIT: Just to clarify: I’m asking how many logical cores are available, because this corresponds with how many simultaneous jobs I want make to spawn. jkp’s answer, further refined by Chris Lloyd, was exactly what I needed. YMMV.
How to solve this problem?
Solution no. 1:
You can do this using the sysctl utility:
sysctl -n hw.ncpu
Solution no. 2:
Even easier:
sysctl -n hw.ncpu
Solution no. 3:
This should be cross platform. At least for Linux and Mac OS X.
python -c 'import multiprocessing as mp; print(mp.cpu_count())'
A little bit slow but works.
Solution no. 4:
To do this in C you can use the sysctl(3) family of functions:
int count; size_t count_len = sizeof(count); sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0); fprintf(stderr,"you have %i cpu cores", count);
Interesting values to use in place of “hw.logicalcpu”, which counts cores, are:
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.
Solution no. 5:
system_profiler SPHardwareDataType
shows I have 1 processor and 4 cores.
[~] 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 [~]
However, sysctl disagrees:
[~] sysctl -n hw.logicalcpu 8 [~] sysctl -n hw.physicalcpu 4 [~]
But sysctl appears correct, as when I run a program that should take up all CPU slots, I see this program taking close to 800% of CPU time (in top
):
PID COMMAND %CPU 4306 top 5.6 4304 java 745.7 4296 locationd 0.0
Solution no. 6:
$ system_profiler | grep 'Total Number Of Cores'
Solution no. 7:
Use the system_profiler | grep "Cores"
command.
I have a:
MacBook Pro Retina, Mid 2012.
Processor: 2.6 GHz Intel Core i7
user$ system_profiler | grep "Cores" Total Number of Cores: 4
user$ sysctl -n hw.ncpu 8
According to Wikipedia, (http://en.wikipedia.org/wiki/Intel_Core#Core_i7) there is no Core i7 with 8 physical cores so the Hyperthreading idea must be the case. Ignore sysctl
and use the system_profiler
value for accuracy. The real question is whether or not you can efficiently run applications with 4 cores (long compile jobs?) without interrupting other processes.
Running a compiler parallelized with 4 cores doesn’t appear to dramatically affect regular OS operations. So perhaps treating it as 8 cores is not so bad.
Solution no. 8:
As jkp said in a comment, that doesn’t show the actual number of physical cores. to get the number of physical cores you can use the following command:
system_profiler SPHardwareDataType
Solution no. 9:
The following command gives you all information about your CPU
$ sysctl -a | sort | grep cpu
Solution no. 10:
It wasn’t specified in the original question (although I saw OP post in comments that this wasn’t an option), but many developers on macOS have the Homebrew package manager installed.
For future developers who stumble upon this question, as long as the assumption (or requirement) of Homebrew being installed exists (e.g., in an engineering organization in a company), nproc
is one of the common GNU binaries that is included in the coreutils
package.
brew install coreutils
If you have scripts that you would prefer to write once (for Linux + macOS) instead of twice, or to avoid having if
blocks where you need to detect the OS to know whether or not to call nproc
vs sysctl -n hw.logicalcpu
, this may be a better option.