Tôi muốn tìm hiểu xem hệ thống của tôi có bao nhiêu lõi, vì vậy tôi đã tìm kiếm cùng một câu hỏi trong Google. Tôi đã nhận được một số lệnh như lệnh lscpu
. Khi tôi thử lệnh này, nó cho tôi kết quả như sau:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 23
Stepping: 10
CPU MHz: 1998.000
BogoMIPS: 5302.48
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 2048K
NUMA node0 CPU(s): 0-3
Đặc biệt, đầu ra này cho thấy:
Cái nào trong số đó chỉ ra lõi của hệ thống Linux?
Có lệnh nào khác để nói số lượng lõi, hoặc tôi cho rằng nó hoàn toàn sai?
Bạn phải nhìn vào ổ cắm và lõi trên mỗi ổ cắm. Trong trường hợp này, bạn có 1 CPU vật lý (ổ cắm) có 4 lõi (lõi trên mỗi ổ cắm).
Để có được một bức ảnh hoàn chỉnh, bạn cần nhìn vào số lượng chủ đề trên mỗi lõi, lõi trên mỗi ổ cắm và ổ cắm . Nếu bạn nhân các số này, bạn sẽ nhận được số CP trên hệ thống của mình.
CPU = Chủ đề trên mỗi lõi X lõi trên mỗi ổ cắm X socket
CPU là những gì bạn thấy khi bạn chạy htop
(những thứ này không tương đương với CPU vật lý).
Dưới đây là một ví dụ từ máy tính để bàn:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Và một máy chủ:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 32
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
Đầu ra của nproc
tương ứng với số lượng CPU từ lscpu
. Đối với máy tính để bàn ở trên, điều này phải phù hợp với 8 CPU được báo cáo bởi lscpu
:
$ nproc --all
8
Đầu ra của /proc/cpuinfo
Phải khớp với thông tin này, ví dụ trên hệ thống máy tính để bàn ở trên, chúng ta có thể thấy có 8 bộ xử lý (CPU) và 4 lõi (id lõi 0-3):
$ grep -E 'processor|core id' /proc/cpuinfo
processor : 0
core id : 0
processor : 1
core id : 0
processor : 2
core id : 1
processor : 3
core id : 1
processor : 4
core id : 2
processor : 5
core id : 2
processor : 6
core id : 3
processor : 7
core id : 3
cpu cores
Được báo cáo bởi /proc/cpuinfo
Tương ứng với Core(s) per socket
được báo cáo bởi lscpu
. Đối với máy tính để bàn ở trên, điều này phải phù hợp với 4 Lõi trên mỗi ổ cắm được báo cáo bởi lscpu:
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Để trả lời cụ thể câu hỏi của bạn, bạn cho biết bạn có bao nhiêu lõi bằng cách nhân số lõi bạn có trên mỗi ổ cắm với số lượng ổ cắm bạn có.
Lõi = Lõi trên mỗi ổ cắm X Ổ cắm
Đối với các hệ thống ví dụ trên máy tính để bàn có 4 lõi:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
Trong khi máy chủ có 16:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
Một tiện ích hữu ích khác là dmidecode
xuất ra mỗi thông tin ổ cắm. Trong trường hợp hệ thống máy chủ được liệt kê ở trên, chúng tôi hy vọng sẽ thấy 8 lõi trên mỗi ổ cắm và 16 luồng trên mỗi ổ cắm:
$ Sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
Socket Designation: CPU1
Core Count: 8
Thread Count: 16
Socket Designation: CPU2
Core Count: 8
Thread Count: 16
Lệnh lscpu
có một số tùy chọn hữu ích mà bạn có thể muốn kiểm tra, ví dụ:
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Xem man lscpu
Để biết chi tiết.
Tóm tắt:
Để câu trả lời không bị nhầm lẫn, bạn cần hiểu một vài khái niệm kiến trúc máy tính đơn giản:
Có nhiều loại hướng dẫn khác nhau. Logic quyết định bên trong CPU sẽ gửi các hướng dẫn khác nhau đến đơn vị phần cứng. Chẳng hạn, các lệnh số học thực sự được thực hiện bởi một ALU (đơn vị số học/logic), trong khi các lệnh tải/lưu trữ từ bộ nhớ được thực thi bởi một số loại - đơn vị bộ nhớ.
A core đề cập đến một bộ phần cứng thực thi thực tế (nghĩa là mọi lõi đều có ALU, đơn vị bộ nhớ, v.v ...)
Bạn có thể có nhiều CPU chia sẻ một lõi - điều này được gọi là siêu phân luồng.
A socket là khe vật lý trên bo mạch chủ có gắn chip. Con chip này có một số lõi nhất định trên nó.
Ví dụ của OP:
CPU(s): 4
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Một vi dụ khac:
CPU(s): 16
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 2
Hai ổ cắm vật lý, mỗi ổ chứa một chip có 4 lõi vật lý, tạo ra tổng số 8 lõi. Hai luồng nhận được hướng dẫn cho từng lõi (máy này có siêu phân luồng), nghĩa là phải có hai CPU được gắn vào mỗi lõi, tạo ra tổng cộng 8 * 2 = 16 CPU
Máy đầu tiên có thể thực hiện chính xác bốn hướng dẫn tại bất kỳ thời điểm, khoảng thời gian nào. Máy thứ hai có thể thực hiện từ 8 đến 16 lệnh tại bất kỳ thời điểm nào: 16 sẽ chỉ đạt được khi mỗi cặp CPU đang thực hiện các loại hướng dẫn khác nhau và do đó có thể chia sẻ lõi mà không phải chờ.
Bạn cũng có thể sử dụng lệnh cat /proc/cpuinfo
sẽ xuất ra một khối dữ liệu cho mỗi lõi. Mỗi đoạn bắt đầu với thông tin này:
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)
Lõi được đánh số bắt đầu từ 0, vì vậy nếu đoạn cuối nói processor : 3
như trong trường hợp này, máy của bạn có 4 lõi.
getconf _NPROCESSORS_ONLN
(getconf là một phần của glibc)
$ grep -c processor /proc/cpuinfo
8
Đó là tất cả những gì bạn cần. Đây là số lượng lõi trực tuyến, bất kể siêu phân luồng được bật hay tắt.
$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8
Một cách dễ dàng khác.
[[email protected] ~]# dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
Socket Designation: CPU1
Manufacturer: Intel
HTT (Multi-threading)
Version: Intel(R) Xeon(R) CPU L5640 @ 2.27GHz
Core Count: 6
Core Enabled: 6
Thread Count: 12
Socket Designation: CPU2
Manufacturer: Intel
HTT (Multi-threading)
Version: Intel(R) Xeon(R) CPU L5640 @ 2.27GHz
Core Count: 6
Core Enabled: 6
Thread Count: 12
Tôi tìm thấy cách này:
echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
Chỉ muốn thêm một số thông tin vào câu trả lời của @htaccess.
Trong CentOS 6.x, dmidecode không xuất thông tin số lõi/luồng và nó thực sự coi 'CPU' là 'CPU' hoặc 'Core' trong lscpu, không phải 'socket'.