วิธีรับจำนวน CPU / แกนใน Linux จากบรรทัดคำสั่ง?


540

ฉันมีสคริปต์นี้ แต่ฉันไม่ทราบวิธีการรับองค์ประกอบสุดท้ายในงานพิมพ์:

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

องค์ประกอบสุดท้ายควรเป็นจำนวนของ CPU ลบ 1


9
คุณไม่จำเป็นต้องไปcatก่อนawkแล้ว: เพียงแค่เหมือนว่า:awk '<script>' /proc/cpuinfo awk '/^processor/{n+=1}END{print n}' /proc/cpuinfoและคุณจะได้โดยไม่ต้อง "ลบหนึ่ง"
Tomasz Gandor

หากต้องการตอบคำถามโดยตรงให้ไพพ์tail -n 1ของบรรทัดสุดท้ายและพิมพ์ออกมา
Fábio Santos

ดูเพิ่มเติมunix.stackexchange.com/q/564494/5132
JdeBP

คำตอบ:


659
grep -c ^processor /proc/cpuinfo     

จะนับจำนวนบรรทัดที่ขึ้นต้นด้วย "processor" ใน /proc/cpuinfo

สำหรับระบบที่มีเธรดมากเกินไปคุณสามารถใช้ได้

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

ซึ่งควรกลับ (ตัวอย่าง) 8(ในขณะที่คำสั่งข้างต้นจะกลับมา16)


42
โปรดทราบว่าทั้งสองนี้จะจบลงด้วยการนับเป็นสองเท่าของจำนวนแกนที่มีอยู่จริงถ้าคุณอยู่ในระบบที่มีไฮเปอร์เธรด (เช่น P4 หรือ Core i7)
duskwuff -inactive-

24
@duskwuff: ซึ่งเป็นสิ่งที่คุณต้องการในกรณีส่วนใหญ่
Frank Kusters

8
grep -c '^processor' /proc/cpuinfoบน zsh
Steven Lu

40
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1จะส่งคืนหมายเลขที่ไม่ถูกต้องเช่นกันถ้าหมายเลข CPU นั้นเป็น 0
Phazor

3
บรรทัดแรกส่งคืน 1 คอร์น้อยกว่าที่มีอยู่แล้ว ดีกว่า cat / proc / cpuinfo | awk '/ ^ processor / {พิมพ์ $ 3}' | wc -l
Mirko Ebert

649

การประมวลผลเนื้อหาของ/proc/cpuinfoคือบาร็อคที่ไม่จำเป็น ใช้nprocซึ่งเป็นส่วนหนึ่งของ coreutils ดังนั้นจึงควรมีอยู่ในการติดตั้ง Linux ส่วนใหญ่

คำสั่งnprocพิมพ์จำนวนหน่วยการประมวลผลที่มีให้กับกระบวนการปัจจุบันซึ่งอาจน้อยกว่าจำนวนตัวประมวลผลออนไลน์

หากต้องการค้นหาจำนวนแกนประมวลผล / โปรเซสเซอร์ที่ติดตั้งทั้งหมดให้ใช้ nproc --all

บนเครื่อง 8-core ของฉัน:

$ nproc --all
8

8
มันแยกแยะระหว่างคอร์เสมือนและฟิสิคัลคอร์หรือไม่?
Richard

12
สิ่งนี้ใช้ไม่ได้กับไฮเปอร์เธรดถ้าฉันต้องการจำนวนแกนประมวลผลทางกายภาพ ส่งคืน 8 ในกล่อง quad core i7 ของฉัน
pratnala

1
@pratnala - คำตอบของ teambobอ้างเพื่อให้คุณจำนวนแกนทางกายภาพ
Nick Chammas

1
ใน Ubuntu รุ่นเก่าของฉัน (10.10) nproc ไม่สามารถใช้งานได้ จะต้องมีการเพิ่มใหม่
bukzor

3
โชคnprocไม่ดีไม่ได้เป็นส่วนหนึ่งของ boot2docker
kgadek

269

โซลูชันแบบพกพาที่ฉันพบคือgetconfคำสั่ง:

getconf _NPROCESSORS_ONLN

สิ่งนี้ใช้ได้กับทั้ง Linux และ Mac OS X ข้อดีอีกอย่างของวิธีนี้คือการที่ getconf มีมานานแล้ว บางส่วนของเครื่อง Linux เก่าที่ฉันต้องทำในการพัฒนาไม่ได้มีnprocหรือlscpuคำสั่งที่ใช้ได้ getconfแต่พวกเขามี

หมายเหตุของบรรณาธิการ: ในขณะที่getconf ยูทิลิตี้ได้รับคำสั่ง POSIXเฉพาะ_NPROCESSORS_ONLNและ_NPROCESSORS_CONF ค่าไม่ได้ ที่กล่าวว่าตามที่ระบุไว้พวกเขาทำงานบนแพลตฟอร์มลินุกซ์เช่นเดียวกับบน MacOS; บน FreeBSD / PC-BSD คุณจะต้องไม่นำ_หน้า


11
สิ่งนี้ใช้ได้กับฉันใน Red Hat Entreprise Linux 5.4, Centos 6.5 & 7 และ Mac OSX 10.9 (Mavericks) ดูเหมือนว่านี่เป็นแบบพกพามากที่สุดเนื่องจาก lscpu ไม่ได้ติดตั้งตามค่าเริ่มต้นในระบบเหล่านี้ ขอบคุณ!
big_gie

1
ฉันเห็นด้วย. มันค่อนข้างพกพาได้
bukzor

8
ดังนั้นแบบพกพามันอยู่ใน POSIX :) pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html
BCran

1
@BCran ฉันไม่พบ_NPROCESSORS_ONLNใน POSIX คุณสามารถลิงค์ไปได้หรือไม่
Ciro Santilli 郝海东冠状病六四事件法轮功

3
@CiroSantilli 六四事件法轮功纳米比亚威视จากgithub.com/gstrauss/plasma/blob/master/plasma_sysconf.cดูเหมือนว่าฉันผิด: เป็นตัวเลือกเท่านั้น "sysconf _SC_NPROCESSORS_ONLN และ _SC_NPROCESSORS_CONF ไม่จำเป็นต้องใช้ตามมาตรฐาน แต่มีให้ในแพลตฟอร์มยูนิกซ์จำนวนมากและจัดทำเป็นเอกสารเป็นทางเลือกโดย Open Group"
BCran

100

คำนำ:

  • ปัญหากับ/proc/cpuinfoคำตอบชั่นคือข้อมูลแยกพวกเขาที่มีความหมายสำหรับมนุษย์บริโภคและทำให้ขาดความมั่นคงรูปแบบที่ออกแบบมาสำหรับการแยกเครื่อง : รูปแบบผลลัพธ์อาจแตกต่างกันข้ามแพลตฟอร์มและเงื่อนไขรันไทม์; การใช้งานlscpu -pบน Linux (และsysctlบน macOS) หลีกเลี่ยงปัญหาดังกล่าว

  • getconf _NPROCESSORS_ONLN/ getconf NPROCESSORS_ONLNไม่แยกแยะระหว่างตรรกะและทางกายภาพของซีพียู


ต่อไปนี้เป็นsh(POSIX สอดคล้อง) snippet งานที่เกี่ยวกับLinux และ MacOSสำหรับการกำหนดจำนวน - ออนไลน์ - ตรรกะหรือทางกายภาพซีพียู ; ดูการแสดงความคิดเห็นสำหรับรายละเอียด

ใช้lscpuสำหรับ Linux และsysctlสำหรับ macOS

หมายเหตุคำศัพท์ : CPUหมายถึงหน่วยประมวลผลที่เล็กที่สุดตามที่ระบบปฏิบัติการเห็น คอร์ที่ไม่ใช่ไฮเปอร์เธรดแต่ละชุดสอดคล้องกับ 1 CPU ในขณะที่ไฮเปอร์เธรดคอร์มีมากกว่า 1 (ปกติ: 2) - ตรรกะ - CPU
Linux ใช้อนุกรมวิธานต่อไปนี้[1]โดยเริ่มจากหน่วยที่เล็กที่สุด:
CPU < core < socket < book < node
โดยแต่ละระดับประกอบด้วย 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] เอกสารmacOSsysctl (3)

โปรดทราบว่าระบบที่ได้รับ BSD นอกเหนือจาก macOS - เช่น FreeBSD - รองรับเฉพาะhw.ncpuกุญแจsysctlซึ่งถูกคัดค้านบน macOS; ฉันไม่มีความชัดเจนที่คีย์ใหม่สอดคล้องกับ:hw.npuhw.(logical|physical)cpu_[max]

เคล็ดลับของหมวกไปยัง @teambob ที่ช่วยแก้ไขlscpuคำสั่งphysical-CPU-count

ข้อแม้ : lscpu -pผลลัพธ์ไม่รวมคอลัมน์ "หนังสือ" ( manหน้าระบุว่า "หนังสือ" เป็นเอนทิตีระหว่างซ็อกเก็ตและโหนดในลำดับชั้นทางอนุกรมวิธาน) หาก "หนังสือ" กำลังเล่นอยู่บนระบบ Linux ที่กำหนด ( ไม่มีใครรู้ว่าเมื่อไหร่และอย่างไร ) คำสั่ง physical-CPU-count อาจอยู่ภายใต้ -report (ขึ้นอยู่กับสมมติฐานที่lscpuรายงาน ID ที่ไม่ซ้ำกันในระดับที่สูงกว่า เอนทิตีระดับชั้นเช่น: 2 คอร์ที่แตกต่างจาก 2 ซ็อกเก็ตที่ต่างกันอาจมี ID เดียวกัน)


หากคุณบันทึกรหัสดังกล่าวข้างต้นเป็นการพูด, เชลล์สคริปต์cpusให้มันปฏิบัติการด้วยchmod +x cpusและวางไว้ในโฟลเดอร์ของคุณ$PATHคุณจะเห็นผลลัพธ์ดังต่อไปนี้:

$ cpus
logical  4
physical 4

[1] Xaekaiฉายแสงในสิ่งที่หนังสือคือ: " หนังสือเป็นโมดูลที่ใช้แผงวงจรที่มีซีพียูซ็อกเก็ต RAM ซ็อกเก็ตการเชื่อมต่อ IO ตามขอบและตะขอสำหรับการรวมระบบทำความเย็นพวกเขาใช้ในเมนเฟรมไอบีเอ็ม ข้อมูลเพิ่มเติม: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "


1
ใช่ขออภัยคุณถูกต้องเกี่ยวกับคำสั่ง sort ฉันไม่พบข้อมูลเกี่ยวกับหนังสือนอกเหนือจากคู่มือ lscpu ฉันคิดว่ามันเกี่ยวข้องกับ NUMA en.wikipedia.org/wiki/Non-uniform_memory_access
teambob

2
ฉันคิดว่าวิธีแก้ปัญหาส่วนใหญ่ที่นี่ไม่สนใจเครื่องมัลติซ็อกเก็ตซึ่งแตกต่างจากอันนี้ ขอบคุณ!
dividebyzero

1
ในแง่ของ linux มีบริบทมากมายที่ lscpu ไม่พร้อมใช้งานเช่นอิมเมจของตัวติดตั้ง ฉันชอบมัน .. หวังว่ามันจะเป็นที่แพร่หลาย
Brian Chrisman

43

lscpu รวบรวมแบบฟอร์มข้อมูลสถาปัตยกรรม CPU / proc / cpuinfon ในรูปแบบที่มนุษย์สามารถอ่านได้:

# 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


13

สิ่งนี้ใช้ได้สำหรับฉัน tail -nXช่วยให้คุณคว้าเฉพาะเส้น X สุดท้าย

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

หากคุณมีไฮเปอร์เธรดเธรดนี่ควรใช้เพื่อจับจำนวนแกนทางกายภาพ

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

1
คือ "^ core id" สำหรับแกนประมวลผลทางกายภาพทั้งหมดหรือเพียงแค่ p-cores บนโปรเซสเซอร์เดียว?
Richard

1
มีหนึ่งบรรทัด id หลักต่อหนึ่งฟิสิคัลคอร์ที่เป็นเอกลักษณ์ในระบบ ผมไม่ทราบว่าตัวเลขจะเริ่มต้นที่ศูนย์การประมวลผลทางกายภาพที่สอง แต่ ...
lunixbochs

1
หากคุณมีตัวประมวลผลทางกายภาพมากกว่าหนึ่งตัวคุณจะต้องดูที่ "รหัสทางกายภาพ" ด้วย
แอนน์

บรรทัดแรกไม่ได้ผลสำหรับฉัน มันใช้งานได้สำหรับฉัน cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -lและแสดงหมายเลขที่ถูกต้อง
jaylweb

11

สำหรับจำนวนแกนทางกายภาพทั้งหมด:

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 ฉันได้เขียนเวอร์ชันที่กระชับมากขึ้นในความคิดเห็น


10

คุณสามารถใช้ Python ได้! ในการรับจำนวนแกนประมวลผล:

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

ในการรับจำนวนแกนไฮเปอร์เธรด:

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

ด้วย python 2.7.15 คำสั่งเหล่านี้จะไม่พิมพ์อะไรเลย ใน REPL พวกเขาทำ
Vytenis Bivainis

1
@VytenisBivainis ขอบคุณฉันคงคำตอบของฉัน!
ostrokach

9

โซลูชัน Crossplatform สำหรับ Linux, MacOS, Windows:

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

9

นี่คือวิธีที่ฉันใช้ในการนับจำนวนคอร์ฟิสิคัลที่ออนไลน์บน 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

ทำงานและจัดการกับซ็อกเก็ตได้หลายตัว
jbo5112

นี่คือคำตอบที่ดีที่สุด
Jorma Rebane

7

การใช้ getconf นั้นเป็นวิธีที่พกพาได้มากที่สุดอย่างไรก็ตามตัวแปรมีชื่อต่างกันใน BSD และ Linux เพื่อให้ได้รับดังนั้นคุณต้องทดสอบทั้งสองอย่างตามที่สรุปดังนี้: https://gist.github.com/jj1bdx/5746298 (รวมถึง การแก้ไข Solaris โดยใช้ ksh)

ฉันเองใช้:

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

และถ้าคุณต้องการสิ่งนี้ในไพ ธ อนคุณสามารถใช้ syscall getconf ที่ใช้โดยการนำเข้าโมดูลระบบปฏิบัติการ:

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

สำหรับnprocส่วนนี้เป็นส่วนหนึ่งของ GNU Coreutils ดังนั้นจึงไม่สามารถใช้ได้ใน BSD ตามค่าเริ่มต้น มันใช้ sysconf () เช่นกันหลังจากวิธีอื่น ๆ


6

หากคุณต้องการทำสิ่งนี้เพื่อให้สามารถใช้งานได้กับ linux และ OS X คุณสามารถทำได้:

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

ในเหมืองสิ่งนี้จะคืนค่าจำนวนไฮเปอร์เธรด ฉันต้องรู้จำนวนแกนทางกายภาพและจำนวนช่องเสียบด้วย
2465201

ตกลง - คำสั่งเดียวกันที่แน่นอนด้วย hw.physicalcpu ให้ผลนับหลัก ยังไม่แน่ใจเกี่ยวกับจำนวนซ็อกเก็ต ... นอกจากนี้ยังมีซีพียู "เชิงตรรกะ" และ "ใช้งาน" แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร
user2465201

อัปเดตด่วน - ดูเหมือนว่าจะไม่สามารถพกพาได้ ฉันลองมันในกล่อง Linux และดูเหมือนว่าจะอ่านไดเรกทอรี / proc ซึ่งแตกต่างกันไปสำหรับระบบ Linux มากกว่า Mac - ตัวอย่างเช่นไม่มีไดเรกทอรีย่อย hw ที่ถูกกล่าวว่าคุณยังสามารถแยก / proc / cpuinfo
2465201


3

คุณสามารถใช้วิธีใดวิธีหนึ่งดังต่อไปนี้เพื่อกำหนดจำนวนของทางกายภาพแกน CPU

  • นับจำนวนรหัสแกนหลักที่ไม่ซ้ำกัน (เทียบเท่าโดยประมาณ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}'

  • นับจำนวน CPU โลจิคัลที่ไม่ซ้ำกันตามที่ใช้โดยเคอร์เนล Linux ตัวเลือกที่สร้างผลลัพธ์สำหรับการแยกง่ายและเข้ากันได้กับรุ่นก่อนหน้านี้-plscpu

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


เพื่อย้ำสิ่งที่คนอื่นพูดมีคุณสมบัติที่เกี่ยวข้องจำนวนหนึ่ง

วิธีกำหนดจำนวนโปรเซสเซอร์ที่มี:

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

เพื่อกำหนดจำนวนหน่วยการประมวลผลที่มีอยู่ (ไม่จำเป็นต้องเหมือนกับจำนวนแกนประมวลผล) นี่คือไฮเปอร์เธรดเธรด

nproc

ฉันไม่ต้องการที่จะไปไกลเกินไปที่จะลงกระต่ายหลุม แต่คุณยังสามารถกำหนดจำนวนตัวประมวลผลที่กำหนดไว้ (เมื่อเทียบกับที่มีอยู่เพียงแค่การประมวลผล / ออนไลน์) getconf _NPROCESSORS_CONFผ่าน เพื่อตรวจสอบจำนวนของ CPU (ออฟไลน์และออนไลน์) lscpu -apที่คุณต้องการที่จะแยกการส่งออกของ


นี่คือคำตอบที่ถูกต้องหากคุณต้องการแกนประมวลผล
Dinesh

3

ฉันคิดว่าcat /proc/cpuinfoจะให้คำตอบที่ถูกต้องด้วยเช่นกันอย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันเห็นว่าระบบควอดคอร์คอร์เทกซ์ A53 ของฉันแสดงให้เห็นเพียงแกนเดียว ดูเหมือนว่า / proc / cpuinfo จะแสดงเฉพาะแกนที่ใช้งานอยู่ในขณะที่:

cat /sys/devices/system/cpu/present

เป็นการวัดที่ดีกว่าว่ามีอะไรบ้าง นอกจากนี้คุณยังสามารถ

cat /sys/devices/system/cpu/online

เพื่อดูว่าคอร์ใดที่ออนไลน์อยู่และ

cat /sys/devices/system/cpu/offline

เพื่อดูว่าแกนใดออฟไลน์ รายการonline, offlineและpresentsysfs ส่งคืนดัชนีของ CPUS ดังนั้นค่าส่งคืน0หมายถึงคอร์ 0 ในขณะที่ค่าส่งคืนของค่าเฉลี่ยของ1-3คอร์ 1,2 และ 3

ดูhttps://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu


2

ต่อไปนี้ควรให้จำนวนของแกน "ของจริง" บนทั้งระบบที่มีไฮเปอร์เธรดและไม่ไฮเปอร์เธรด อย่างน้อยก็ใช้ได้กับทุกการทดสอบของฉัน

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

-1 นี่กลับมา0ในแกนเดียวกับ Opteron 4170 HE แต่กลับมา4ในกล่องหลักแปดที่มี Opteron 3280 ... ส่วนหนึ่งของฉันหวังว่าหนึ่งในสายการบินนี้จะใช้งานได้!
zamnuts

1

ไม่ใช่หน้าเว็บของฉัน แต่คำสั่งนี้จากhttp://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902ทำงานได้ดีสำหรับฉันบน centos มันจะแสดงซีพียูที่แท้จริงแม้เปิดใช้งานไฮเปอร์เธรด

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


+1 ยาวกว่าโซลูชันด้วย "lscpu -p = Core, Socket" แต่ทำงานได้โดยตรงกับการแยกวิเคราะห์ / proc / cpuinfo ไม่จำเป็นต้องใช้ lscpu
Fravadona

1

นับ "core id" ต่อวิธี "รหัสทางกายภาพ" โดยใช้ awk กับ fall-back บน "ตัวประมวลผล" นับหากไม่มี "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)

1
cat /proc/cpuinfo | grep processor

มันใช้งานได้ดี เมื่อฉันลองคำตอบแรกฉันได้รับ 3 CPU เป็นผลลัพธ์ ฉันรู้ว่าฉันมี 4 ซีพียูในระบบดังนั้นฉันเพิ่งทำgrepโปรเซสเซอร์และผลลัพธ์ดูเหมือนว่า:

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

1
 dmidecode  | grep -i cpu | grep Version

ให้ฉัน

เวอร์ชั่น: Intel (R) Xeon (R) CPU E5-2667 v4 @ 3.20GHz

เวอร์ชั่น: Intel (R) Xeon (R) CPU E5-2667 v4 @ 3.20GHz

ซึ่งเป็นนับซ็อกเก็ตที่ถูกต้อง - มองขึ้นE5-2667บอกฉันแต่ละซ็อกเก็ตมี8 coresดังนั้นคูณและจบลงด้วยการข้าม16 cores2 sockets

lscpuให้ฉันที่ไหน20 CPUs- ซึ่งไม่ถูกต้องทั้งหมด - ไม่แน่ใจว่าทำไม (เดียวกันจะไปสำหรับcat /proc/cpu- 20จบลงด้วย


1

เร็วขึ้นโดยไม่ต้องใช้ส้อม

สิ่งนี้ใช้ได้กับ almsost ทั้งหมด .

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

โพสต์นี้เชื่อมโยงกับคำตอบของ String ที่บรรจุอยู่ใน Bash !
F. Hauri

1

หากไม่เป็นไรที่คุณสามารถใช้ Python numexprได้โมดูลจะมีฟังก์ชั่นสำหรับสิ่งนี้:

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

หรืออาจเป็นไปได้ที่จะได้รับข้อมูลนี้จากmultiprocessing.cpu_count()ฟังก์ชั่น

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

หรือใช้งานง่ายยิ่งขึ้น os.cpu_count()

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

1
มีวิธีทำให้งานนี้เป็นคำสั่งในหลามหรือไม่ ตัวอย่างเช่นฉันลอง python -m numexpr.ncores แต่ไม่ได้ผล
MonsieurBeilto

1
@MonsieurBeilto โปรดดูคำตอบที่อัพเดตแล้ว!
kmario23

จำนวนที่ส่งคืนโดยcpu_countไม่ถูกต้องจะไม่ส่งคืนจำนวนคอร์ แต่เพียงจำนวนไฮเปอร์เธรดใน Intel CPUs
Antti Haapala

1

หากคุณเพียงต้องการนับจำนวนแกนทางกายภาพคำสั่งนี้จะให้ฉัน

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

ค่อนข้างธรรมดา แต่ดูเหมือนว่าจะนับคอร์จริงตามจริงโดยไม่นับจำนวนตรรกะ


0

Python 3 ยังมีวิธีง่ายๆในการรับ:

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

4

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

4


สิ่งนี้จะคืนค่า 8 สำหรับฉันเมื่อฉันมี 4 คอร์ที่มี 2 เธรดในแต่ละ ...
Antti Haapala


0

ข้อมูลสรุป: เพื่อรับCPU จริงให้ทำดังนี้

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

ที่จะได้รับทางกายภาพและตรรกะซีพียูทำเช่นนี้:

grep -c ^processor /proc/cpuinfo

/proc << นี่คือแหล่งทองของข้อมูลใด ๆ ที่คุณต้องการเกี่ยวกับกระบวนการและ

/proc/cpuinfo << เป็นแหล่งทองของข้อมูล CPU ใด ๆ


การนับ CPU จริงไม่ทำงานกับคอมพิวเตอร์หลายซ็อกเก็ต เพื่อที่คุณจะต้องเชื่อมโยงแต่ละ 'core id' กับ 'รหัสทางกายภาพ'
Fravadona
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.