Làm thế nào để mối quan hệ CPU tương tác với các nhóm trong Linux?


10

Tôi đang cố chạy các điểm chuẩn đa luồng trên một bộ CPU bị cô lập. Để cắt ngắn một câu chuyện dài, ban đầu tôi đã thử isolcpustaskset, nhưng gặp vấn đề . Bây giờ tôi đang chơi với cgroups / csets.

Tôi nghĩ cset shieldtrường hợp sử dụng "đơn giản" sẽ hoạt động tốt. Tôi có 4 lõi, vì vậy tôi muốn sử dụng lõi 1-3 để đo điểm chuẩn (tôi cũng đã cấu hình các lõi này ở chế độ đánh dấu thích ứng), sau đó lõi 0 có thể được sử dụng cho mọi thứ khác.

Theo hướng dẫn ở đây , nó sẽ đơn giản như:

$ sudo cset shield -c 1-3
cset: --> shielding modified with:
cset: "system" cpuset of CPUSPEC(0) with 105 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running

Vì vậy, bây giờ chúng ta có một "lá chắn" được tách ra (bộ người dùng) và lõi 0 dành cho mọi thứ khác (bộ hệ thống).

Được rồi, có vẻ tốt cho đến nay. Bây giờ hãy nhìn vào htop. Tất cả các quy trình nên đã được di chuyển vào CPU 0:

csets

Huh? Một số quy trình được hiển thị là chạy trên lõi được che chắn. Để loại trừ trường hợp htop có lỗi, tôi cũng đã thử sử dụng tasksetđể kiểm tra mặt nạ ái lực của một quá trình được hiển thị như đang ở trong tấm khiên.

Có lẽ những nhiệm vụ đó là không thể di chuyển? Chúng ta hãy thực hiện một quy trình tùy ý hiển thị như đang chạy trên CPU3 (cần nằm trong tấm chắn) htopvà xem liệu nó có xuất hiện trong nhóm hệ thống theo cset:

$ cset shield -u -v | grep 864
   root       864     1 Soth [gmain]
   vext01    2412  2274 Soth grep 864 

Đúng, đó là chạy trên nhóm hệ thống theo cset. Vì vậy htopcsetkhông đồng ý.

Vậy chuyện gì đang xảy ra ở đây? Tôi tin tưởng ai: mối quan hệ cpu ( htop/ taskset) hay cset?

Tôi nghi ngờ rằng bạn không nên sử dụng csetvà mối quan hệ với nhau. Có lẽ chiếc khiên đang hoạt động tốt, và tôi nên bỏ qua mặt nạ ái lực và htopđầu ra. Dù bằng cách nào, tôi thấy điều này khó hiểu. Ai đó có thể làm sáng tỏ?


Phân phối nào bạn đang sử dụng? Tôi yêu cầu bởi vì các công cụ và quy trình công việc là khác nhau, tùy thuộc vào hệ điều hành và phiên bản.
ewwhite

Đó là một hệ thống 8 debian.
Edd Barrett

Ờ được rồi. Trong thế giới Redhat, chúng tôi có numactlcgconfigcgrules/ cgredđể sắp xếp những gì bạn đang làm. Chúng có thể có sẵn cho Debian với một số công việc.
ewwhite

Câu trả lời:


5

Từ tài liệu cpusets :

Các lệnh gọi tới calendar_setaffinity được lọc chỉ cho các CPU được phép trong cpuset của tác vụ đó.

Điều này ngụ ý rằng mặt nạ ái lực CPU được giao với cpus trong nhóm mà quá trình là thành viên.

Ví dụ: Nếu mặt nạ ái lực của một quy trình bao gồm các lõi {0, 1, 3} và quy trình đang chạy trên nhóm hệ thống, được giới hạn ở các lõi {1, 2}, thì quy trình sẽ buộc phải chạy trên lõi 1.

Tôi chắc chắn 99% rằng htopđầu ra là "sai" với thực tế là các quy trình chưa thức dậy kể từ khi các nhóm được tạo và màn hình hiển thị lõi cuối cùng của quy trình được chạy.

Nếu tôi khởi động vim trước khi tạo khiên, vim rèn hai lần (vì một số lý do) và đứa trẻ sâu nhất đang chạy trên lõi 2. Nếu tôi tạo khiên, thì hãy ngủ vim (ctrl + z) và đánh thức nó, cả hai quá trình đều có chuyển đến lõi 0. Tôi nghĩ rằng điều này xác nhận giả thuyết htopđang hiển thị thông tin cũ.

Bạn cũng có thể kiểm tra /proc/<pid>/statusvà nhìn vào các cpus_allowed_*lĩnh vực.

Ví dụ: tôi có một console-kit-daemonquá trình (pid 857) ở đây hiển thị trong htop như đang chạy trên lõi 3, nhưng trong /proc/857/status:

Cpus_allowed:   1
Cpus_allowed_list:      0

Tôi nghĩ rằng điều này nói rằng mặt nạ ái lực là 0x1, cho phép chỉ chạy trên lõi 1 do các nhóm: tức là giao nhau ({0,1,2,3}, {0}) = {0}.

Nếu tôi có thể, tôi sẽ để câu hỏi mở một lúc để xem có câu trả lời nào hay hơn không.

Cảm ơn @davmac đã giúp với điều này (trên irc).


1
Bạn đã đúng, thông tin hiển thị trong HTOP không phải là quy trình hiện tại đang diễn ra, mà là lõi cuối cùng được lên lịch (tương tự với mọi thứ sử dụng cùng giao diện để thu thập thông tin).
Austin Hemmelgarn
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.