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