Xác định bộ xử lý cụ thể mà quá trình đang chạy


10

Tôi có quyền truy cập vào một nút 8 lõi của cụm Linux. Khi đăng nhập vào nút, tôi có thể thấy danh sách các bộ xử lý bằng lệnh này:

more /proc/cpuinfo

Trong nút 8 lõi của tôi, các bộ xử lý được đánh số từ 0 đến 7. Mỗi bộ xử lý là CPU Intel Xeon (E5430 @ 2.66GHz).

Bây giờ giả sử tôi gọi chương trình foovới một số đối số args:

foo args

Chương trình foomất nhiều thời gian để thực hiện (ví dụ: giờ hoặc ngày). Đã gọi foo, có thể xác định bộ xử lý cụ thể (nghĩa là 0 đến 7) foođang chạy không? Các topchương trình show cho tôi quá trình ID và thông tin tương tự, nhưng tôi không thấy bộ vi xử lý số . Là thông tin có sẵn?


1
Trừ khi bạn đã làm một cái gì đó cụ thể, quá trình sẽ không ở cùng một CPU mọi lúc. Tại sao bạn cần thông tin đó?
Mat

@Mat Cảm ơn bạn đã dành thời gian. Đây là một câu hỏi riêng biệt, nhưng cuối cùng tôi muốn xem liệu tôi có thể gán hai cuộc gọi foocho hai bộ xử lý khác nhau hay không. Khi tôi gọi foomột lần, nó chạy %CPUrất gần 100% (theo top). Nhưng khi tôi gọi foolần thứ hai, cả hai fooquy trình đều chạy sao %CPUcho cả hai quy trình có tổng giá trị nhỏ hơn 100% (thường là khoảng 45% cho mỗi fooquy trình). Đối với tôi, điều này cho thấy rằng hai cuộc gọi foosẽ chạy trên cùng một bộ xử lý (mặc dù có sẵn tám bộ xử lý); Tôi muốn xác minh rằng đây là trường hợp.
Andrew

1
Thuật ngữ này được gọi là mối quan hệ bộ xử lý
slm

1
Bộ lập lịch cho phép mọi thứ chạy trên nhiều bộ xử lý (khác nhau) .... TUY NHIÊN, chương trình của bạn phải được xây dựng như một chương trình đa luồng để tận dụng việc sử dụng nhiều xử lý đồng thời trên một chương trình hoặc tác vụ cụ thể. Tùy thuộc vào người lập trình ứng dụng, các chương trình java cố gắng làm điều này.
mdpc

Câu trả lời:


11

pscó thể cung cấp cho bạn thông tin đó nếu bạn yêu cầu psrcột (hoặc sử dụng -Fcờ bao gồm nó).

Ví dụ:

$ ps -F $$
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
me        6415  6413  0  5210  2624   2 18:52 pts/0    SN     0:00 -su

Hoặc là:

$ ps -o pid,psr,comm -p $$
  PID PSR COMMAND
 6415   0 bash

Shell của tôi đang chạy trên CPU 2 khi tôi chạy lệnh đầu tiên, trên CPU 0 khi tôi chạy thứ hai. Coi chừng các quy trình có thể thay đổi CPU rất, rất nhanh vì vậy thông tin bạn thực sự nhìn thấy, về cơ bản, đã cũ.

Một số thông tin khác trong câu trả lời của câu hỏi Siêu người dùng này:

Linux: lệnh để biết số bộ xử lý trong đó một quá trình được tải?


4

Với toptừ procps(nói chung là mặc định trên các bản phân phối Linux hiện nay), trong top, nhấn f, điều hướng đến P = Last User CPU (SMP)và nhấn Spaceđể chọn (bạn cũng có thể di chuyển trường chẳng hạn trước COMMANDtrường bằng Rightphím và sau đó di chuyển lên và xuống). qđể trở về màn hình chính (nơi bạn sẽ thấy quy trình của mình chuyển từ bộ xử lý sang bộ xử lý trừ khi bạn định cấu hình rõ ràng để ở cùng với một). Bạn có thể nhấn Wđể lưu nó làm mặc định.

Nhấn ?để được giúp đỡ.


4

Lệnh tasksetlà những gì bạn đang tìm kiếm:

tasket - truy xuất hoặc thiết lập mối quan hệ CPU của một quá trình

Thí dụ

$ taskset -p 12345
pid 12345's current affinity mask: f

Một mặt nạ fcó nghĩa là tất cả các bộ xử lý, 0x00000001sẽ chỉ là bộ xử lý 0.

$ taskset -c -p 24389 
pid 24389's current affinity list: 0-3

Hiển thị các cpu ở định dạng danh sách. Tôi có 4 lõi trên máy tính xách tay của mình trong ví dụ này.

Xem trang người đàn ông có nhiều chi tiết hơn .


1

Bạn cũng có thể lấy thông tin này trực tiếp từ /proc/[pid]/stat. Đây là trường được phân định không gian thứ 39 (kể từ Linux 2.2.8).

Ví dụ: để hiển thị bộ xử lý CPU mà trình bao hiện tại đang chạy (trong trường hợp này):

cat  /proc/$$/stat | cut -d' ' -f39
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.