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


231

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ư lscpulệnh. 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?


1
Lệnh đơn giản của tôi cho tất cả người dùng: $ grep preseor / Proc / cpuinfo | wc -l
สมหวัง แนวหน้

6
Hình ảnh văn bản của bạn không hữu ích lắm . Nó không thể được sao chép vào một trình soạn thảo và nó không lập chỉ mục rất tốt, có nghĩa là những người dùng khác có cùng vấn đề sẽ ít tìm thấy câu trả lời ở đây. Vui lòng chỉnh sửa bài đăng của bạn để kết hợp trực tiếp văn bản có liên quan (tốt nhất là sử dụng bản sao + dán để tránh lỗi sao chép).
Toby Speight

Câu trả lời:


117

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


1
Tôi có một ổ cắm, hai cpus cho mỗi ổ cắm, vì vậy điều đó có nghĩa là tổng cộng là 2. Tuy nhiên, nó nói là 4 cpus. Nếu tôi cố gắng nproctôi nhận được 4 trở lại. Sử dụng cat /proc/cpuinfotôi nhận được 4, và do đó có vẻ như câu trả lời này là sai, đối với tình huống của tôi ít nhất.
XUÂN 18/05/2016

14
Không nếu bạn có siêu luồng. Bạn vẫn có 2 lõi vật lý nhưng mỗi lõi hiển thị trong / Proc / cpuinfo hai lần. Nếu bạn xem xét kỹ dưới coreid, bạn có thể thấy rằng bạn có mỗi coreid được liệt kê hai lần. Ngoài ra dưới cờ bạn có thể thấy cờ ht.
user1403360

237

Để có được một bức ảnh hoàn chỉnh, bạn cần nhìn vào số lượng luồng 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ố lượng CPU 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ý).

Đây là một ví dụ từ mộ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 nproctươ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 /proc/cpuinfophả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

Các cpu coresbáo cáo /proc/cpuinfotương ứng với các Core(s) per socketbá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 Core cho 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đầu ra cho 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

Các lscpulệnh 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

12
Đây phải là câu trả lời được chấp nhận
gansub

2
Tôi đồng ý. Đây phải là câu trả lời được chấp nhận vì nó giải thích rõ hơn về chủ đề này.
Rafael

Tôi nghĩ rằng thêm lscpu --all --extendedsẽ là một bổ sung hữu ích nhưng tôi không còn có quyền truy cập vào các máy cụ thể này.
htaccess

Bạn cũng có thể tránh awk và một phép nhân rõ ràng:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský

@Jakub Klinkovský, cảm ơn bạn đã chỉ ra điều đó nhưng trong trường hợp này tôi muốn thực sự chứng minh sự nhân lên của Socket(s) * Core(s) per socket. Đưa ra những gì tôi vừa nói tôi đoán echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))sẽ tốt hơn để mọi người có thể thấy chính xác những gì đang được nhân lên ...
htaccess

61

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

$ nproc --all
12

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


10
Điều này là không chính xác, đầu ra của nproc tương ứng với số lượng CPU từ lscpu. Nếu bạn có lõi đa luồng thì đầu ra của nproc sẽ không khớp với số lõi bạn có.
htaccess

2
Đối với một giải pháp không root, một hack sẽ là sử dụng top và nhấn 1. Điều này sẽ hiển thị số lượng lõi có sẵn . Tại sao tôi thấy "khả dụng" là do phần cứng bên dưới có thể có nhiều lõi hơn như một đám mây.
Nhảy Bunny

@htaccess Ít nhất là trên Ubuntu, điều này tạo ra số lượng CPU logic trực tuyến chính xác
Wil

1
@htaccess ok tôi hiểu rồi. Thông thường khi một trình quản lý linux hỏi có bao nhiêu lõi, nghĩa là có bao nhiêu luồng logic. Về mặt kỹ thuật, linux đã sai khi gọi các chủ đề phần cứng là 'cpus'. Máy của bạn có 1 CPU với 2 lõi và 4 luồng phần cứng SMT. Kết quả là có một sự mơ hồ rất lớn về kết quả của CPU và lõi. Nhưng tôi hiểu ý bạn rồi, ty.
Wil

1
@ Khi bạn gọi điều này trong câu trả lời của tôi ở trên: "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". Cá nhân tôi không đánh đồng "lõi" với các đơn vị xử lý logic mà là các lõi vật lý trong bộ xử lý (tức là các đơn vị xử lý vật lý).
htaccess

19

Để 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 các 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 hướng dẫn riêng biệt . Hai luồng có thể được thực hiện song song.
  • Mỗi lệnh được đưa cho một CPU sẽ đượ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 các đơn vị phần cứng khác nhau . Ví dụ, các hướng dẫn 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 hướng dẫn tải / lưu trữ từ bộ nhớ được thực thi bởi một số đơn vị bộ nhớ .

  • Một lõi dùng để chỉ một tập hợp các phần cứng thực hiện thực tế (tức là mỗi lõi có một ALU, một đơn vị bộ nhớ, vv ...)

  • 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 ...
  • Một ổ cắm là khe vật lý trên bo mạch chủ mà chip được đưa vào. 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ờ.


14

Bạn cũng có thể sử dụng lệnh cat /proc/cpuinfosẽ 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 : 3như trong trường hợp này, máy của bạn có 4 lõi.


Cảm ơn lệnh này mô tả thông tin một cách chi tiết. :)
Mr ASapes 24/07/2015

Đối với lệnh một lớp lót, bạn có thể sử dụnggrep -c ^processor /proc/cpuinfo
Wildcard

5
getconf _NPROCESSORS_ONLN

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


1
Điều đó hơi khác nhau (và hữu ích cho một số nhu cầu). Đó là số lượng bộ xử lý đang trực tuyến (nghĩa là có sẵn để chạy các quy trình). Nó có thể ít hơn tổng số CPU nếu một hoặc nhiều thiết bị ngoại tuyến (ví dụ: trong thời gian ngủ đông hoặc trong khi thêm / xóa bộ xử lý).
Toby Speight

getconf _NPROCESSORS_CONFgiúp bạn có số lượng bộ xử lý được cấu hình. Bạn cũng có thể nhận được giá trị của cả hai macro này bên trong mã nguồn C bằng cách sử dụng sysconf()hàm. Nhập man sysconfđể biết thêm thông tin.
Galaxy

4
[root@xxxxx ~]#  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

Làm gì t 4cho dmidecode? Làm thế nào để số lượng & dòng kích hoạt nhân lên? Ví dụ của bạn có hiển thị 2 lõi, hoặc 6, hoặc 12 hoặc 24 hoặc một số số khác không?
Xen2050

@ Xen2050 4processor, xem linux.die.net/man/8/dmidecode . Nhưng sử dụng 4như là đối số là một thực hành xấu.
JohnKoch

bash: dmidecode: command not found
Cameron Hudson

3
$ 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.


2
Điều này đơn giản, nhưng tôi không chắc nó chính xác cho câu hỏi. Anh ta hỏi số lõi: (lõi! = Cpus) nếu siêu phân luồng được bật. Hệ thống của tôi có 24 lõi: 48 cpus khi siêu phân luồng. Ngoài ra, sử dụng lệnh thứ hai được cung cấp ls -d /sys/devices/system/cpu/cpu* | wc -lcho thấy 49 vì có một thư mục cpuidletrong số các cpuNthư mục.
Andrew Falanga

0

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

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

0

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ượng Core / Thread và nó thực sự coi 'CPU' là 'CPU' hoặc 'Core' trong lscpu, không phải 'socket'.


Nếu đây không phải là câu trả lời thì hãy thêm nó dưới dạng bình luận.
Mongrel

@Mongrel Tôi muốn thêm làm nhận xét nhưng nhận xét cần 50 danh tiếng
PickBoy

-2

Gia đình CPU là không liên quan ở đây.

  • CPU (s) = ổ cắm vật lý
  • Core (s) trên mỗi socket - như đã nói
  • vì vậy tổng số lõi = CPU (s) * Core (s) trên mỗi ổ cắm

Trong trường hợp của bạn, bạn có tổng số 4 lõi đầy đủ.

Điều cũng có thể quan trọng, là "Chủ đề trên mỗi lõi". Nhưng bạn có 1, vì vậy không phải trong trường hợp của bạn.


1
Bạn đang nhầm lẫn CPU (s) với socket (s) trong mô tả của bạn.
jlliagre

1
Như jlliagre nói điều này là không chính xác. Cores = Cores per socket X Sockets, xem mô tả trong phản ứng của tôi.
htaccess

-3

Một cách đơn giản để tìm ra số lượng CPU là bằng cách ban hành các lệnh dưới đây:

cat /proc/interrupts | egrep -i 'cpu'

1
Ngắt, hay cpuinfo?
Jeff Schaller

Và tính với tùy chọn -c?
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.