Lệnh nice trong Linux: đặt độ ưu tiên, đổi bằng renice và đo thực tế phần CPU khi tranh chấp
Lệnh nice trong Linux là lệnh đặt giá trị nice (-20~19), quyết định một chương trình sẽ nhường CPU cho tác vụ khác bao nhiêu khi chạy. Trên một server AlmaLinux 9, hai tác vụ được gắn vào một lõi CPU và đo trong lúc thay đổi giá trị nice; kết quả là phần CPU chỉ bị chia khi tranh chấp CPU, và tác vụ nice 19 chỉ dùng 1,4%.
Tiến trình đang chạy được đổi bằng renice, còn việc nhường ở phía ổ đĩa do ionice đảm nhận. Với cả ba lệnh, đầu ra được đưa nguyên như khi chạy trực tiếp bằng tài khoản root và tài khoản thường.
1️⃣ Lệnh nice trong Linux: phạm vi giá trị và phần CPU khi tranh chấp
Giá trị nice là con số quyết định mức nhường khi chia thời gian CPU, có thể đặt từ -20 đến 19. Chương trình thường chạy với 0; -20 được xử lý trước nhất và 19 nhường nhiều nhất.
Dễ nghĩ rằng số càng lớn càng được xử lý trước, nhưng giá trị nice thì ngược lại. Bộ lập lịch của Linux gán trọng số cho từng giá trị nice và chia thời gian CPU theo tỉ lệ đó: nice 0 là 1024, 10 là 110 và 19 là 15.
Việc nhường chỉ xảy ra khi tranh chấp CPU. Nếu có CPU rảnh, tác vụ nice 19 cũng chạy ngay mà không phải chờ. Giống như ghế ưu tiên trên xe buýt: khi còn trống ai cũng ngồi được, chỉ khi xe đông mới nhường chỗ.
Bảng trọng số này là mảng [sched_prio_to_weight] trong mã nguồn kernel Linux [kernel/sched/core.c], được thiết kế để mỗi khi giá trị nice tăng 1 thì thời gian CPU giảm khoảng 10%.
2️⃣ Cách dùng nice cơ bản: +10 khi bỏ số, và giá trị ngoài phạm vi
Đặt một lệnh sau nice thì lệnh đó chạy với giá trị nice đã đổi; gõ nice không kèm lệnh thì sẽ in giá trị nice của shell hiện tại.
nice0Ví dụ dưới đây là lệnh để bash được chạy tự in giá trị nice của chính nó bằng [ps -o ni=]. Chạy không có -n thì giá trị hiện tại được cộng 10, còn -n 5 thì cộng 5.
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5Giá trị vượt phạm vi được đưa về giá trị biên mà không báo lỗi, nên -n 50 chạy với 19.
nice -n 50 bash -c 'ps -o ni= -p $$' 19Chỉ tài khoản root mới đẩy lên trước bằng giá trị âm được. Tài khoản thường sẽ nhận cảnh báo [cannot set niceness], và lệnh vẫn chạy với nice 0.
# tài khoản thường
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# tài khoản root
nice -n -5 bash -c 'ps -o ni= -p $$' -5Tiến trình con do lệnh chạy bằng nice khởi chạy tiếp cũng chạy với cùng giá trị nice.
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7Vì vậy, nếu chạy một script bằng nice thì mọi lệnh bên trong cũng nhường theo.
3️⃣ renice: đổi giá trị nice của tiến trình đang chạy
nice chỉ đặt giá trị lúc khởi chạy, nên tiến trình đang chạy được đổi bằng renice. Trước tiên hãy kiểm tra PID và giá trị hiện tại ở cột NI của top hoặc bằng ps.
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10Như đầu ra cho thấy, renice -n không cộng vào giá trị hiện tại mà đặt thành giá trị chỉ định, nên kết quả là 10 chứ không phải 15 (5 cộng 10). Không giống bấm nút ▲ trên điều khiển máy lạnh để tăng một nấc, mà giống đặt nhiệt độ mong muốn là 24 độ.
Tài liệu chính thức của util-linux cũng mô tả -n là giá trị tuyệt đối, còn cách cộng thêm do tùy chọn [--relative] ở phiên bản mới đảm nhận. util-linux 2.37.4 được thử nghiệm chưa có tùy chọn này.
Tài khoản thường chỉ có thể tăng giá trị cho tiến trình của mình, và đã tăng rồi thì không hạ lại được.
# tài khoản thường
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedTài khoản root cũng hạ được, và trong cùng lần thử đã đổi thẳng 10 thành 3.
🔲 Trình mô phỏng nice · renice
Trong trình mô phỏng bên dưới, đăng nhập bằng tài khoản thường, bạn có thể tự gõ nice và renice để xem giá trị nice thay đổi.
4️⃣ Đo thực tế phần CPU khi tranh chấp: nice 0 vs 0·10·19
Tăng giá trị nice không phải lúc nào cũng làm tác vụ đó chậm đi. Phần CPU chỉ giảm khi tranh chấp cùng một CPU với tác vụ khác.
Hai tác vụ được gắn vào một lõi CPU (taskset), rồi script bên dưới, vốn đếm từng số một trong 5 giây, được chạy cùng lúc. Số đếm được càng lớn thì càng dùng nhiều thời gian CPU.
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nScript tăng n thêm 1 cho đến khi hết 5 giây, rồi in giá trị cuối cùng.
Hai tác vụ nice 0 chia đôi, nice 10 dùng khoảng 10% và nice 19 chỉ dùng 1,4%. Kết quả này khớp với tỉ lệ tính từ trọng số của kernel (1024 : 110 là 90,3 : 9,7, còn 1024 : 15 là 98,6 : 1,4).
Khi chạy riêng nice 19 trên cùng lõi, nó đếm được khoảng 650.000–1.140.000 lần trong 5 giây. Không có ai để nhường thì nice 19 cũng dùng trọn CPU; trong lúc thử, tải của server (load average) là 3–5.
5️⃣ ionice: nhường ở phía ổ đĩa và kiểm tra bộ lập lịch
nice chỉ quyết định phần CPU, nên với tác vụ đọc ghi ổ đĩa lâu như sao lưu, hãy dùng ionice để nhường cả thứ tự ổ đĩa. Chạy với -c3 (idle) thì tác vụ chỉ được xử lý khi không có chương trình nào khác dùng ổ đĩa.
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0Tiến trình không được chỉ định gì sẽ hiện là [none]; theo tài liệu kernel, nó được xử lý như lớp best-effort với thứ hạng tính từ giá trị nice của CPU.
Lớp của ionice chỉ có tác dụng khi bộ lập lịch ổ đĩa hỗ trợ, và tài liệu kernel ghi bfq và mq-deadline là các bộ lập lịch hỗ trợ. Cái nằm trong ngoặc vuông là bộ lập lịch đang được dùng.
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqỔ NVMe của server thử nghiệm là [none], nên theo tài liệu chính thức thì đặt ionice có thể không có tác dụng, và tác dụng không được đo riêng. Tên ổ đĩa kiểm tra bằng lsblk.
6️⃣ Dùng nice ở đâu: sao lưu·cron·wp-cli
Thêm nice cho những công việc mất nhiều thời gian nhưng không gấp. Nén bản sao lưu dùng cả CPU lẫn ổ đĩa, nên hãy đặt nice và ionice cùng lúc.
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleNếu công việc đang chạy làm server chậm đi, hãy xem PID trong top rồi tăng giá trị bằng renice; với công việc cron chạy hằng ngày, hãy đặt nice trước lệnh.
0 3 * * * nice -n 10 /usr/local/bin/backup.shTrên server WordPress, nếu chạy các công việc wp-cli lớn như search-replace hay tạo lại ảnh bằng nice -n 10, php-fpm, vốn xử lý yêu cầu của khách truy cập, sẽ được dùng CPU trước khi CPU bận.
nice -n 10 wp media regenerate --yesNgược lại, đừng tăng giá trị nice cho php-fpm hay chính web server. Nếu tiến trình trả lời khách truy cập nhường, trang sẽ phản hồi chậm hơn khi CPU bận.
🔢 FAQ & nội dung đề xuất









ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.
