Hành vi bạn thấy gần như chắc chắn vì tính năng tự động nhóm được thêm vào trong Linux 2.6.38 (trong năm 2010). Có lẽ khi bạn mô tả chạy hai lệnh, chúng được chạy trong các cửa sổ thiết bị đầu cuối khác nhau. Nếu bạn đã chạy chúng trong cùng một cửa sổ thiết bị đầu cuối, thì bạn sẽ thấy giá trị đẹp có hiệu lực. Phần còn lại của câu trả lời này làm rõ câu chuyện.
Hạt nhân cung cấp tính năng được gọi là autogrouping để cải thiện hiệu suất máy tính để bàn tương tác khi xử lý đa nhân, khối lượng công việc của CPU chẳng hạn như xây dựng hạt nhân Linux với số lượng lớn quy trình xây dựng song song (ví dụ: cờ make(1) -j
).
Nhóm tự động mới được tạo khi phiên mới được tạo qua setsid(2)
; điều này xảy ra, ví dụ, khi một cửa sổ terminal mới được khởi động. Một quy trình mới được tạo bởi fork(2)
kế thừa số thành viên tự động của nhóm phụ huynh là . Do đó, tất cả các quy trình trong phiên là các thành viên của cùng một nhóm tự động.
Khi bật tính năng tự động nhóm, tất cả các thành viên của nhóm tự động được đặt trong cùng một nhóm tác vụ lên lịch hạt nhân ". Trình lập lịch biểu hạt nhân Linux sử dụng một thuật toán cân bằng sự phân bố của các chu kỳ CPU trên các nhóm nhiệm vụ. Những lợi ích của việc này cho hiệu suất máy tính để bàn tương tác có thể được mô tả qua ví dụ sau.
Giả sử rằng có hai autogroups cạnh tranh cho cùng một CPU (ví dụ, giả sử một trong hai hệ thống CPU đơn hoặc việc sử dụng taskset(1)
để nhốt tất cả các quá trình với cùng CPU trên một hệ thống SMP). Nhóm đầu tiên chứa mười quy trình liên kết CPU từ hạt nhân bắt đầu với make -j10
. Cái còn lại chứa một quá trình liên kết CPU : trình phát video. Ảnh hưởng của tự động nhóm là hai nhóm sẽ nhận được một nửa chu kỳ CPU. Tức là, trình phát video sẽ nhận được 50% chu kỳ CPU, thay vì chỉ 9% chu kỳ, điều này có khả năng sẽ dẫn đến việc phát lại video bị thoái hóa .Tình hình trên hệ thống SMP phức tạp hơn, nhưng hiệu ứng chung giống nhau: bộ lập lịch phân phối các chu kỳ CPU trên các nhóm nhiệm vụ sao cho một nhóm tự động có số lượng lớn các quy trình ràng buộc CPU không kết thúc việc hoán đổi chu trình CPU với chi phí của các công việc khác trên hệ thống.
Giá trị tốt đẹp và lịch nhóm
Khi lên kế hoạch quá trình phi thời gian thực (ví dụ, những người lên kế hoạch theo chính sách mặc định SCHED_OTHER
), các scheduler sử dụng một kỹ thuật gọi là "lịch trình nhóm", theo chủ đề nào được lên lịch trong "nhóm tác vụ". Các nhóm tác vụ được hình thành trong các trường hợp khác nhau, với trường hợp có liên quan ở đây là tự động nhóm.
Nếu autogrouping được kích hoạt, sau đó tất cả các chủ đề được (ngầm) được đặt trong một autogroup (ví dụ, cùng một phiên, như tạo ra bởi setsid(2)
) tạo thành một nhóm nhiệm vụ. Mỗi nhóm tự động mới là do đó, một nhóm nhiệm vụ riêng biệt.
Theo lịch trình nhóm, giá trị đẹp của một chủ đề có tác dụng cho quyết định lập kế hoạch chỉ liên quan đến chủ đề khác trong cùng nhóm nhiệm vụ. Điều này có một số hậu quả đáng ngạc nhiên về mặt ngữ nghĩa truyền thống của một giá trị tốt đẹp trên các hệ thống UNIX là . Đặc biệt, nếu bật tính năng tự động nhóm (mặc định trong các bản phân phối Linux khác nhau), thì sử dụng nice(1)
trên quy trình chỉ có hiệu lực để lên lịch tương ứng với các quy trình khác được thực hiện trong cùng một phiên. .
Ngược lại, đối với hai quá trình được (ví dụ) duy nhất quá trình CPU-bound trong phiên khác nhau (ví dụ, khác nhau terminal cửa sổ, mỗi người có công việc được gắn với autogroups khác nhau), sửa đổi giá trị tốt đẹp của quá trình tại một trong các phiên có không có hiệu lực về các quyết định của lịch trình liên quan đến quy trình trong phiên khác. Đây có lẽ là kịch bản bạn thấy, mặc dù bạn không đề cập rõ ràng bằng cách sử dụng hai cửa sổ đầu cuối.
Nếu bạn muốn ngăn chặn autogrouping can thiệp vào nice
hành vi truyền thống như mô tả ở đây, bạn có thể tắt tính năng
echo 0 > /proc/sys/kernel/sched_autogroup_enabled
Hãy nhận biết mặc dù rằng điều này cũng sẽ có tác dụng vô hiệu hóa những lợi ích cho tương tác máy tính để bàn tính năng autogroup được dự định cung cấp (xem ở trên).
Các autogroup giá trị đẹp
thành viên autogroup của một quá trình có thể được xem qua file /proc/[pid]/autogroup
:
$ cat /proc/1/autogroup
/autogroup-1 nice 0
Tập tin này cũng có thể được sử dụng để thay đổi băng thông CPU phân bổ một autogroup . Điều này được thực hiện bằng cách viết một số trong phạm vi "đẹp" vào tệp để đặt giá trị đẹp của nhóm tự động. Phạm vi cho phép là từ +19 (mức độ ưu tiên thấp) đến -20 (mức độ ưu tiên cao).
Các autogroup khung cảnh đẹp có ý nghĩa tương tự như quá trình giá trị tốt đẹp, nhưng áp dụng cho phân phối của chu kỳ CPU đến autogroup như một toàn thể, dựa trên các giá trị đẹp tương đối của autogroups khác. Đối với một quá trình bên trong một autogroup, CPU chu kỳ rằng nó nhận sẽ là một sản phẩm của giá trị tốt đẹp của autogroup (so sánh với các nhóm khác) và giá trị tốt đẹp của quá trình (so với các quy trình khác trong cùng một nhóm).
các tính toán là gì? Có lẽ không có đủ tranh chấp trên bộ vi xử lý để tạo sự khác biệt – laher
Các tính toán bên trong vòng lặp khá dài. Tôi cũng đã kiểm tra đầu ra của bộ tạo được tạo ra và không có gì được tối ưu hóa (được biên dịch với các cài đặt tối ưu hóa thấp nhất trên gcc). –
có thể trùng lặp của [Hiểu renice] (http://stackoverflow.com/questions/22090126/understanding-renice) – ninjalj