source

명령줄에서 Linux의 CPU/코어 수를 가져오려면 어떻게 해야 합니까?

manysource 2023. 4. 20. 21:35

명령줄에서 Linux의 CPU/코어 수를 가져오려면 어떻게 해야 합니까?

이 스크립트는 있지만 인쇄물의 마지막 요소를 가져오는 방법을 모릅니다.

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

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

grep -c ^processor /proc/cpuinfo

에서 "counted"로 시작하는 행의 수를 카운트합니다./proc/cpuinfo

하이퍼스레딩을 탑재한 시스템에서는

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

를 들어) 반환해야 .8됩니다).16)

/proc/cpuinfo불필요하게 바로크다.대부분의 Linux 설치에서 사용할 수 있도록 coreutils의 일부인 nproc를 사용합니다.

「」nproc는 현재 프로세스에서 사용 가능한 처리 유닛의 수를 출력합니다.이는 온라인 프로세서의 수보다 적을 수 있습니다.

되어 있는 모든 하려면 , 「」/ 「」를 사용합니다.nproc --all

8 코어 머신의 경우:

$ nproc --all
8

가 이 좋은 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.getconf★★★★★★★★★★★★★★★★★★:

getconf _NPROCESSORS_ONLN

이는 Linux와 Mac OS X 모두에서 작동합니다. getconf가 오랫동안 존재했다는 것도 다른 접근법에 비해 또 다른 장점입니다. 오래된 에는 Linux가되어 있지 않은 .nproc ★★★★★★★★★★★★★★★★★」lscpu가능한 에는 ""가 .getconf.

편집자 메모:유틸리티가 POSIX에 의해 요구되고 있는 경우, 특정의 경우,_NPROCESSORS_ONLN ★★★★★★★★★★★★★★★★★」_NPROCESSORS_CONF 은 그렇지 않습니다.앞에서 설명한 바와 같이 Linux 플랫폼 및 MacOS 상에서 동작합니다.FreeBSD/PC-BSD에서는 선두를 생략해야 합니다._.

서문:

  • 베이스의 회답의 문제는, 인간이 소비하는 정보를 해석하기 위한 것이므로, 머신 해석용으로 설계된 안정된 형식이 없다는 입니다.출력 형식은 플랫폼과 런타임 조건에 따라 다를 수 있습니다.Linux(및 MacOS)에서 사용하는 것은 이 문제를 회피합니다.

  • getconf _NPROCESSORS_ONLNgetconf NPROCESSORS_ONLN는 논리 CPU와 물리 CPU를 구분하지 않습니다.


ㅇㅇㅇㅇㅇㅇㄹ게요.sh(POSIX 준거) LinuxMacOS에서 동작하는 스니펫으로, 온라인(논리 CPU 또는 물리 CPU)의를 판별합니다.자세한 것에 대하여는, 코멘트를 참조해 주세요.

lscpusysctlmacOS에 대응합니다.

용어 메모: CPU는 OS에서 볼 수 있는 가장 작은 처리 유닛을 의미합니다.하이퍼스레딩이 아닌 코어는 각각 1개의 CPU에 대응하지만 하이퍼스레딩 코어는 2개 이상의 논리 CPU를 포함합니다.
Linux는 가장 작은 단위부터 시작하여 다음과 같은[1] 분류법을 사용합니다.
CPU < core < socket < book <노드
각 레벨은 다음 하위 레벨의 1개 이상의 인스턴스로 구성됩니다.

#!/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 매뉴얼

의 BSD 은 MacOS BSD만을 합니다.hw.ncpu를 누르다sysctl(MacOS에서는 권장되지 않습니다.새로운 키 중 어떤 것이 있는지 불명확합니다.hw.npu하다:hw.(logical|physical)cpu_[max].

수정을 하는 @lscpu명령어를 입력합니다.

경고:lscpu -p(「book」 「」)이 포함되지 않습니다.man페이지에는 분류학적 계층에서 소켓과 노드 사이의 엔티티로 "books"가 언급되어 있습니다.특정 Linux 시스템에서 "책"이 재생되고 있는 경우(언제, 어떻게 재생되는지 아는 사람이 있습니까?), physical-CPU-count 명령어가 과소 보고될 수 있습니다(이는 다음과 같은 가정 하에 이루어집니다).lscpu는 상위 레벨의 엔티티 간에 고유하지 않은 ID를 보고합니다.예를 들어, 2개의 다른 소켓에서2개의 다른 코어가 같은 ID를 가질 수 있습니다).


위의 코드를 예를 들어 셸 스크립트로 저장할 경우 다음 명령어를 사용하여 실행할 수 있도록 합니다.chmod +x cpus.$PATH하다

$ cpus
logical  4
physical 4

[1] 이란 무엇인가에 대해 설명합니다.「책은 CPU 소켓, RAM 소켓, 가장자리를 따라 IO 접속, 냉각 시스템 집적용 후크를 갖춘 회로 기판을 내장한 모듈입니다.IBM 메인프레임에서 사용됩니다.상세정보 : http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf"

lscpu는 /의 CPU 이 읽을 수 있는합니다.「 / 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

https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu 도 참조해 주세요.

Python도 사용할 수 있습니다!물리적 코어 수를 얻으려면:

$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4

하이퍼스레드 코어 수를 얻으려면:

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8

Linux에서 온라인 상태인 물리적 코어 수를 계산하는 방법은 다음과 같습니다.

lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines

또는 요약하면 다음과 같습니다.

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l

예(1 소켓):

> lscpu
...
CPU(s):                28
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             1
....
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14

예 (2 소켓):

> lscpu
...
CPU(s):                56
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             2
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28

예 (4 소켓):

> lscpu
...
CPU(s):                64
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32

총 물리적 코어 수의 경우:

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

멀티 소켓 머신(또는 항상)에서는 위의 결과에 소켓 수를 곱합니다.

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

@scpu를 사용한 @seclement0의 답변은 다음과 같습니다.댓글에 좀 더 간결하게 써놨는데

실제로 getconf를 사용하는 것이 가장 이식 가능한 방법입니다.단, 변수 이름은 BSD와 Linux에서 getconf를 사용하기 위해 다르기 때문에 다음 요지가 시사하는 바와 같이 둘 다 테스트해야 합니다.https://gist.github.com/jj1bdx/5746298 (ksh를 사용하는 Solaris 픽스도 포함되어 있습니다.

개인사용:

$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1

python으로 하려면 os 모듈을 Import하여 syscall getconf를 사용합니다.

$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'

★★★★★★에 대해서nprocGNU Coreutils는 BSD를 사용합니다. methodssysconf() 뒤에 됩니다.

Linux, MacOS, Windows용 크로스 플랫폼 솔루션:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")

Linux 및 OS X에서 작동하도록 하려면 다음 작업을 수행합니다.

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)

그것은 매우 간단하다.다음 명령어를 사용합니다.

lscpu

다음 방법 중 하나를 사용하여 물리적 CPU 코어 수를 확인할 수 있습니다.

  • ID」에 거의 의 수를 합니다.grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l를 참조해 주세요.

    awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo

  • '소켓당 코어 수'에 소켓 수를 곱합니다.

    lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'

  • Linux 의 CPU 의 사용 가능.-p은, 하기 쉽도록 해, 「 「 」와 호환성이 .lscpu.

    lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'


다른 사람들의 말을 다시 한 번 강조하자면, 관련된 특성들이 많이 있습니다.

사용 가능한 CPU의 수를 확인하려면 , 다음의 순서에 따릅니다.

getconf _NPROCESSORS_ONLN
grep -cP '^processor\t' /proc/cpuinfo

사용 가능한 프로세싱 유닛의 수(코어 수와 같을 필요는 없습니다)를 판별합니다.이것은 하이퍼스레딩 인식입니다.

nproc

는 않지만 사용 가능한 프로세서가 는 를 통해 할 수도 (「 」 「 」 「 」 「 」 「 」 「 」 「 」( 「 」 「 」 / 「 」)getconf _NPROCESSORS_CONF 및 를, 의 「 「 」 ) 、 「 CPU 」 、 「 」 、「 」lscpu -ap.

위의 답변은 대부분의 경우에 적용할 수 있지만 도커 컨테이너 환경에서 컨테이너가 제한되어 있는 경우 위의 방법으로는 실제 CPU 코어를 얻을 없습니다.

이 경우 실제 CPU 코어를 얻으려면 다음 작업을 수행해야 합니다.

grep -c 'cpu[0-9]' /proc/stat

나도 생각했다.cat /proc/cpuinfo정답을 알 수 있지만 최근 ARM 쿼드코어 Cortex A53 시스템이 단일 코어만 나타내는 것을 발견했습니다. 것 /proc/cpuinfo는 액티브코어만을 나타내고 있습니다.

cat /sys/devices/system/cpu/present

거기에 무엇이 있는지 더 잘 알 수 있습니다.할 수도 있습니다.

cat /sys/devices/system/cpu/online

어떤 코어가 온라인 상태인지 확인하고

cat /sys/devices/system/cpu/offline

이치노online,offline , , , , 입니다.present하므로 sysfs의 로 반환됩니다.00을 하고 core 0의 은 core 0을 의미합니다.1-31, 2, 3번입니다.

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu 를 참조해 주세요.

혹시나 궁금하실까 봐 파이썬이psutil.cpu_count(logical=False)한 셸합니다.call " Linux " 는 call " Linux " 입니다.

cat /sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_list | sort -u | wc -l

core_cpus_list를 사용할 수 없는 경우(psutil에 이 폴백이 있는 경우) 폐지된 thread_siblings_list 파일의 정보로 폴백하는 약간 긴 버전을 다음에 나타냅니다.

cat /sys/devices/system/cpu/cpu[0-9]*/topology/{core_cpus_list,thread_siblings_list} | sort -u | wc -l

하이퍼스레드 시스템과 비하이퍼스레드 시스템의 "실제" 코어 수를 다음에 나타냅니다.적어도 내 모든 테스트에서 효과가 있었어.

awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 };  END { print CORES*P }' /proc/cpuinfo

제 웹 페이지는 아니지만, http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902의 이 명령어는 센토에서 잘 작동합니다.하이퍼스레딩을 사용하도록 설정한 경우에도 실제 CPU가 표시됩니다.

cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l

"core id"를 사용할 수 없는 경우 "processor" 카운트에 폴백을 사용하여 "physical id" 메서드에 따라 "core id"를 카운트합니다(라즈베리 등).

echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }' /proc/cpuinfo)
cat /proc/cpuinfo | grep processor

이건 잘 작동했어.첫 번째 답변을 시도했을 때 출력으로 CPU 3개가 나왔습니다.가 4개 것을 있기 에 CPU를 4개, CPU를 4개로 했습니다.grep은 다음과

[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

Python을 사용할 수 있다면 모듈에는 다음과 같은 기능이 있습니다.

In [5]: import numexpr as ne

In [6]: ne.detect_number_of_cores()
Out[6]: 8

또, 이것에도 대응합니다.

In [7]: ne.ncores
Out[7]: 8

명령 프롬프트에서 이 정보를 쿼리하려면 다음 명령을 사용합니다.

# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8

또는 함수에서 이 정보를 얻을 수 있습니다.

$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"

또는 보다 간단하게 사용할 수도 있습니다.

$ python -c "import os; print(os.cpu_count())"

핵심 세부 정보를 가져오려면 아래 쿼리를 사용하십시오.

[oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8

물리 코어를 세는 것만으로 충분합니다.

lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w

매우 기본이지만 논리적 수를 무시하고 실제 물리적 코어를 카운트하는 것 같습니다.

Fravadona의 답변은 훌륭하고 정확합니다. 하지만 그것은 그의 존재를 필요로 합니다.lscpu코어의 하지 않기 에, 「코어 수」에 해 보려고 proc/cpuinfo

cat /proc/cpuinfo | grep -B2 'core id' | sed 's/siblings.*/'/ | tr -d '[:space:]' | sed 's/--/\n/'g | sort -u | wc -l

완벽하게 작동하지만 불행히도 Fravadona만큼 견고하지는 않습니다. 왜냐하면 만약 그렇다면 고장날 것이기 때문입니다.

  • /proc/cpuinfo 사항
  • grep하는 행 (현재의 「」)를 합니다.--를 다른 문자열로 을 하다

그러나 그 이외에는 문제없이 동작합니다.

여기 일어나고 있는 모든 일에 대한 간단한 설명이 있습니다.

grep -B2 'core id'

관심 있는 행만 가져옵니다(즉, "core id"와 앞의 2행).

sed 's/siblings.*/'/

"마개"를 제거합니다.회선

tr -d '[:space:]'

공백 문자 바꾸기

sed 's/--/\n/'g

grep에 의해 삽입된 '--' 문자를 줄 바꿈으로 바꿉니다.

sort -u

"물리 ID, 코어 ID"로 그룹화

wc -l

행수를 세다

완전 누비인 나는 이것이 먹혔을 때 내 자신에 대해 매우 만족했다.필요한 회선을 함께 연결하여 "물리 ID"와 "코어 ID"로 그룹화할 수 있을 것이라고는 생각하지 못했습니다.그것은 좀 허술하지만 효과가 있다.

이 난장판을 간소화할 방법을 아는 전문가가 있다면 알려주세요.

이 스레드에 있는 대부분의 답변은 논리 코어와 관련되어 있습니다.

Ubuntu 18.x에서 BaaS를 사용하면 물리 CPU의 수를 판단할 수 있습니다.

numcpu="$(lscpu | grep -i 'socket(s)' | awk '{print $(2)}')"

대부분의 Linux Distros에서 동작합니다.

이전의 수많은 대답들 중에서 하나 더.cgroup을 사용할 수 있을 때 사용할 수 있습니다.cpuet 서브시스템은 동작 CPU 목록을 제공합니다.이것은 /sys/fs/cgroup에서 계층의 최상위 cgroup에 나열될 수 있습니다.예를 들어 다음과 같습니다.

$ cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus
0-3

그 후, 액티브한 CPU 의 수를 취득하려면 , 후자의 해석을 실시할 필요가 있습니다.이 파일의 내용은 쉼표로 구분된 CPU 세트 목록입니다.

는 ' 낫다'를 사용한 입니다.tr sedexpr:

#!/bin/sh

# For test purposes, the CPU sets are passed as parameters
#cpuset=`cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus`
cpuset=$1

ncpu=0
for e in `echo $cpuset | tr ',' ' '`
do
  case $e in

    # CPU interval ==> Make an arithmetic operation
    *-*) op=`echo $e | sed -E 's/([0-9]+)-([0-9]+)/\2 - \1 + 1/'`;;

    # Single CPU number
    *) op=1;;

  esac

  ncpu=`expr $ncpu + $op`

done

echo $ncpu

다음으로 여러 종류의 CPU 세트를 사용한 실행 예를 제시하겠습니다.

$ for cpuset in "0" "0,3" "0-3" "0-3,67" "0-3,67,70-75" "0,1-3,67,70-75"
> do
>   ncpu.sh $cpuset
> done
1
2
4
5
11
11
 dmidecode  | grep -i cpu | grep Version

준다

버전:인텔(R) Xeon(R) CPU E5-2667 v4(3.20GHz)

버전:인텔(R) Xeon(R) CPU E5-2667 v4(3.20GHz)

소켓카운트는입니까?- " " " " " " " " "를 참조해 주세요.E5-2667에 「」가 붙어 있는 것을 알 수 있습니다.8 cores '먹다'로 16 cores~에 2 sockets.

서 ★★★★★lscpu에게 me me를 .20 CPUs. - 왜 는 잘 (. - 전틀 - 랬동동동동동동동동동동동동동동동동동동동동동동동동동동동동동동동)cat /proc/cpu은 - 최으 - - - -20.

Python 3은 또한 다음과 같은 간단한 방법을 제공합니다.

$ python3 -c "import os; print(os.cpu_count());"

4

$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"

4

개요: 물리 CPU를 취득하려면 , 다음의 순서에 따릅니다.

grep 'core id' /proc/cpuinfo | sort -u

물리 CPU와 논리 CPU를 취득하려면 , 다음의 조작을 실시합니다.

grep -c ^processor /proc/cpuinfo

/proc<< 이것은 프로세스와 관련된 모든 정보의 중요한 소스입니다.

/proc/cpuinfo<< CPU > CPU > 。

포크 없이 고속화

이것은 거의 껍질에서 작동합니다.

ncore=0
while read line ;do
    [ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
  done </proc/cpuinfo
echo $ncore
4

셸, , 과 호환성을 유지하기 위해ncore=$((ncore+1))((ncore++)).

버전

ncore=0
while read -a line ;do
    [ "$line" = "processor" ] && ((ncore++))
  done </proc/cpuinfo
echo $ncore
4

언급URL : https://stackoverflow.com/questions/6481005/how-to-obtain-the-number-of-cpus-cores-in-linux-from-the-command-line