[linux] 명령 줄에서 Linux의 CPU / 코어 수를 얻는 방법은 무엇입니까?

이 스크립트가 있지만 출력물의 마지막 요소를 얻는 방법을 모르겠습니다.

cat /proc/cpuinfo | awk '/^processor/{print $3}'

마지막 요소는 CPU 수에서 1을 뺀 것이어야합니다.



답변

grep -c ^processor /proc/cpuinfo     

“프로세서”로 시작하는 줄 수를 계산합니다. /proc/cpuinfo

하이퍼 스레딩이있는 시스템의 경우

grep ^cpu\\scores /proc/cpuinfo | uniq |  awk '{print $4}' 

(예를 들어)를 반환해야합니다 ( 8위의 명령은을 반환합니다 16)


답변

내용을 처리하는 /proc/cpuinfo것은 불필요하게 바로크입니다. coreutils의 일부인 nproc 을 사용 하므로 대부분의 Linux 설치에서 사용할 수 있습니다.

명령 nproc은 현재 프로세스에 사용 가능한 처리 장치 수를 인쇄하며, 이는 온라인 프로세서 수보다 적을 수 있습니다.

설치된 모든 코어 / 프로세서 수를 찾으려면 nproc --all

내 8 코어 머신에서 :

$ nproc --all
8


답변

내가 찾은 가장 휴대용 솔루션은 다음과 getconf같습니다.

getconf _NPROCESSORS_ONLN

이것은 Linux와 Mac OS X에서 모두 작동합니다. 다른 접근 방식에 비해 이것의 또 다른 이점은 getconf가 오랫동안 사용되어 왔다는 것입니다. 내가 개발해야하는 오래된 리눅스 시스템 중 일부에는 nproc또는 lscpu명령이 없지만 사용할 수 있습니다 getconf.

편집자 주 : 동안 유틸리티 POSIX-의무화 , 특정 및 값이 없습니다. 언급 한 바와 같이 Linux 플랫폼과 macOS에서도 작동합니다. FreeBSD / PC-BSD에서는 선행을 생략해야합니다 .getconf _NPROCESSORS_ONLN_NPROCESSORS_CONF _


답변

머리말:

  • 기반 답변문제점/proc/cpuinfo사람이 소비 할 수있는 정보를 구문 분석 하여 기계 구문 분석을 위해 설계된 안정적인 형식이 부족 하다는 것입니다 . 출력 형식은 플랫폼 및 런타임 조건에 따라 다를 수 있습니다. Linux (및 macOS)에서 사용 lscpu -p하면 sysctl이 문제를 무시합니다 .

  • getconf _NPROCESSORS_ONLN/ 논리적 CPU 와 물리적 CPU를 getconf NPROCESSORS_ONLN구분하지 않습니다 .


다음은 온라인 및 논리적 또는 물리적 CPU 를 결정하기 위해 Linux 및 macOS 에서 sh작동 하는 (POSIX 호환) 스 니펫입니다 . 자세한 내용은 의견을 참조하십시오.

용도 lscpu리눅스 및 sysctl맥 OS에 대한.

용어 참고 : CPU 는 OS에서 볼 수있는 가장 작은 처리 장치를 나타냅니다. 하이퍼 스레딩 코어는 각각 1 개의 CPU에 해당하는 반면, 하이퍼 스레딩 코어에는 2 개 (일반적으로 2 개)-논리-CPU가 포함됩니다.
Linux는 가장 작은 단위부터 시작 하여 다음 분류법 [1]을 사용합니다 .
각 레벨이 다음 하위 레벨의 인스턴스를 하나 이상 포함하는
CPU < core < socket < book < node
.

#!/bin/sh

# macOS:           Use `sysctl -n hw.*cpu_max`, which returns the values of 
#                  interest directly.
#                  CAVEAT: Using the "_max" key suffixes means that the *maximum*
#                          available number of CPUs is reported, whereas the
#                          current power-management mode could make *fewer* CPUs 
#                          available; dropping the "_max" suffix would report the
#                          number of *currently* available ones; see [1] below.
#
# Linux:           Parse output from `lscpu -p`, where each output line represents
#                  a distinct (logical) CPU.
#                  Note: Newer versions of `lscpu` support more flexible output
#                        formats, but we stick with the parseable legacy format 
#                        generated by `-p` to support older distros, too.
#                        `-p` reports *online* CPUs only - i.e., on hot-pluggable 
#                        systems, currently disabled (offline) CPUs are NOT
#                        reported.

# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
  # Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, 
  # which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] &&
                       sysctl -n hw.logicalcpu_max ||
                       lscpu -p | egrep -v '^#' | wc -l)

# Number of PHYSICAL CPUs (cores).
  # Linux: The 2nd column contains the core ID, with each core ID having 1 or
  #        - in the case of hyperthreading - more logical CPUs.
  #        Counting the *unique* cores across lines tells us the
  #        number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] &&
                       sysctl -n hw.physicalcpu_max ||
                       lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)

# Print the values.
cat <<EOF
# of logical CPUs:  $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF

[1] macOS sysctl (3)설명서

macOS 이외의 BSD 파생 시스템 (예 : FreeBSD) 은 macOS에서는 더 이상 사용되지 않는에 hw.ncpu대한 키만 지원합니다 sysctl. 어떤 새 키가 다음에 hw.npu해당 하는지 확실하지 않습니다 hw.(logical|physical)cpu_[max].

실제 CPU 카운트 lscpu명령 을 수정하는 데 도움이되는 @teambob의 팁 .

주의 사항 : lscpu -p출력에는 “book”열이 포함되지 않습니다 ( man페이지는 분류 체계에서 소켓과 노드 사이의 엔티티로 “books”를 언급합니다). 주어진 Linux 시스템에서 “books”가 재생중인 경우 ( 아무도 언제 어떻게 알 수 있습니까? ) 물리적 CPU-count 명령은 -report 미만일 수 있습니다 (이는 lscpu고유하지 않은 ID를 더 높은 수준으로 보고 한다는 가정을 기반으로 함) -레벨 엔티티 (예 : 2 개의 다른 소켓에서 2 개의 다른 코어는 동일한 ID를 가질 수 있음)


쉘 스크립트cpus같이 위의 코드저장하고 실행 가능하게 만들고 chmod +x cpus폴더에 배치 $PATH하면 다음과 같은 출력이 표시됩니다.

$ cpus
logical  4
physical 4

[1] Xaekai 는 다음과 같은 서적 에 대해 밝힙니다 . ” 은 CPU 소켓, RAM 소켓, 모서리를 따라 IO 연결 및 냉각 시스템 통합을위한 후크가있는 회로 보드를 수용하는 모듈입니다. 이들은 IBM 메인 프레임에서 사용됩니다. 추가 정보 : http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf


답변

lscpu 사람이 읽을 수있는 형식으로 / proc / cpuinfon 형식의 CPU 아키텍처 정보를 수집합니다.

# lscpu


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
CPU socket(s):         2
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 15
Stepping:              7
CPU MHz:               1866.669
BogoMIPS:              3732.83
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7

/unix/468766/understanding-output-of-lscpu참조하십시오 .


답변

이것은 나를 위해 일했습니다. tail -nX마지막 X 줄만 잡을 수 있습니다.

cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1

하이퍼 스레딩이있는 경우 물리적 코어 수를 파악하는 데 효과적입니다 .

grep "^core id" /proc/cpuinfo | sort -u | wc -l


답변

총 물리적 코어 수 :

grep '^core id' /proc/cpuinfo |sort -u|wc -l

다중 소켓 시스템에서 (또는 항상) 위의 결과에 소켓 수를 곱하십시오.

echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))

@ mklement0에는 lscpu를 사용하여 아래에 좋은 답변이 있습니다. 의견에 간결한 버전을 작성했습니다.