Chạy tiến trình linux với mức độ ưu tiên rất thấp?


12

Tôi có quy trình thường xuyên không quá quan trọng nhưng sẽ tiêu tốn rất nhiều năng lượng CPU và tôi có một quy trình khác thực sự quan trọng, nhưng nó dành phần lớn thời gian nhàn rỗi, nhưng khi có một công việc thì nó thực sự cần sức mạnh tính toán cao

Tôi cố gắng chạy với nice -20 ./low_priority_processnice --20 ./high_priority_processnhưng vẫn là ưu tiên thấp hơn tiêu thụ số lượng đáng kể của CPU khi quá trình ưu tiên cao là có nhu cầu, làm thế nào tôi có thể chạy một quá trình mà thực sự sẽ mang lại hoặc thậm chí tự động đình chỉ khi quá trình khác sử dụng sức mạnh của CPU


Làm thế nào bạn xác định rằng quá trình ưu tiên cao là thực sự cần thiết?
muru

nó sẽ sinh ra rất nhiều chủ đề, hoặc quá trình ăn cpu hơn 50% dung lượng cpu
uray

Sử dụng RRlập kế hoạch cho quá trình ưu tiên cao.
Ramesh

@Ramesh Điều gì khác biệt có thể sẽ làm cho?
Ken Sharp

Câu trả lời:


10

Hãy nhìn vào các nhóm , nó sẽ cung cấp chính xác những gì bạn cần - đặt trước CPU (và hơn thế nữa). Tôi khuyên bạn nên đọc mức độ ưu tiên kiểm soát của các ứng dụng bằng cách sử dụng các nhóm .

Điều đó nói rằng, đặt các quy trình quan trọng nhưng thường nhàn rỗi thành nhóm với 95% CPU và các ứng dụng khác của bạn được phân bổ vào 5% khác - bạn sẽ nhận được (gần như) toàn bộ năng lượng cho công việc của mình khi cần, trong khi liên tục quá trình đói năng lượng sẽ chỉ nhận được 5% nhiều nhất tại những thời điểm đó. Khi sự đột biến tính toán biến mất, tất cả hiệu năng của CPU sẽ bị ném vào các tiến trình còn lại. Như một lợi ích, nếu bạn tạo một nhóm đặc biệt (với yêu cầu hiệu suất tối thiểu) cho các quy trình như sshd, bạn sẽ có thể đăng nhập bất kể điều gì đang cố gắng để có được tất cả CPU có thể - một số thời gian CPU sẽ được dành cho sshd.


1
Có một lệnh như cpulimithoặc niceđể sửa đổi các nhóm của quá trình? bởi vì nếu cgroup là một lệnh gọi API, tôi ở vị trí không thể biên dịch lại bất kỳ ứng dụng nào để sử dụng cgroup
uray

Không, bạn chỉ cần gắn hệ thống phân cấp cgroup ở đâu đó, tạo các thư mục theo nhóm và viết các quy trình PID vào một số tệp. Tất cả điều này phải được thực hiện như root (hoặc, chính xác hơn với các đặc quyền phù hợp). Một số hệ thống init (cụ thể là systemd, ít nhất là trong một số trường hợp) "đánh cắp" giao diện cgroups từ những người dùng phải sử dụng giao diện hệ thống init (thường là một lệnh đặc biệt). Đọc câu trả lời được liên kết và bài viết trên wikipedia. Có thật không. :)
peterph

Ồ, và cũng có libcgroupgói, đi kèm với các tiện ích để làm việc với các nhóm bao gồm một daemon ( cgrulesengd) thực sự có thể sắp xếp các quy trình thành các nhóm tùy thuộc vào một số điều kiện.
peterph

7

Nếu mức độ ưu tiên của quá trình (giá trị đẹp) thấp thì nó sẽ không làm gián đoạn quá trình ưu tiên cao hơn. Lý do bạn thấy quy trình ưu tiên thấp vẫn tiêu thụ một lượng CPU đáng kể khi quy trình ưu tiên cao hơn đang chạy là do quy trình ưu tiên cao hơn không quá bận rộn. Có lẽ đang chờ đợi trên IO. Sử dụng chrt -p -i 0 $PIDđể chạy quy trình với mức độ ưu tiên thậm chí thấp hơn nice 19 -p $PID(giả sử chúng ta đang nói về Linux ở đây).

chrt -p -i 0 $PID đặt quá trình vào bộ lập lịch nhàn rỗi "thật".

http://linux.die.net/man/1/chrt


2
chrt -p -i 0 $ PID
Robert Foss

Chrt vẫn chưa đủ. Những gì tôi đang cố gắng làm là xem video trong khi mã hóa lại các video khác trong nền. Sử dụng chrt đã giúp với video youtube nhưng mkv chất lượng rất cao vẫn bỏ qua. Điều tôi muốn là phát lại video của mình một cách bình thường nhưng sử dụng từng chút năng lượng CPU còn lại để mã hóa lại vì tôi có một lô rất lớn để làm.
soger

0

Hãy thử ví dụ này để chạy một quy trình như một quy trình thấp.

Nếu công việc của bạn là tar xvf asets.zip đẹp

Sử dụng

tài sản tar xvf đẹp.zip

Sau đó, vấn đề

trên cùng để theo dõi quá trình giải nén với

ps phụ | grep "hắc"

Hãy thử một cái gì đó cụ thể với cpulimit

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 trăn 0 9999999999> / dev / null &


yeah -20là "mức độ ưu tiên thấp" và --20"mức độ ưu tiên cao" nhìn vào dấu gạch ngang kép cho nicelệnh. và vâng tôi hiểu hoàn toàn về giá trị tốt đẹp, nhưng câu hỏi của tôi là, có cách nào để nói với người lập lịch ngoài việc sử dụng giá trị tốt hay không
uray

2
@ user77710 bạn có chắc không? Cả manpage Ubuntu lẫn manpage POSIX đều không xác định cú pháp này. Cả hai sử dụng -n -20, -n 20vv
muru

ừ sao cũng được, cú pháp không quan trọng, quan điểm của tôi là giải quyết giá trị tốt ở mức rất thấp và rất cao cho cả hai quá trình không mang lại kết quả như tôi muốn
uray

2
@ user77710 LÀ GÌ? "Cú pháp không quan trọng"? Làm thế nào bạn có thể chắc chắn rằng bạn đang thiết lập các giá trị độc đáo sau đó?
muru

bởi vì tôi có thể nhìn thấy giá trị đẹp quá trình trên htophoặc tophoặc pshoặc bất cứ điều gì
uray

-1

Trong tương lai-comers, đây là một ví dụ đầy nicevới căng thẳng .

  1. Máy kiểm tra có 2 CPU
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Cài đặt stress:apt-get install stress
  2. Làm cho 2 CPU bận rộn với một cuộc gọi ưu tiên thấp để căng thẳng: nice -20 stress --cpu 2
  3. Kiểm tra việc sử dụng CPU với top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

Điều này cho thấy cả hai CPU đều bị chiếm dụng hoàn toàn.

  1. Khởi chạy một quá trình căng thẳng cpu đơn với mức độ ưu tiên cao: nice --20 stress --cpu 1
  2. Kiểm tra lại việc sử dụng cpu với top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

Điều này cho thấy quá trình căng thẳng lõi đơn có CPU đầy đủ của nó, trong khi các quá trình ưu tiên thấp hơn đều chia sẻ 1 cpu còn lại

  1. Mặt khác, việc tiêu diệt tất cả các stresscuộc gọi trên và chỉ cần kích hoạt một quy trình 3 stress --cpu 3sẽ cung cấp 66% CPU cho mỗi cuộc gọi
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.