Tôi có tập lệnh này, nhưng tôi không biết làm thế nào để có được phần tử cuối cùng trong bản in:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
Phần tử cuối cùng phải là số lượng CPU, trừ đi 1.
tail -n 1
dòng cuối cùng và in nó.
Tôi có tập lệnh này, nhưng tôi không biết làm thế nào để có được phần tử cuối cùng trong bản in:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
Phần tử cuối cùng phải là số lượng CPU, trừ đi 1.
tail -n 1
dòng cuối cùng và in nó.
Câu trả lời:
grep -c ^processor /proc/cpuinfo
sẽ đếm số lượng dòng bắt đầu bằng "bộ xử lý" trong /proc/cpuinfo
Đối với các hệ thống có siêu phân luồng, bạn có thể sử dụng
grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}'
cái nào sẽ trả về (ví dụ) 8
(trong khi lệnh trên sẽ trả về 16
)
grep -c '^processor' /proc/cpuinfo
trên zsh.
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
cũng sẽ trả về số sai nếu số CPU dựa trên 0.
Xử lý các nội dung của /proc/cpuinfo
là không cần thiết baroque. Sử dụng nproc là một phần của coreutils, vì vậy nó sẽ có sẵn trên hầu hết các bản cài đặt Linux.
Lệnh nproc
in số lượng đơn vị xử lý có sẵn cho quy trình hiện tại, có thể ít hơn số lượng bộ xử lý trực tuyến.
Để tìm số lượng tất cả các lõi / bộ xử lý đã cài đặt, hãy sử dụng nproc --all
Trên máy 8 lõi của tôi:
$ nproc --all
8
nproc
không phải là một phần của boot2docker
Giải pháp di động nhất mà tôi đã tìm thấy là getconf
lệnh:
getconf _NPROCESSORS_ONLN
Điều này hoạt động trên cả Linux và Mac OS X. Một lợi ích khác của việc này so với một số phương pháp khác là getconf đã xuất hiện từ lâu. Một số máy Linux cũ hơn mà tôi phải phát triển không có sẵn nproc
hoặc lscpu
có sẵn các lệnh, nhưng chúng có getconf
.
Chú ý: Trong khi các getconf
tiện ích được POSIX-bắt buộc , cụ thể _NPROCESSORS_ONLN
và _NPROCESSORS_CONF
giá trị thì không. Điều đó nói rằng, như đã nêu, họ làm việc trên các nền tảng Linux cũng như trên macOS; trên FreeBSD / PC-BSD, bạn phải bỏ qua hàng đầu _
.
_NPROCESSORS_ONLN
trong POSIX. Bạn có thể liên kết với nó?
Lời nói đầu:
Các vấn đề với các /proc/cpuinfo
câu trả lời dựa trên là họ thông tin phân tích cái đĩa dành cho người tiêu dùng và do đó thiếu định dạng ổn định được thiết kế cho máy phân tích cú pháp : định dạng đầu ra có thể khác nhau giữa các nền tảng và điều kiện thời gian chạy; sử dụng lscpu -p
trên Linux (và sysctl
trên macOS) bỏ qua vấn đề đó .
getconf _NPROCESSORS_ONLN
/ getconf NPROCESSORS_ONLN
không phân biệt giữa CPU logic và vật lý .
Đây là sh
đoạn mã (tuân thủ POSIX) hoạt động trên Linux và macOS để xác định số lượng CPU - trực tuyến - logic hoặc vật lý ; xem ý kiến để biết chi tiết
Sử dụng lscpu
cho Linux và sysctl
cho macOS.
Thuật ngữ lưu ý : CPU đề cập đến đơn vị xử lý nhỏ nhất mà HĐH nhìn thấy. Mỗi lõi không siêu phân luồng tương ứng với 1 CPU, trong khi các lõi siêu phân luồng chứa nhiều hơn 1 (thông thường: 2) - logic - CPU.
Linux sử dụng các phân loại sau [1] , bắt đầu với các đơn vị nhỏ nhất:
CPU < lõi < ổ cắm < cuốn sách < nút
với mỗi cấp bao gồm 1 hoặc nhiều trường hợp của các cấp thấp hơn tiếp theo.
#!/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
Lưu ý rằng các hệ thống có nguồn gốc BSD khác với macOS - ví dụ: FreeBSD - chỉ hỗ trợ hw.ncpu
khóa cho sysctl
, không được dùng trên macOS; Tôi không rõ khóa nào mới hw.npu
tương ứng với : hw.(logical|physical)cpu_[max]
.
Mẹo đội mũ tới @teambob để giúp sửa lscpu
lệnh đếm CPU-vật lý .
Hãy cẩn thận : lscpu -p
đầu ra KHÔNG bao gồm cột "sách" ( man
trang đề cập đến "sách" là một thực thể giữa ổ cắm và nút trong phân cấp phân loại). Nếu "sách" đang phát trên một hệ thống Linux nhất định ( có ai biết khi nào và bằng cách nào không? ), Lệnh đếm CPU vật lý có thể được báo cáo lại (điều này dựa trên giả định rằng lscpu
báo cáo ID không duy nhất trên cao hơn thực thể -level , ví dụ: 2 lõi khác nhau từ 2 ổ cắm khác nhau có thể có cùng một ID).
Nếu bạn lưu mã ở trên như, giả sử, shell scriptcpus
, làm cho nó có thể thực thi được chmod +x cpus
và đặt nó vào thư mục trong của bạn $PATH
, bạn sẽ thấy đầu ra như sau:
$ cpus
logical 4
physical 4
[1] Xaekai làm sáng tỏ cuốn sách là gì: " cuốn sách là mô-đun chứa bảng mạch với ổ cắm CPU, ổ cắm RAM, kết nối IO dọc theo cạnh và móc để tích hợp hệ thống làm mát. Chúng được sử dụng trong các máy tính lớn của IBM Thông tin khác: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
lscpu
tập hợp biểu mẫu thông tin kiến trúc CPU / Proc / cpuinfon ở định dạng có thể đọc được của con người:
# 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
Xem thêm /unix/468766/under Hiểu-output-of-lscpu .
Điều này làm việc cho tôi. tail -nX
cho phép bạn chỉ lấy các dòng X cuối cùng.
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
Nếu bạn có siêu phân luồng, điều này sẽ hoạt động để lấy số lượng lõi vật lý .
grep "^core id" /proc/cpuinfo | sort -u | wc -l
cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -l
và hiển thị số chính xác.
Đối với tổng số lõi vật lý:
grep '^core id' /proc/cpuinfo |sort -u|wc -l
Trên các máy có nhiều ổ cắm (hoặc luôn luôn), nhân kết quả trên với số lượng ổ cắm:
echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))
@ mkuity0 có một câu trả lời khá hay dưới đây bằng lscpu. Tôi đã viết một phiên bản ngắn gọn hơn trong các ý kiến
Bạn cũng có thể sử dụng Python! Để có được số lượng lõi vật lý:
$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
Để có được số lượng lõi siêu phân luồng:
$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
Đây là cách tôi sử dụng để đếm số lượng lõi vật lý đang trực tuyến trên Linux:
lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines
hoặc nói ngắn gọn:
lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
Ví dụ (1 ổ cắm):
> 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
Ví dụ (2 ổ cắm):
> 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
Ví dụ (4 ổ cắm):
> 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
Sử dụng getconf thực sự là cách dễ mang theo nhất, tuy nhiên biến này có các tên khác nhau trong BSD và Linux để getconf, vì vậy bạn phải kiểm tra cả hai, vì ý chính này gợi ý: https://gist.github.com/jj1bdx/5746298 (cũng bao gồm một bản sửa lỗi Solaris sử dụng ksh)
Cá nhân tôi sử dụng:
$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1
Và nếu bạn muốn điều này trong python, bạn chỉ có thể sử dụng các tiện ích được sử dụng bằng cách sử dụng mô-đun os:
$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'
Về phần nproc
, nó là một phần của GNU Coreutils, do đó, không có sẵn trong BSD theo mặc định. Nó cũng sử dụng sysconf () sau một số phương thức khác.
Nếu bạn muốn làm điều này để nó hoạt động trên linux và OS X, bạn có thể làm:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
Nó rất đơn giản. Chỉ cần sử dụng lệnh này:
lscpu
CPU(s):
.
Bạn có thể sử dụng một trong các phương pháp sau để xác định số lượng lõi CPU vật lý .
Đếm số lượng id lõi duy nhất (gần tương đương với grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l
).
awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo
Nhân số lượng 'lõi trên mỗi ổ cắm' với số lượng ổ cắm.
lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'
Đếm số lượng CPU logic duy nhất được sử dụng bởi nhân Linux. Các -p
tùy chọn tạo ra để dễ dàng phân tích và tương thích với các phiên bản trước của lscpu
.
lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'
Chỉ cần nhắc lại những gì người khác đã nói, có một số thuộc tính liên quan.
Để xác định số lượng bộ xử lý có sẵn:
getconf _NPROCESSORS_ONLN
grep -cP '^processor\t' /proc/cpuinfo
Để xác định số lượng đơn vị xử lý có sẵn (không nhất thiết phải giống với số lượng lõi). Đây là siêu nhận thức.
nproc
Tôi không muốn đi quá xa lỗ thỏ, nhưng bạn cũng có thể xác định số lượng bộ xử lý được cấu hình (trái ngược với bộ xử lý trực tuyến / có sẵn đơn giản) thông qua getconf _NPROCESSORS_CONF
. Để xác định tổng số CPU (ngoại tuyến và trực tuyến) bạn muốn phân tích đầu ra của lscpu -ap
.
Tôi cũng nghĩ cat /proc/cpuinfo
sẽ cho tôi câu trả lời chính xác, tuy nhiên gần đây tôi thấy rằng hệ thống lõi tứ ARM Cortex A53 của tôi chỉ hiển thị một lõi đơn. Có vẻ như / Proc / cpuinfo chỉ hiển thị các lõi hoạt động, trong khi:
cat /sys/devices/system/cpu/present
là một biện pháp tốt hơn của những gì ở đó. Bạn cũng có thể
cat /sys/devices/system/cpu/online
để xem lõi nào đang trực tuyến và
cat /sys/devices/system/cpu/offline
để xem lõi nào đang offline. Các mục online
, offline
và present
sysfs trả về chỉ mục của CPUS, do đó, giá trị trả về 0
chỉ có nghĩa là lõi 0, trong khi giá trị trả về của 1-3
phương tiện là lõi 1,2 và 3.
Xem https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu
Sau đây sẽ cung cấp cho bạn số lượng lõi "thực" trên cả hệ thống siêu phân luồng và không siêu phân luồng. Ít nhất nó đã làm việc trong tất cả các thử nghiệm của tôi.
awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 }; END { print CORES*P }' /proc/cpuinfo
0
về một lõi đơn với Opteron 4170 HE, nhưng trả 4
về hộp tám lõi với Opteron 3280. ... một phần trong tôi thực sự mong muốn lớp lót này hoạt động!
Không phải trang web của tôi, nhưng lệnh này từ http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902 hoạt động độc đáo với tôi trên centos. Nó sẽ hiển thị cpus thực tế ngay cả khi siêu phân luồng được kích hoạt.
cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l
Đếm "id lõi" trên mỗi phương thức "id vật lý" bằng cách sử dụng awk với "bộ xử lý" dự phòng nếu "id lõi" không khả dụng (như mâm xôi)
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
Điều này làm việc tốt. Khi tôi thử câu trả lời đầu tiên, tôi nhận được 3 CPU là đầu ra. Tôi biết rằng tôi có 4 CPU trên hệ thống nên tôi mới làm một grep
bộ xử lý và đầu ra trông như thế này:
[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
dmidecode | grep -i cpu | grep Version
đưa cho tôi
Phiên bản: CPU Intel (R) Xeon (R) E5-2667 v4 @ 3.20GHz
Phiên bản: CPU Intel (R) Xeon (R) E5-2667 v4 @ 3.20GHz
Đó là số lượng ổ cắm chính xác - tra cứu E5-2667
cho tôi biết mỗi ổ cắm có 8 cores
, do đó nhân lên và kết thúc với 16 cores
ngang 2 sockets
.
Nơi lscpu
cho tôi 20 CPUs
- điều đó hoàn toàn không chính xác - không biết tại sao. (cùng đi cho cat /proc/cpu
- kết thúc với 20
.
Công việc này với tất cả vỏ.
ncore=0
while read line ;do
[ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
done </proc/cpuinfo
echo $ncore
4
Để tương thích với vỏ, dấu gạch ngang, bận rộnvà những người khác, tôi đã sử dụng ncore=$((ncore+1))
thay vì ((ncore++))
.
ncore=0
while read -a line ;do
[ "$line" = "processor" ] && ((ncore++))
done </proc/cpuinfo
echo $ncore
4
Nếu bạn có thể sử dụng Python thì không sao, numexpr
mô-đun có chức năng này:
In [5]: import numexpr as ne
In [6]: ne.detect_number_of_cores()
Out[6]: 8
cũng thế này:
In [7]: ne.ncores
Out[7]: 8
Để truy vấn thông tin này từ dấu nhắc lệnh, hãy sử dụng:
# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8
Hoặc đơn giản là có thể lấy thông tin này từ multiprocessing.cpu_count()
chức năng
$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"
Hoặc thậm chí đơn giản hơn là sử dụng os.cpu_count()
$ python -c "import os; print(os.cpu_count())"
cpu_count
là sai, nó không trả về số lượng lõi mà chỉ là số lượng siêu phân luồng trên CPU Intel
Nếu bạn chỉ muốn đếm lõi vật lý, lệnh này đã làm điều đó cho tôi.
lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w
Khá cơ bản, nhưng dường như đếm các lõi vật lý thực tế, bỏ qua số lượng logic
Python 3 cũng cung cấp một vài cách đơn giản để có được nó:
$ python3 -c "import os; print(os.cpu_count());"
4
$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"
4
Sử dụng truy vấn dưới đây để có được chi tiết cốt lõi
[oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8
Tóm tắt: để có được CPU vật lý làm điều này:
grep 'core id' /proc/cpuinfo | sort -u
để có được CPU vật lý và logic làm điều này:
grep -c ^processor /proc/cpuinfo
/proc
<< đây là nguồn vàng của bất kỳ thông tin nào bạn cần về các quy trình và
/proc/cpuinfo
<< là nguồn vàng của bất kỳ thông tin CPU nào.
cat
trướcawk
, dù sao: chỉawk '<script>' /proc/cpuinfo
, như vậy:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. Và bạn vào trong mà không "trừ một".