Nhiệm vụ không hoạt động trên một loạt các lõi trong cô lập


12

Để nói trước tôi đang sử dụng Debian Wheezy với kernel 3.2 trên chipset AMD64. Máy của tôi có hai lõi Xeon E5-2690. Tôi thiết lập các tham số khởi động để tất cả các lõi trên một CPU được dành riêng cho một quy trình. Để làm điều này, tôi đã đặt segcpus = 8,9,10,11,12,13,14,15 trong grub.

Càng xa càng tốt. Bây giờ hãy nói rằng tôi muốn sử dụng các CPU bị cô lập cho một lệnh nhất định, để đơn giản tôi sẽ chỉ sử dụng một vòng lặp vô hạn đơn giản:

$ tasket -c 8-15 bash -c 'trong khi đúng; làm tiếng vang xin chào> / dev / null; làm xong' &

Cho đến nay là tốt, top cho thấy rằng lõi 8 quay lên mức sử dụng gần 100%. Bây giờ hãy nói rằng tôi khởi chạy lại lệnh đó:

$ tasket -c 8-15 bash -c 'trong khi đúng; làm tiếng vang xin chào> / dev / null; làm xong' &

Bây giờ, top cho thấy các lõi 9-15 không hoạt động và hai quá trình đang chia sẻ lõi 8. Nếu thay vào đó tôi làm điều này:

$ tasket -c 8 bash -c 'trong khi đúng; làm tiếng vang xin chào> / dev / null; làm xong' &

$ tasket -c 9 bash -c 'trong khi đúng; làm tiếng vang xin chào> / dev / null; làm xong' &

Lõi 8 và 9 mỗi cái được sử dụng 100% nếu cần. Điều này chỉ áp dụng cho segcpus vì cùng một bộ tác vụ có lõi 1-7 trải đều các quy trình trên các lõi có liên quan. Hơn nữa, "tasket -p" cho thấy mặt nạ ái lực cho các quy trình 8-15 được đặt chính xác. Nó xuất hiện bộ lập lịch kernel từ chối sử dụng bất cứ thứ gì ngoại trừ lõi thấp nhất được chỉ định trên mặt nạ ái lực cô lập.

Bây giờ thông thường điều này sẽ không phải là một vấn đề lớn với các ví dụ trên của tôi, chỉ cần xác định các lõi riêng lẻ cho mỗi quy trình. Tuy nhiên tôi muốn chạy một ứng dụng đa luồng trên CPU chuyên dụng. Tôi muốn chỉ định bộ lõi và tự động sử dụng nhóm luồng, mà không phải đặt lại riêng mối quan hệ bộ xử lý cho từng luồng riêng lẻ được sinh ra.

Có ai có ý tưởng làm thế nào để có được bộ lập lịch để cung cấp cho tôi nhiều hơn một lõi từ bộ cô lập không?


bạn có thể thử sử dụng một chương trình đa luồng không? bash không phải là đa luồng
c4f4t0r

1
Vâng, đó là những gì ban đầu khiến tôi chú ý (chương trình đa luồng của tôi không sử dụng nhiều hơn một lõi). Một tập lệnh python đơn giản tạo ra nhiều luồng không sử dụng nhiều hơn một lõi khi chạy trên tập cô lập. (Khi chạy trên các lõi không bị cô lập, nó sử dụng tất cả 8 lõi có sẵn).
dùng79126

đọc linuxtopia.org/online_books/linux_kernel/kernel_configuration/ , điều này loại trừ một cpus khỏi bộ lập lịch kernel, nhưng sau khi bạn loại trừ cpus bạn muốn chạy tiến trình trên cpus bị loại trừ?
c4f4t0r

1
Nhân sẽ không lên lịch cho một luồng hoặc xử lý trên segcpu trừ khi mặt nạ ái lực của bộ xử lý chỉ ra rằng nó nên được sử dụng. Mặt khác, cô lập sẽ giống như tắt lõi, khi mục đích là để dành lõi vì lý do người dùng chỉ định và đảm bảo không có quy trình không mong muốn nào sử dụng nó. T tasket đặt mặt nạ ái lực để sử dụng tất cả các lõi trong phạm vi 8-15 (được đặt chính xác khi được kiểm tra trong / Proc) để hạt nhân phải được lên lịch cho quá trình trên các lõi nhàn rỗi.
dùng79126

Câu trả lời:


9

Sau một ngày thất vọng tôi đã xác định được một giải pháp. Hành vi này dường như là một tạo tác của thuật toán lập lịch hạt nhân mặc định (SCHED_OTHER cho distro / kernel này). Thay đổi quy trình sang một thuật toán khác giúp loại bỏ vấn đề, cô lập được sử dụng đầy đủ trên các quy trình / luồng.

Tôi đã kết thúc bằng SCHED_RR, nhưng tôi cũng đã thử nghiệm SCHED_FIFO và SCHED_IDLE cả hai đều hoạt động. Quá trình có thể được khởi chạy với thuật toán thay thế bằng cách sử dụng tiện ích chrt:

$ sudo chrt -r 1 [lệnh]

(Nếu bạn muốn chạy dưới dạng không root, bạn có thể sử dụng tiện ích setcap để bật CAP_SYS_NICE trên tệp nhị phân liên quan đến lệnh)


1
Mặc dù tác vụ đặt mối quan hệ với lõi 0,1, ứng dụng java của tôi chỉ sử dụng lõi đầu tiên. 'sudo chrt -r 1 [lệnh]' cũng giải quyết vấn đề của tôi.
Barry NL
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.