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

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8tài khoản root · người dùng thườngKiểm tra ngày 2026-10-17

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ỗ.

🧭 Giá trị nice khi CPU còn dư và khi tranh chấp
Sơ đồ giải thích
🖥️ CPU
⚖️ Tác vụ B
🖥️ Có CPU rảnh nên mỗi tác vụ có một lõi riêng🖥️ Hai tác vụ dùng chung một lõi CPU
Tác vụ Anice 0 · trọng số 1024
100%50.0%90.3%98.6%
Tác vụ Bnice 0 · trọng số 1024nice 10 · trọng số 110nice 19 · trọng số 15
100%50.0%9.7%1.4%
Khi CPU còn dư thì không có ai để nhường, nên tác vụ B dùng trọn CPU bất kể giá trị nice.
Khi tranh chấp cùng một lõi, hai tác vụ nice 0 có trọng số bằng nhau chia đôi thời gian CPU.
Trọng số của nice 10 là 110, khoảng một phần chín của nice 0 (1024), nên thời gian CPU được chia khoảng 90,3 : 9,7.
Trọng số của nice 19 là 15; khi tranh chấp, tác vụ B chỉ dùng khoảng 1,4% thời gian CPU.

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.

nice
0

Ví 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 $$'
 10
nice -n 5 bash -c 'ps -o ni= -p $$'
  5

Giá 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 $$'
 19

Chỉ 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 $$'
 -5

Tiế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 $!'
  7

Vì 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 600
renice -n 10 -p 201643
201643 (process ID) old priority 5, new priority 10

Như đầ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 201649
201649 (process ID) old priority 0, new priority 10
renice -n 5 -p 201649
renice: failed to set priority for 201649 (process ID): Permission denied

Tà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.

Trình mô phỏng lệnh nicenice 8.32 · renice 2.37.4
[root@server work]#
Chỉ chạy trong trình duyệt và không đụng đến tiến trình thật. Đây là server ảo đăng nhập bằng tài khoản thường; bạn có thể chạy lệnh với giá trị nice đã đổi hoặc đổi giá trị của backup.sh (PID 2481) bằng renice rồi kiểm tra bằng ps -o pid,ni,cmd. Phím ↑↓ trên bàn phím gọi lại lệnh đã gõ trước đó.

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 $n

Script tăng n thêm 1 cho đến khi hết 5 giây, rồi in giá trị cuối cùng.

📊5 giây tranh chấp một lõi CPUSố lần đếm được trong 5 giây
Tác vụ trước nice 0Tác vụ sau
nice 0 vs nice 0
Hai tác vụ có trọng số bằng nhau.
0250 nghìn500 nghìn750 nghìn1 triệu
nice 0497.596 lần48.8%
nice 0522.040 lần51.2%
nice 0 vs nice 10
Chỉ tác vụ sau chạy với nice 10.
0250 nghìn500 nghìn750 nghìn1 triệu
nice 0979.971 lần90.1%
nice 10107.671 lần9.9%
nice 0 vs nice 19
Chỉ tác vụ sau chạy với nice 19.
0250 nghìn500 nghìn750 nghìn1 triệu
nice 0909.895 lần98.6%
nice 1913.010 lần1.4%
Số liệu là kết quả trên server AlmaLinux 9 ngày 17 tháng 10 năm 2026, khi hai tác vụ được gắn vào một lõi CPU và chạy cùng lúc, mỗi tác vụ 5 giây.

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 $$'
idle
ionice -p $$
none: prio 0

Tiế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/example

Nế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.sh

Trê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 --yes

Ngượ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

Với tiến trình thông thường, PR trong top hiển thị bằng 20 cộng giá trị nice. Tiến trình chạy bằng nice 5 hiện PR 25 và NI 5, còn cột PRI của ps tính theo cách khác nên cùng tiến trình đó hiện là 14.

nice cộng giá trị chỉ định vào giá trị nice hiện tại. [nice -n 5 nice -n 3 nice] in ra 8, khác với renice -n vốn đặt thành giá trị chỉ định.

Ghi [Nice=] vào mục [Service] của tệp unit dịch vụ thì giá trị nice của các tiến trình do dịch vụ đó chạy sẽ được đặt theo. Theo tài liệu chính thức systemd.exec, có thể đặt từ -20 đến 19.

🧭 Nội dung đề xuất về tiến trình và lập lịch tác vụ 11 bài viết · 4 tham khảo
🗂️ Tiến trình và lập lịch tác vụ
📄 Lệnh ps 📄 Lệnh top 📄 Lệnh nice trong Linux 📄 Lệnh kill 📄 Lệnh killall 📄 Chạy nền&tiền cảnh 📄 Lệnh uptime
📄 Thiết lập crontab
📋 WP CLI: cài đặt và thiết lập 📄 WP-Cron(wp-cron.php) 📄 Tìm mẫu được đồng bộ: WP-CLI
📡 GNU Coreutils nice invocation 📡 renice(1) Linux manual page 📡 Block io priorities (tài liệu kernel) 📡 sched_prio_to_weight (mã nguồn kernel)
Kiểm tra tiến trình bằng lệnh ps
Linux · Tiến trình
Lệnh ps (lệnh tiến trình)
Lệnh ps in ra các tiến trình đang chạy.
Xem bài viết →Nội dung hiện tại
Lệnh TOP trong Linux: giao diện dòng lệnh (CLI-Command-Line Interface)
Linux · Tiến trình
Lệnh top trong Linux (kiểm tra mức dùng CPU và bộ nhớ)
Lệnh top trong Linux cho biết trạng thái của hệ điều hành đang chạy, và tên của nó nghĩa là table of processes.
Xem bài viết →Nội dung hiện tại
Lệnh nice trong Linux: thanh đo thực tế 5 giây khi nice 0 và nice 0·10·19 tranh một lõi CPU
Linux · Tiến trình
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 đến 19), quyết định chương trình nhường CPU nhiều hay ít khi chạy.
Xem bài viết →Nội dung hiện tại
Giao diện dòng lệnh Linux (Linux Command Line Interface - CLI)
Linux · Tiến trình
Lệnh kill trong Linux [kill -9 PID]
Lệnh kill trong Linux dùng để kết thúc tiến trình đang chạy.
Xem bài viết →Nội dung hiện tại
Kiểm tra thông tin phiên bản của lệnh killall trong Linux
Linux · Tiến trình
Lệnh killall trong Linux: cài đặt, cách dùng và tùy chọn
Lệnh killall trong Linux dùng để kết thúc một lúc các tiến trình được chỉ định.
Xem bài viết →Nội dung hiện tại
Hình ảnh Linux
Linux · Tiến trình
Chạy nền (Back Ground)&tiền cảnh (Fore Ground) trong Linux: điều khiển tiến trình
Tiến trình trong Linux chạy ở hai chế độ: nền (Back Ground) và tiền cảnh (Fore Ground).
Xem bài viết →Nội dung hiện tại
Kiến thức cơ bản về Linux (The Linux Foundation)
Linux · Tải server
Lệnh uptime trong Linux (kiểm tra thời gian chạy của server&tải trung bình 1, 5, 15 phút)
Lệnh uptime trong Linux dùng để kiểm tra tải trung bình của hệ thống và thời gian server đã chạy.
Xem bài viết →Nội dung hiện tại

ℹ️ 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á.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 1   +   8   =