ฉันมีสคริปต์นี้ แต่ฉันไม่ทราบวิธีการรับองค์ประกอบสุดท้ายในงานพิมพ์:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
องค์ประกอบสุดท้ายควรเป็นจำนวนของ CPU ลบ 1
tail -n 1
ของบรรทัดสุดท้ายและพิมพ์ออกมา
ฉันมีสคริปต์นี้ แต่ฉันไม่ทราบวิธีการรับองค์ประกอบสุดท้ายในงานพิมพ์:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
องค์ประกอบสุดท้ายควรเป็นจำนวนของ CPU ลบ 1
tail -n 1
ของบรรทัดสุดท้ายและพิมพ์ออกมา
คำตอบ:
grep -c ^processor /proc/cpuinfo
จะนับจำนวนบรรทัดที่ขึ้นต้นด้วย "processor" ใน /proc/cpuinfo
สำหรับระบบที่มีเธรดมากเกินไปคุณสามารถใช้ได้
grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}'
ซึ่งควรกลับ (ตัวอย่าง) 8
(ในขณะที่คำสั่งข้างต้นจะกลับมา16
)
grep -c '^processor' /proc/cpuinfo
บน zsh
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
จะส่งคืนหมายเลขที่ไม่ถูกต้องเช่นกันถ้าหมายเลข CPU นั้นเป็น 0
การประมวลผลเนื้อหาของ/proc/cpuinfo
คือบาร็อคที่ไม่จำเป็น ใช้nprocซึ่งเป็นส่วนหนึ่งของ coreutils ดังนั้นจึงควรมีอยู่ในการติดตั้ง Linux ส่วนใหญ่
คำสั่งnproc
พิมพ์จำนวนหน่วยการประมวลผลที่มีให้กับกระบวนการปัจจุบันซึ่งอาจน้อยกว่าจำนวนตัวประมวลผลออนไลน์
หากต้องการค้นหาจำนวนแกนประมวลผล / โปรเซสเซอร์ที่ติดตั้งทั้งหมดให้ใช้ nproc --all
บนเครื่อง 8-core ของฉัน:
$ nproc --all
8
nproc
ไม่ดีไม่ได้เป็นส่วนหนึ่งของ boot2docker
โซลูชันแบบพกพาที่ฉันพบคือgetconf
คำสั่ง:
getconf _NPROCESSORS_ONLN
สิ่งนี้ใช้ได้กับทั้ง Linux และ Mac OS X ข้อดีอีกอย่างของวิธีนี้คือการที่ getconf มีมานานแล้ว บางส่วนของเครื่อง Linux เก่าที่ฉันต้องทำในการพัฒนาไม่ได้มีnproc
หรือlscpu
คำสั่งที่ใช้ได้ getconf
แต่พวกเขามี
หมายเหตุของบรรณาธิการ: ในขณะที่getconf
ยูทิลิตี้ได้รับคำสั่ง POSIXเฉพาะ_NPROCESSORS_ONLN
และ_NPROCESSORS_CONF
ค่าไม่ได้ ที่กล่าวว่าตามที่ระบุไว้พวกเขาทำงานบนแพลตฟอร์มลินุกซ์เช่นเดียวกับบน MacOS; บน FreeBSD / PC-BSD คุณจะต้องไม่นำ_
หน้า
_NPROCESSORS_ONLN
ใน POSIX คุณสามารถลิงค์ไปได้หรือไม่
คำนำ:
ปัญหากับ/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
โปรดทราบว่าระบบที่ได้รับ BSD นอกเหนือจาก macOS - เช่น FreeBSD - รองรับเฉพาะhw.ncpu
กุญแจsysctl
ซึ่งถูกคัดค้านบน macOS; ฉันไม่มีความชัดเจนที่คีย์ใหม่สอดคล้องกับ:hw.npu
hw.(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 "
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
สิ่งนี้ใช้ได้สำหรับฉัน tail -nX
ช่วยให้คุณคว้าเฉพาะเส้น X สุดท้าย
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
หากคุณมีไฮเปอร์เธรดเธรดนี่ควรใช้เพื่อจับจำนวนแกนทางกายภาพ
grep "^core id" /proc/cpuinfo | sort -u | wc -l
cat /proc/cpuinfo | awk '/^processor/{print $3}'| 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 ฉันได้เขียนเวอร์ชันที่กระชับมากขึ้นในความคิดเห็น
คุณสามารถใช้ Python ได้! ในการรับจำนวนแกนประมวลผล:
$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
ในการรับจำนวนแกนไฮเปอร์เธรด:
$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
โซลูชัน Crossplatform สำหรับ Linux, MacOS, Windows:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")
นี่คือวิธีที่ฉันใช้ในการนับจำนวนคอร์ฟิสิคัลที่ออนไลน์บน 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
การใช้ 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 () เช่นกันหลังจากวิธีอื่น ๆ
หากคุณต้องการทำสิ่งนี้เพื่อให้สามารถใช้งานได้กับ linux และ OS X คุณสามารถทำได้:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
คุณสามารถใช้วิธีใดวิธีหนึ่งดังต่อไปนี้เพื่อกำหนดจำนวนของทางกายภาพแกน 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 ตัวเลือกที่สร้างผลลัพธ์สำหรับการแยกง่ายและเข้ากันได้กับรุ่นก่อนหน้านี้-p
lscpu
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
ที่คุณต้องการที่จะแยกการส่งออกของ
ฉันคิดว่า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
และpresent
sysfs ส่งคืนดัชนีของ CPUS ดังนั้นค่าส่งคืน0
หมายถึงคอร์ 0 ในขณะที่ค่าส่งคืนของค่าเฉลี่ยของ1-3
คอร์ 1,2 และ 3
ดูhttps://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu
ต่อไปนี้ควรให้จำนวนของแกน "ของจริง" บนทั้งระบบที่มีไฮเปอร์เธรดและไม่ไฮเปอร์เธรด อย่างน้อยก็ใช้ได้กับทุกการทดสอบของฉัน
awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 }; END { print CORES*P }' /proc/cpuinfo
0
ในแกนเดียวกับ Opteron 4170 HE แต่กลับมา4
ในกล่องหลักแปดที่มี Opteron 3280 ... ส่วนหนึ่งของฉันหวังว่าหนึ่งในสายการบินนี้จะใช้งานได้!
ไม่ใช่หน้าเว็บของฉัน แต่คำสั่งนี้จาก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
นับ "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)
cat /proc/cpuinfo | grep processor
มันใช้งานได้ดี เมื่อฉันลองคำตอบแรกฉันได้รับ 3 CPU เป็นผลลัพธ์ ฉันรู้ว่าฉันมี 4 ซีพียูในระบบดังนั้นฉันเพิ่งทำgrep
โปรเซสเซอร์และผลลัพธ์ดูเหมือนว่า:
[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
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 cores
2 sockets
lscpu
ให้ฉันที่ไหน20 CPUs
- ซึ่งไม่ถูกต้องทั้งหมด - ไม่แน่ใจว่าทำไม (เดียวกันจะไปสำหรับcat /proc/cpu
- 20
จบลงด้วย
สิ่งนี้ใช้ได้กับ almsost ทั้งหมด เปลือก.
ncore=0
while read line ;do
[ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
done </proc/cpuinfo
echo $ncore
4
เพื่อที่จะให้เข้ากันได้กับ เปลือก, ชน, busyboxและคนอื่น ๆ ที่ผมเคยใช้แทนncore=$((ncore+1))
((ncore++))
ncore=0
while read -a line ;do
[ "$line" = "processor" ] && ((ncore++))
done </proc/cpuinfo
echo $ncore
4
หากไม่เป็นไรที่คุณสามารถใช้ 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())"
cpu_count
ไม่ถูกต้องจะไม่ส่งคืนจำนวนคอร์ แต่เพียงจำนวนไฮเปอร์เธรดใน Intel CPUs
หากคุณเพียงต้องการนับจำนวนแกนทางกายภาพคำสั่งนี้จะให้ฉัน
lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w
ค่อนข้างธรรมดา แต่ดูเหมือนว่าจะนับคอร์จริงตามจริงโดยไม่นับจำนวนตรรกะ
Python 3 ยังมีวิธีง่ายๆในการรับ:
$ python3 -c "import os; print(os.cpu_count());"
4
$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"
4
ใช้แบบสอบถามด้านล่างเพื่อรับรายละเอียดหลัก
[oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8
ข้อมูลสรุป: เพื่อรับCPU จริงให้ทำดังนี้
grep 'core id' /proc/cpuinfo | sort -u
ที่จะได้รับทางกายภาพและตรรกะซีพียูทำเช่นนี้:
grep -c ^processor /proc/cpuinfo
/proc
<< นี่คือแหล่งทองของข้อมูลใด ๆ ที่คุณต้องการเกี่ยวกับกระบวนการและ
/proc/cpuinfo
<< เป็นแหล่งทองของข้อมูล CPU ใด ๆ
cat
ก่อนawk
แล้ว: เพียงแค่เหมือนว่า:awk '<script>' /proc/cpuinfo
awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
และคุณจะได้โดยไม่ต้อง "ลบหนึ่ง"