2010-09-06 25 views
43

Tôi đang sử dụng pthread trong Linux. Tôi muốn tăng ưu tiên luồng bằng cách đặt các tham số sched_param.priority. Tuy nhiên, tôi không thể tìm thấy nhiều thông tin từ mạng về phạm vi ưu tiên của chuỗi mà tôi có thể đặt hoặc về mô tả ưu tiên của chuỗi.Làm thế nào để tăng ưu tiên luồng trong pthreads?

Ngoài ra, tôi muốn biết về ưu tiên luồng tương đối vì tôi không muốn đặt mức độ ưu tiên của luồng quá cao và khiến hệ điều hành tạm dừng. Ai đó có thể giúp tôi với cái này được không?

Trả lời

48

Chính sách lập lịch Linux mặc định là SCHED_OTHER, không có mức độ ưu tiên nào khác ngoài mức nice để tinh chỉnh bên trong chính sách.

Bạn sẽ phải thay đổi để một chính sách khác lịch sử dụng chức năng pthread_setschedparam (xem thêm man sched_setscheduler)

chính sách kế hoạch 'Normal': (từ sched_setscheduler(2))

SCHED_OTHER the standard round-robin time-sharing policy; 
    SCHED_BATCH for "batch" style execution of processes; and 
    SCHED_IDLE for running very low priority background jobs. 

chính sách lập lịch trình thời gian thực :

SCHED_FIFO a first-in, first-out policy; and 
    SCHED_RR  a round-robin policy. 

Trong trường hợp của bạn, bạn có thể sử dụng SCHED_BATCH vì điều này không yêu cầu quyền root.

Cảnh báo: việc sử dụng sai các chính sách lập lịch trong thời gian thực có thể treo hệ thống của bạn. Đó là lý do tại sao bạn cần quyền root để thực hiện loại thao tác này.

Chỉ cần chắc chắn về những gì máy của bạn có khả năng, bạn có thể sử dụng công cụ chrt từ gói util-linux.
Như một ví dụ:

$ chrt -m 
SCHED_OTHER min/max priority : 0/0 
SCHED_FIFO min/max priority  : 1/99 
SCHED_RR min/max priority  : 1/99 
SCHED_BATCH min/max priority : 0/0 
SCHED_IDLE min/max priority  : 0/0 

Một cách để thải thời gian ít hơn (mà tôi thường sử dụng):

alias batchmake='time chrt --batch 0 make --silent' 

Trong thời gian ở với quyền sử dụng, điều này đẩy các make 15% (trong tôi trường hợp).

Edit: giới thiệu nice, SCHED_BATCH, SCHED_IDLEchrt công cụ. Cho chính xác ! :)

+0

lại: 'SCHED_OTHER', điều này không hoàn toàn chính xác vì mức độ đẹp vẫn có hiệu lực. – Hasturkun

+0

@ Hasturkun: bạn đúng là tinh chỉnh * đẹp *, là lời khuyên cho trình lên lịch (không phải là ưu tiên lên lịch!). Cảm ơn sự chính xác! – levif

+0

bạn không thực sự cần quyền root, chỉ cần cài đặt các rlimits để prio tối đa bạn được phép thiết lập là> 0 – Spudd86

23

POSIX xác định truy vấn, vì vậy bạn có thể yêu cầu hệ điều hành cho phạm vi ưu tiên hợp lệ.

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

Đừng mong đợi lớn lên ưu tiên nghẹt thở máy. Trong thực tế, không mong đợi nó để làm bất cứ điều gì trừ khi bạn đã sử dụng 100% chu kỳ CPU. Đừng ngạc nhiên nếu truy vấn cho bạn biết rằng không có mức độ ưu tiên nào cao hơn giá trị mặc định.

+2

+1 mẹo hay .... –

22

Câu trả lời hiện tại từ levif (đề xuất SCHED_BATCH) không chính xác cho việc triển khai luồng NPTL hiện tại trên Linux (bạn có thể kiểm tra cài đặt hạt nhân của bạn bằng cách chạy 'getconf GNU_LIBPTHREAD_VERSION').

Trong hạt nhân ngày nay, chính sách Lập lịch thời gian thực cho phép thiết lập sched_priority - nó luôn luôn là 0 đối với các chính sách không RT (SCHED_OTHER, SCHED_BATCH và SCHED_IDLE). Lựa chọn duy nhất của bạn cho các chính sách không phải RT là đặt giá trị 'đẹp', ví dụ: bởi setpriority(). Không có thông số kỹ thuật tốt về hành vi chính xác mong đợi bằng cách thiết lập 'đẹp' tuy nhiên, và ít nhất trong lý thuyết nó có thể khác nhau từ phiên bản hạt nhân để phiên bản hạt nhân. Đối với hạt nhân Linux hiện tại 'đẹp' có một hiệu ứng rất mạnh tương tự như ưu tiên, vì vậy bạn có thể sử dụng nó khá nhiều thay thế cho nhau. Để tăng tần suất chuỗi của bạn được lên lịch, bạn muốn thấp hơn giá trị 'đẹp' của mình. Điều này đòi hỏi khả năng CAP_SYS_NICE (thường là gốc, mặc dù không nhất thiết phải, xem http://man7.org/linux/man-pages/man7/capabilities.7.htmlhttp://man7.org/linux/man-pages/man3/cap_set_proc.3.html).

Trong thực tế SCHED_BATCH được thiết kế đối với trường hợp ngược lại với những gì người hỏi yêu cầu: nó được thiết kế cho, công việc CPU-chuyên sâu dài chạy, mà có thể sống với ưu tiên thấp. Nó nói với người lập kế hoạch để hơi trừng phạt ưu tiên thức dậy cho các chủ đề.

Ngoài ra để trả lời một trong các nhận xét trước đó (tôi chưa có đủ danh tiếng để nhận xét - câu trả lời cho câu trả lời này sẽ giúp :)). Có tin xấu là đặc tả POSIX.1 nói rằng 'đẹp' ảnh hưởng đến các quy trình, chứ không phải chủ đề riêng lẻ. Tin tốt là việc triển khai luồng Linux (cả NPTL và các luồng Linux ban đầu) phá vỡ đặc tả và cho phép nó ảnh hưởng đến các luồng riêng lẻ. Tôi thấy thật thú vị rằng điều này thường được gọi trong phần "L BUI" của các trang của người đàn ông. Tôi muốn nói rằng lỗi này nằm trong đặc tả POSIX.1, điều này đã cho phép hành vi này, không phải trong các triển khai được bắt buộc phải cung cấp nó mặc dù đặc tả và đã cố ý và cố ý. Nói cách khác - không phải là một lỗi.

Hầu hết đây là chi tiết về sched (7) người đàn ông (mà vì một lý do không được cung cấp trên hệ thống Fedora 20 của tôi): http://man7.org/linux/man-pages/man7/sched.7.html

Nếu bạn thực sự muốn ảnh hưởng đến sched_priority bạn có thể nhìn vào Các chính sách thời gian thực như SCHED_RR).

+0

"Triển khai chuỗi NPTL hiện tại" là gì? Tôi cần một cái gì đó để so sánh với đầu ra từ 'getconf' trên một mục tiêu kế thừa. – jhfrontz

+3

NTPL (Thư viện chủ đề POSIX gốc) là những gì mà việc thực thi luồng Linux hiện tại được gọi. Nó khác với việc triển khai chuỗi ban đầu đã sử dụng nhiều quy trình để mô phỏng hành vi đa luồng. NTPL đã được giới thiệu trong Linux 2.6. Thêm chi tiết và lịch sử tại đây: https: //en.m.wikipedia.org/wiki/Native_POSIX_Thread_Library – BobDoolittle

Các vấn đề liên quan