tra-loi-cau-hoi-phat-trien-web.com

Làm thế nào để biết số lượng lõi của một hệ thống trong Linux?

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:

  • CPU: 4
  • Lõi (mỗi) ổ cắm: 4
  • Họ CPU: 6

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?

254
Mr ASquare

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).

124
user1403360

Để 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:

  • Bạn cần lưu ý về ổ cắm, lõi và chủ đề
  • Bạn cần cẩn thận với thuật ngữ CPU vì nó có nghĩa là những thứ khác nhau trong các bối cảnh khác nhau
251
htaccess

Bạn có thể lấy thông tin này bằng lệnh nproc(1)

$ nproc --all
12

Nó không yêu cầu quyền root.

61
Anthony Ananich

Để 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:

  • Bạn chạy quy trình ("chương trình") trên hệ thống linux của bạn. Mỗi quá trình bao gồm một hoặc nhiều chủ đề
  • Mỗi luồng là một chuỗi riêng hướng dẫn. Hai luồng có thể được thực hiện song song.
  • Mỗi hướng dẫn được trao cho một CPU để được thực thi. Một CPU có logic chỉ ra các bit của một lệnh có nghĩa là gì và quyết định phải làm gì với 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.

    • Ý tưởng: luồng A hiện đang thực hiện số học, trong khi luồng B đang tải thứ gì đó từ bộ nhớ. Khi đó là sự thật, các luồng A và B có thể chia sẻ một lõi một cách hiệu quả mà không gặp nhau (A sử dụng ALU, B sử dụng đơn vị bộ nhớ). Tất nhiên, đôi khi cả hai chương trình sẽ muốn ALU, và sau đó họ phải chờ nhau ...
  • 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ụ:

Ví dụ của OP:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • một ổ cắm vật lý, chứa một con chip với
  • 4 lõi vật lý (nghĩ tổng cộng 4 ALU và 4 đơn vị bộ nhớ)
  • Chỉ có 1 luồng có thể đưa ra hướng dẫn cho lõi (không siêu phân luồng), có nghĩa là có
  • một CPU cho mỗi lõi, hoặc 4 * 1 = 4 CPU

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ờ.

23
stochastic

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.

14
dr01
getconf _NPROCESSORS_ONLN

(getconf là một phần của glibc)

7
L.R.
$ 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.

4
jwc
[[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
4
reli

Tôi tìm thấy cách này:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
1
Serge Roussak

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'.

0
PickBoy