普通用户无法用 nice 设置负值优先级,仅 root 或具 CAP_SYS_NICE 能力者可提升优先级;nice 仅作用于新进程,运行中进程需用 renice;设高 nice 值(如+10)可降低 CPU 占用,但对 I/O 密集型任务效果有限,需配合 ionice。

普通用户无法用 nice 提升进程优先级(即设负值),root 才能设 -20 到 -1;nice 只对新启动的进程生效,运行中进程必须用 renice。
为什么 nice -n -5 cmd 总是 Permission denied
这是权限限制的正常表现,不是命令写错。Linux 要求:只有 root 或具备 CAP_SYS_NICE 能力的进程才能降低 nice 值(即提高调度优先级)。普通用户调用 nice -n -1 anything 就会失败,错误信息就是 Permission denied。
- 普通用户能做的只有“降权”:比如
nice -n 10 long_script.sh,让脚本更谦让 CPU - 想提权运行关键服务?必须加
sudo:sudo nice -n -10 ./monitor - 绕过限制的非常规方式:改
/etc/security/limits.conf,加一行username soft priority 5,但需重新登录且不推荐在生产环境随意启用
nice 启动时指定优先级的实操要点
nice 不修改已有进程,只影响它 fork 出来的新进程。常见误操作是以为加了 nice 就能“修复”一个卡死的程序——其实没用,得换 renice。
- 显式写
-n更安全:nice -n 15 tar -cf backup.tar /data,避免和命令参数混淆 - 不带
-n时,nice 5 cmd等价于nice -n 5 cmd,但nice cmd默认是nice -n 10 cmd,容易误判 - 后台任务(如日志轮转、批量导出)建议设
+10~+15;交互式工具(如终端编辑器、SSH 会话)保持默认0,否则可能变卡顿 - 设
nice=-20并不等于“独占 CPU”,实时进程(chrt -f)或内核线程仍可抢占
怎么确认 nice 生效了
别只信命令没报错,要查实际值。ps 输出里的 NI 列才是 nice 值,而 PR(priority)是内核计算出的调度优先级,两者关系大致为 PR ≈ 80 + NI(CFS 下),但这个公式只是参考,不同内核版本可能微调。
- 查单个进程:
ps -o pid,ni,comm -p $(pgrep -f "tar.*backup") - 看全部进程按 nice 排序:
ps -eo pid,ni,comm --sort=ni | head -10 - top 中按
Shift+F→ 选NI→ 按Space排序,能直观看到哪些最“闲” - 如果发现
NI没变,检查是否命令根本没执行成功(比如路径错、权限不足),而不是nice失效
真正容易被忽略的是:nice 值只在 CPU 竞争时起作用。空闲系统里,nice=0 和 nice=19 的进程几乎无差别;而 I/O 密集型任务(如数据库导入)即使设了高 nice,CPU 时间片让出去了,磁盘队列照样堵——这时候得配 ionice 一起压。

















