Check number of CPUs
Tags: linux, shell, windows
Published: 2023-05-06 00:22:39

## Check number of CPUs in Linux

I wanted to know the number of CPUs in my Linux environment. The following Japanese version of the page was helpful.

[物理 CPU、CPU コア、および論理 CPU の数を確認する](https://access.redhat.com/ja/solutions/2159401)

The corresponding English page looks like this:

[How to find the number of physical cpus, cpu cores, and logical cpus](https://access.redhat.com/solutions/224883)

### Number of physical CPUs

Some machines have multiple physical CPUs.

```
fgrep 'physical id' /proc/cpuinfo | sort -u | wc -l
```

### Number of CPU cores

Some modern CPUs have multiple cores on a single physical CPU.

```
fgrep 'cpu cores' /proc/cpuinfo | sort -u | sed 's/.*: //'
```

### Number of logical processors

Modern CPUs can do multiple things with a single core using features like hyper-threading.

Therefore, the number of logical processors can be greater than the number of physical CPUs times the number of cores.

```
fgrep 'processor' /proc/cpuinfo | wc -l
```

### Simple shell script

Assuming all physical CPUs have the same number of cores, and hyper-threading as well, what would it look like?

```shell
#!/bin/bash

P_CPU=$( fgrep 'physical id' /proc/cpuinfo | sort -u | wc -l )
CORES=$( fgrep 'cpu cores' /proc/cpuinfo | sort -u | sed 's/.*: //' )
L_PRC=$( fgrep 'processor' /proc/cpuinfo | wc -l )
H_TRD=$(( L_PRC /  P_CPU / CORES ))

echo -n "${L_PRC} processer" ; [ "${L_PRC}" -ne 1 ] && echo -n "s"
echo -n " = ${P_CPU} socket" ; [ "${P_CPU}" -ne 1 ] && echo -n "s"
echo -n " x ${CORES} core"   ; [ "${CORES}" -ne 1 ] && echo -n "s"
echo -n " x ${H_TRD} thread" ; [ "${H_TRD}" -ne 1 ] && echo -n "s"
echo
```

```
$ cpucore.sh
8 processers = 1 socket x 4 cores x 2 threads
```

### lscpu command

As I learned later, there seems to be a command called `lscpu`.

```
$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          8
On-line CPU(s) list:             0-7
Thread(s) per core:              2
Core(s) per socket:              4
Socket(s):                       1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           142
Model name:                      Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
Stepping:                        10
CPU MHz:                         1799.998
BogoMIPS:                        3599.99
Virtualization:                  VT-x
Hypervisor vendor:               Microsoft
Virtualization type:             full
L1d cache:                       128 KiB
L1i cache:                       128 KiB
L2 cache:                        1 MiB
L3 cache:                        6 MiB
...Omitted below
```

I think the following will be the same information.

- Thread(s) per core: 2
- Core(s) per socket: 4
- Socket(s): 1

## Check number of CPUs in Windows

On Windows, it seems that you can check the number of CPUs in the same way as above with the following API.

[Win32_Processor class](https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-processor)

It seems that C ++ and C #, as well as PowerShell and VB can be acquired.

For the time being, in the case of VBS, I think that it will be as follows.

```vb
Option Explicit

Dim locator, resultSet, processor
Dim nSocket, nCore, nThread, totalThread
Dim msg

nSocket = 0
totalThread = 0

Set locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set resultSet = locator.ConnectServer.ExecQuery("SELECT * FROM Win32_Processor")
nSocket = resultSet.count
For Each processor In resultSet
  nCore = processor.NumberOfCores
  nThread= processor.NumberOfLogicalProcessors / processor.NumberOfCores
  totalThread= totalThread + processor.NumberOfLogicalProcessors
Next

msg = totalThread& " processer"
If 1 < totalThread Then
  msg = msg & "s"
End If

msg = msg & " = " & nSocket & " socket"
If 1 < nSocket Then
  msg = msg & "s"
End If

msg = msg & " x " & nCore & " core"
If 1 < nCore Then
  msg = msg & "s"
End If

msg = msg & " x " & nThread& " thread"
If 1 < nThread Then
  msg = msg & "s"
End If

WScript.Echo msg
```