이 스크립트가 있지만 출력물의 마지막 요소를 얻는 방법을 모르겠습니다.
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
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
답변
이것은 나를 위해 일했습니다. 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를 사용하여 아래에 좋은 답변이 있습니다. 의견에 간결한 버전을 작성했습니다.