it-swarm-ko.tech

리눅스에서 시스템의 코어 수를 아는 방법?

시스템에 몇 개의 코어가 있는지 알고 싶었고 Google에서 동일한 질문을 검색했습니다. lscpu 명령과 같은 명령이 있습니다. 이 명령을 시도했을 때 다음과 같은 결과가 나왔습니다.

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1998.000
BogoMIPS:              5302.48
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              2048K
NUMA node0 CPU(s):     0-3

특히이 출력은 다음을 보여줍니다.

  • CPU : 4
  • 소켓 당 코어 : 4
  • CPU 제품군 : 6

다음 중 Linux 시스템의 핵심을 나타내는 것은 무엇입니까?

코어 수를 알려주는 다른 명령이 있습니까, 아니면 완전히 틀렸다고 가정합니까?

254
Mr ASquare

소켓 당 소켓과 코어를 살펴 봐야합니다. 이 경우 4 개의 코어 (소켓 당 코어)가있는 물리적 CPU (소켓)가 1 개 있습니다.

124
user1403360

완전한 그림을 얻으려면 코어 당 threads , 소켓 당 coressockets 의 수를 확인해야합니다. 이 숫자를 곱하면 시스템의 CPUs 수를 얻게됩니다.

CPU = 코어 X 당 스레드 X 소켓 X 소켓 당 코어

CPU는 htop을 실행할 때 표시되는 것입니다 (이것은 물리적 CPU와 동일하지 않습니다).

다음은 데스크톱 컴퓨터의 예입니다.

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1

그리고 서버 :

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2

nproc의 출력은 lscpu의 CPU 수에 해당합니다. 위의 데스크탑 시스템의 경우 lscpu에서보고 한 8 개의 CPU와 일치해야합니다.

$ nproc --all
8

/proc/cpuinfo의 출력은이 정보와 일치해야합니다. 예를 들어 위의 데스크탑 시스템에서 8 개의 프로세서 (CPU)와 4 개의 코어 (core id 0-3)가 있습니다.

$ grep -E 'processor|core id' /proc/cpuinfo
processor   : 0
core id     : 0
processor   : 1
core id     : 0
processor   : 2
core id     : 1
processor   : 3
core id     : 1
processor   : 4
core id     : 2
processor   : 5
core id     : 2
processor   : 6
core id     : 3
processor   : 7
core id     : 3

cpu cores에 의해보고 된 /proc/cpuinfolscpu에 의해보고 된 Core(s) per socket에 해당합니다. 위의 데스크탑 시스템의 경우 lscpu에서보고 한 소켓 당 4 개의 코어와 일치해야합니다.

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

구체적으로 질문에 대답하기 위해 소켓 당 보유한 코어 수에 보유한 소켓 수를 곱하여 보유한 코어 수를 알 수 있습니다.

코어 = 소켓 당 코어 X 소켓

데스크탑 위의 시스템 예에는 4 개의 코어가 있습니다.

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4

서버가 16 : 동안

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16

다른 유용한 유틸리티는 소켓 정보 당 출력되는 dmidecode입니다. 위에 나열된 서버 시스템의 경우 소켓 당 8 개의 코어와 소켓 당 16 개의 스레드가 표시됩니다.

$ Sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
    Socket Designation: CPU1
    Core Count: 8
    Thread Count: 16
    Socket Designation: CPU2
    Core Count: 8
    Thread Count: 16

lscpu 명령에는 다음과 같은 유용한 옵션이 많이 있습니다.

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

자세한 내용은 man lscpu를 참조하십시오.

요약하자면:

  • 소켓, 코어 및 스레드를 알고 있어야합니다.
  • 상황에 따라 다른 의미를 갖는 CPU라는 용어를주의해야합니다.
251
htaccess

이 정보는 nproc(1) 명령으로 얻을 수 있습니다

$ nproc --all
12

루트 권한이 필요하지 않습니다.

61
Anthony Ananich

대답이 혼동되지 않도록하려면 몇 가지 간단한 컴퓨터 아키텍처 개념을 이해해야합니다.

  • 리눅스 시스템에서 processes ( "programs")를 실행합니다. 각 프로세스는 하나 이상의 스레드로 구성됩니다.
  • thread는 별도의 instructions 시퀀스입니다. 두 개의 스레드를 병렬로 실행할 수 있습니다.
  • 각각의 명령은 실행될 CPU 에 주어집니다. CPU에는 명령어 비트의 의미를 파악하고 처리 할 논리를 결정하는 논리가 있습니다.
  • 다른 유형의 지침이 있습니다. CPU 내부의 의사 결정 논리는 다른 명령을 다른 하드웨어 단위에 전달합니다. 예를 들어, 산술 명령어는 실제로 ALU (산술/논리 단위)에 의해 수행되는 반면 메모리에서로드/저장하는 명령어는- 메모리 유닛.

  • core는 실제 실행 하드웨어 세트를 나타냅니다 (즉, 모든 코어에는 ALU, 메모리 장치 등이 있습니다.)

  • 하나의 코어를 공유하는 여러 개의 CPU를 가질 수 있습니다.이를 하이퍼 스레딩이라고합니다.

    • 아이디어 : 스레드 A는 현재 산술을 수행하는 반면 스레드 B는 메모리에서 무언가를로드합니다. 사실이라면 스레드 A와 B는 서로의 방식으로 방해받지 않고 단일 코어를 효율적으로 공유 할 수 있습니다 (A는 ALU를 사용하고 B는 메모리 장치를 사용함). 물론 두 프로그램 모두 ALU를 원할 때까지 기다려야합니다.
  • 소켓은 칩이 삽입되는 마더 보드의 물리적 슬롯입니다. 이 칩에는 특정 개수의 코어가 있습니다.

예 :

OP의 예 :

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • 하나의 물리적 소켓.
  • 4 개의 물리적 코어 (총 4 개의 ALU 및 4 개의 메모리 장치 생각)
  • 하나의 스레드 만 코어에 명령을 발행 할 수 있습니다 (하이퍼 스레딩 없음).
  • 코어 당 하나의 CPU 또는 4 * 1 = 4 CPU

또 다른 예:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

2 개의 물리적 소켓 (각각 4 개의 물리적 코어가있는 칩을 포함하여 총 8 개의 코어) 두 개의 스레드가 각 코어에 명령을 발행합니다 (이 시스템에는 하이퍼 스레딩이 있음). 즉, 각 코어에 두 개의 CPU가 연결되어 총 8 * 2 = 16 개의 CPU가 있어야합니다.

첫 번째 머신은 주어진 시간과 시간에 정확히 4 개의 명령을 실행할 수 있습니다. 두 번째 머신은 주어진 시간에 8 ~ 16 개의 명령을 실행할 수 있습니다. 16은 각 CPU 쌍이 서로 다른 유형의 명령을 실행할 때만 달성되므로 대기하지 않고 코어를 공유 할 수 있습니다.

23
stochastic

cat /proc/cpuinfo 각 코어에 대한 데이터 청크를 출력합니다. 각 청크는 다음 정보로 시작합니다.

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)

코어는 0부터 시작하여 번호가 매겨 지므로 마지막 청크에 processor : 3이 경우와 같이 머신에는 4 개의 코어가 있습니다.

14
dr01
getconf _NPROCESSORS_ONLN

(getconf는 glibc의 일부입니다)

7
L.R.
$ grep -c processor /proc/cpuinfo
8

그게 당신이 필요한 전부입니다. 하이퍼 스레딩이 설정되어 있는지에 관계없이 온라인 상태의 코어 수입니다.

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

또 다른 쉬운 방법.

4
jwc
[[email protected] ~]#  dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
    Socket Designation: CPU1
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
    Socket Designation: CPU2
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
4
reli

나는이 방법을 찾았다.

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
1
Serge Roussak

@htaccess의 답변에 정보를 추가하고 싶습니다.

CentOS 6.x에서 dmidecode는 코어/스레드 카운트 정보를 출력하지 않으며 실제로는 '소켓'이 아닌 lscpu에서 'CPU'를 'CPU'또는 '코어'로 간주합니다.

0
PickBoy