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


231

시스템에 몇 개의 코어가 있는지 알고 싶었고 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 시스템의 핵심을 나타내는 것은 무엇입니까?

코어 수를 알려주는 다른 명령이 있습니까? 아니면 완전히 잘못되었다고 가정합니까?


1
모든 사용자를위한 간단한 명령 : $ grep precessor / proc / cpuinfo | wc -l
สมหวัง แนวหน้า

6
텍스트 이미지는 별로 도움이되지 않습니다 . 편집기로 복사 할 수 없으며 색인이 잘 작성되지 않으므로 동일한 문제를 가진 다른 사용자가 여기에서 답변을 찾을 가능성이 적습니다. 제발 편집 (바람직 복사본을 사용 + 전사 오류를 방지하기 위해 붙여 넣기) 직접 관련 텍스트를 통합하는 게시물을.
Toby Speight

답변:


117

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


1
소켓 당 하나의 소켓, 두 개의 CPU가 있으므로 총 2를 의미합니다. 그러나 4 CPU가 표시됩니다. 내가 시도 nproc하면 4를 돌려받습니다. 사용 cat /proc/cpuinfo하면 4를 얻으므로 적어도 내 상황에서는이 대답이 잘못 된 것 같습니다.
SPRBRN

14
하이퍼 스레딩이 있으면 아닙니다. 여전히 2 개의 물리적 코어가 있지만 각 코어는 / proc / cpuinfo에 두 번 표시됩니다. coreid를주의 깊게 살펴보면 각 coreid가 두 번 나열되어 있음을 알 수 있습니다. 또한 플래그 아래에서 ht 플래그를 볼 수 있습니다.
user1403360

237

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

CPU = 소켓 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의 CPU 수 에 해당합니다 lscpu. 위의 데스크탑 시스템의 경우 다음에 의해보고 된 8 개의 CPU와 일치해야합니다 lscpu.

$ nproc --all
8

의 결과는 /proc/cpuinfo이 정보와 일치해야합니다. 예를 들어 위의 데스크탑 시스템에서 8 개의 프로세서 (CPU)와 4 개의 코어 (코어 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/cpuinfo은 님이 Core(s) per socket보고 한 사람과 같습니다 lscpu. 위의 데스크탑 시스템의 경우 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라는 용어를주의해야합니다.

12
이것은 허용 대답해야한다
gansub

2
동의한다. 주제를 더 잘 설명 할 수있는 대답으로 받아 들여 져야합니다.
Rafael

추가 lscpu --all --extended는 유용한 추가 가 될 것이라고 생각 하지만 더 이상 이러한 특정 시스템에 액세스 할 수 없습니다.
htaccess

awk와 명백한 곱셈을 피할 수도 있습니다.lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský

@Jakub Klinkovský, 지적 해 주셔서 감사하지만이 경우 실제로의 곱셈을 보여주고 싶습니다 Socket(s) * Core(s) per socket. 내가 방금 말한 것을 감안할 때 echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))사람들이 곱한 것을 정확하게 볼 수 있도록 더 나을 것이라고 생각합니다 ...
htaccess

61

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

$ nproc --all
12

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


10
이것은 올바르지 않습니다. nproc의 출력은 lscpu의 CPU 수에 해당합니다. 멀티 스레드 코어가있는 경우 nproc의 출력은 보유한 코어 수와 일치하지 않습니다.
htaccess

2
루트가 아닌 솔루션의 경우 해킹은 top과 hit 1을 사용하는 것입니다. 그러면 사용 가능한 코어 수가 표시됩니다 . "사용 가능한"이유는 기본 하드웨어에 클라우드 인프라와 같은 코어가 더 많기 때문입니다.
호핑 토끼

@htaccess 최소한 우분투에서는 올바른 온라인 논리 CPU 수를 출력합니다.
Wil

1
@htaccess 알았어. 알았다. 보통 Linux duffer가 몇 개의 코어를 요구할 때 사용 가능한 논리 스레드 수를 의미합니다. 기술적으로 말하자면, 리눅스는 하드웨어 스레드를 'cpus'라고 부르는 것이 잘못되었습니다. 머신에는 2 개의 코어 및 4 개의 SMT 하드웨어 스레드가있는 1 개의 CPU가 있습니다. 결과적으로 CPU와 코어의 의미에는 엄청난 모호성이 있습니다. 그러나 나는 당신이 지금 의미하는 바를 얻습니다.
Wil

1
@ 그렇지만 나는 위의 대답에서 이것을 외우고있다. "CPU는 다른 상황에서 다른 것을 의미하기 때문에 CPU라는 용어를 조심해야한다". 개인적으로 나는 "코어"를 논리 처리 장치와 동일시하지 않고 프로세서의 물리 코어 (예 : 물리 처리 장치)와 동일시합니다.
htaccess

19

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

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

  • 핵심 실제 실행 하드웨어의 집합을 의미한다 (즉, 각 코어는 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

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

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


14

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 개의 코어가 있습니다.


정보를 자세히 설명하는이 명령에 감사드립니다. :)
Mr ASquare

한 줄 명령의 경우 다음을 사용할 수 있습니다.grep -c ^processor /proc/cpuinfo
Wildcard

5
getconf _NPROCESSORS_ONLN

(getconf는 glibc의 일부입니다)


1
그것은 약간 다릅니다 (그리고 일부 요구에 유용합니다). 현재 온라인 상태 (즉, 프로세스 실행에 사용 가능한)의 프로세서 수입니다. 하나 이상의 시스템이 오프라인 상태가 된 경우 (예 : 최대 절전 모드 또는 프로세서 추가 / 제거 중) 총 CPU 수보다 적을 수 있습니다.
Toby Speight

그리고 getconf _NPROCESSORS_CONF구성된 프로세서 수를 얻습니다. sysconf()함수 를 사용하여 C 소스 코드 내에서이 두 매크로의 값을 얻을 수도 있습니다 . man sysconf자세한 내용을 보려면 입력 하십시오.
Galaxy

4
[root@xxxxx ~]#  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

t 4dmidecode 의 기능은 무엇입니까 ? 카운트 및 활성화 된 라인은 어떻게 증가합니까? 귀하의 예는 2 코어, 6, 12, 24 또는 다른 숫자를 보여줍니까?
Xen2050

@ Xen2050는 4것입니다 processor참조 linux.die.net/man/8/dmidecode을 . 그러나 4논쟁으로 사용하는 것은 나쁜 습관입니다.
JohnKoch

bash: dmidecode: command not found
카메론 허드슨

3
$ grep -c processor /proc/cpuinfo
8

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

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

또 다른 쉬운 방법.


2
이것은 간단하지만 질문에 정확한지는 확실하지 않습니다. 하이퍼 스레딩이 활성화 된 경우 코어 수 : (코어! = cpus)를 요청했습니다. 내 시스템에는 24 코어가 있습니다 : 하이퍼 스레드시 48 CPU. 또한, 제공되는 두 번째 명령을 사용하여 ls -d /sys/devices/system/cpu/cpu* | wc -l보여 49 디렉토리 있기 때문에 cpuidle사이 cpuN디렉토리.
앤드류 팔랑가

0

나는이 방법을 찾았다.

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

0

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

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


이것이 대답이 아닌 경우 주석으로 추가하십시오.
Mongrel

@Mongrel 댓글로 추가하고 싶었지만 댓글을 달려면 50 개의 평판이 필요합니다
PickBoy

-2

여기서 CPU 제품군은 관련이 없습니다.

  • CPU = 물리적 소켓
  • 소켓 당 코어 (들)
  • 따라서 총 코어 수 = CPU (들) * 소켓 당 코어 (들)

귀하의 경우 총 4 개의 풀 코어가 있습니다.

또한 중요 할 수있는 것은 "코어 당 스레드"입니다. 그러나 1이 있으므로 귀하의 경우에는 아닙니다.


1
설명에서 CPU와 소켓을 혼동하고 있습니다.
jlliagre

1
jlliagre는 이것이 잘못되었다고 말합니다. Cores = Cores per socket X Sockets내 응답의 설명을 참조하십시오.
htaccess

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.