普通用户只能增大nice值降低自身进程优先级,无法设负值或修改他人进程;root或CAP_SYS_NICE权限方可提权。nice用于启动新进程时设初始增量优先级,renice用于动态调整运行中进程的nice增量,setpriority()系统调用支持绝对值设置但需相应权限。

普通用户只能降低自己进程的优先级(增大 nice 值),无法提权;要设负值或改别人进程,必须 root 或 CAP_SYS_NICE 权限。
用 nice 启动时设初始优先级
适用于新进程,且只影响当前进程自身。它接受的是「增量」,不是绝对值:
-
nice -n 10 command:以nice=10启动command(前提是当前进程默认是 0) -
nice -n -5 command:想设nice=-5?普通用户会失败,errno是EACCES - 不加
-n时,nice 5等价于nice -n 5;但nice -5是语法错误,会被 shell 当作选项解析失败 - 实际生效的 nice 值会被截断到 [-20, 19],超出范围自动钳位
用 renice 修改运行中进程的 nice 值
这是最常用、最安全的线上调整方式,底层调用 setpriority():
-
renice -n 5 -p 1234:把 PID 为 1234 的进程 nice 值增加 5(比如从 0→5) -
renice -n -10 -p 1234:只有 root 才能成功;普通用户执行会报Permission denied -
renice +2 -u www-data:批量调低所有www-data用户进程的优先级 - 注意:
renice的-n是「增量」,不是目标值;要设绝对值必须用setpriority()系统调用
用 setpriority() 在 C/C++ 中精确控制
适合嵌入式、服务程序或需要细粒度调度控制的场景:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
setpriority(PRIO_PROCESS, getpid(), 10):对当前进程设绝对nice=10,无需特权 -
setpriority(PRIO_PROCESS, target_pid, -5):改别的进程?必须满足:调用者 UID == target UID,或有 root /CAP_SYS_NICE - 第一个参数不能写错:
PRIO_PROCESS(按 PID)、PRIO_PGRP(按进程组)、PRIO_USER(按 UID) - 调用返回 -1 时,检查
errno:是ESRCH(PID 不存在)还是EACCES(权限不足)
为什么 nice=-10 不等于“快 10 倍”?
CFS 调度器不是线性分配时间片,而是通过权重影响 vruntime 增长速度:
-
nice=0对应权重 1024,nice=-10对应约 9548 —— 是 9.3 倍权重,不是 10 倍 - 这个倍数在 CPU 高负载时才明显;空闲系统下,哪怕
nice=-20也看不出响应更快 - 真正起作用的是相对差值:两个进程
nice相差 10,它们的 CPU 时间比≈9:1;相差 5,则≈3:1 - 别指望靠调
nice解决 I/O 瓶颈或锁竞争 —— 它只影响 CPU 时间分配
最容易被忽略的一点:普通用户调 setpriority() 或 renice 设负值时,失败不报具体原因,只返回 -1 或 Permission denied;得主动查 errno 或用 strace 看系统调用返回值。










