第45集:进程优先级管理
章节标题
进程优先级管理
核心知识点讲解
进程优先级的概念
进程优先级是指进程获得CPU时间片的优先程度。在Linux系统中,进程优先级决定了进程调度器如何为进程分配CPU资源。优先级高的进程会获得更多的CPU时间片,而优先级低的进程则获得较少的CPU时间片。
nice值与优先级
在Linux系统中,进程的优先级通过nice值来表示。nice值的范围是-20到19,其中:
- nice值越小,进程优先级越高
- nice值越大,进程优先级越低
- 默认情况下,进程的nice值为0
静态优先级与动态优先级
静态优先级
静态优先级是由用户设置的优先级,通过nice值来表示。静态优先级在进程创建时设置,之后可以通过renice命令修改。
动态优先级
动态优先级是由内核根据进程的行为自动调整的优先级。内核会根据进程的CPU使用情况、睡眠状态等因素动态调整进程的优先级,以提高系统的整体性能。
nice 命令
nice 命令用于在启动进程时设置其nice值,从而设置进程的优先级。
基本用法
# 以指定的nice值启动进程
nice -n nice值 命令
# 示例:以较低优先级启动进程(nice值为10)
nice -n 10 ./backup.sh
# 示例:以较高优先级启动进程(nice值为-5)
sudo nice -n -5 ./critical_service.sh注意事项
- 普通用户只能设置nice值为0到19的进程(降低优先级)
- 只有root用户可以设置nice值为-20到-1的进程(提高优先级)
- nice值的范围是-20到19,其中-20是最高优先级,19是最低优先级
renice 命令
renice 命令用于修改正在运行的进程的nice值,从而调整进程的优先级。
基本用法
# 修改指定PID的进程的nice值
renice nice值 PID
# 修改指定用户的所有进程的nice值
renice nice值 -u 用户名
# 修改指定进程组的所有进程的nice值
renice nice值 -g 进程组ID
# 示例:降低进程的优先级(设置nice值为10)
renice 10 1234
# 示例:提高进程的优先级(设置nice值为-5)
sudo renice -5 1234注意事项
- 普通用户只能增加进程的nice值(降低优先级)
- 只有root用户可以减少进程的nice值(提高优先级)
- 可以同时修改多个进程的nice值
实时优先级
除了nice值表示的静态优先级外,Linux系统还支持实时优先级。实时优先级的范围是0到99,其中:
- 实时优先级越高,进程获得CPU时间片的机会越大
- 实时优先级的进程会优先于普通优先级的进程执行
- 实时优先级主要用于对时间敏感的应用程序
chrt 命令
chrt 命令用于设置或获取进程的实时优先级。
基本用法
# 显示指定进程的实时优先级
chrt -p PID
# 以指定的实时优先级启动进程
chrt 优先级 命令
# 设置指定进程的实时优先级
chrt -p 优先级 PID
# 示例:以实时优先级99启动进程
chrt 99 ./realtime_app.sh
# 示例:设置进程的实时优先级为50
chrt -p 50 1234调度策略
chrt 命令支持多种调度策略:
SCHED_OTHER:默认调度策略,用于普通进程SCHED_FIFO:先进先出调度策略,用于实时进程SCHED_RR:时间片轮转调度策略,用于实时进程SCHED_BATCH:批处理调度策略,用于批处理任务SCHED_IDLE:空闲调度策略,用于空闲时间执行的任务
进程优先级的查看
使用 ps 命令查看
# 查看进程的nice值
ps -eo pid,ppid,user,nice,command
# 按nice值排序查看进程
ps -eo pid,ppid,user,nice,command --sort=nice
# 查看进程的实时优先级
ps -eo pid,ppid,user,rtprio,command使用 top 命令查看
在top命令的输出中,可以查看进程的nice值(NI列)和实时优先级(PR列):
# 启动top命令
top
# 在top中按优先级排序
# 按下P键按CPU使用率排序
# 按下N键按nice值排序实用案例分析
案例1:调整批处理任务的优先级
# 1. 启动一个备份任务,设置较低的优先级(nice值为19)
nice -n 19 tar -czf backup.tar.gz /home
# 2. 查看进程的优先级
ps -p $! -o pid,nice,command
# 3. 如果需要,可以进一步调整优先级
renice 19 $!案例2:提高关键服务的优先级
# 1. 查找关键服务的进程ID
pidof nginx
# 2. 提高进程的优先级(设置nice值为-10)
sudo renice -10 $(pidof nginx)
# 3. 查看进程的优先级
ps -p $(pidof nginx) -o pid,nice,command案例3:管理系统负载
# 1. 当系统负载较高时,降低非关键进程的优先级
# 查找CPU使用率高的进程
ps aux --sort=-%cpu | head -10
# 2. 降低这些进程的优先级
for pid in $(ps aux --sort=-%cpu | head -10 | awk '{print $2}' | grep -E '^[0-9]+$'); do
renice 10 $pid
done
# 3. 监控系统负载
uptime案例4:实时应用的优先级设置
# 1. 启动一个实时音频应用,设置实时优先级
chrt 90 ./audio_processing.sh
# 2. 查看进程的实时优先级
chrt -p $!
# 3. 如果需要,调整实时优先级
chrt -p 80 $!案例5:批量调整进程优先级
# 1. 调整指定用户的所有进程的优先级
sudo renice 5 -u user1
# 2. 调整指定进程组的所有进程的优先级
sudo renice 10 -g 1234
# 3. 调整所有nice值为0的进程的优先级
ps -eo pid,nice | awk '$2 == 0 {print $1}' | xargs sudo renice 5代码示例
示例1:进程优先级管理脚本
#!/bin/bash
# 进程优先级管理脚本
# 显示帮助信息
show_help() {
echo "进程优先级管理脚本"
echo "用法: $0 [选项]"
echo "选项:"
echo " -p, --pid <pid> 指定进程ID"
echo " -n, --nice <value> 设置nice值(-20到19)"
echo " -r, --realtime <value> 设置实时优先级(0到99)"
echo " -u, --user <name> 指定用户"
echo " -l, --list 列出进程优先级"
echo " -h, --help 显示帮助信息"
}
# 列出进程优先级
list_priorities() {
echo "=== 进程优先级列表 ==="
echo "PID PPID USER NICE RTPRIO COMMAND"
echo "------------------------------------------"
ps -eo pid,ppid,user,nice,rtprio,command | grep -v "COMMAND"
}
# 解析命令行参数
PID=""
NICE=""
REALTIME=""
USER=""
LIST=false
while [[ $# -gt 0 ]]; do
case $1 in
-p|--pid)
PID="$2"
shift 2
;;
-n|--nice)
NICE="$2"
shift 2
;;
-r|--realtime)
REALTIME="$2"
shift 2
;;
-u|--user)
USER="$2"
shift 2
;;
-l|--list)
LIST=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
echo "未知选项: $1"
show_help
exit 1
;;
esac
done
# 列出进程优先级
if $LIST; then
list_priorities
exit 0
fi
# 检查参数
if [[ -n "$NICE" ]]; then
# 设置nice值
if [[ -n "$PID" ]]; then
echo "设置进程 $PID 的nice值为 $NICE"
sudo renice $NICE $PID
elif [[ -n "$USER" ]]; then
echo "设置用户 $USER 的所有进程的nice值为 $NICE"
sudo renice $NICE -u $USER
else
echo "错误: 必须指定进程ID或用户"
show_help
exit 1
fi
elif [[ -n "$REALTIME" ]]; then
# 设置实时优先级
if [[ -n "$PID" ]]; then
echo "设置进程 $PID 的实时优先级为 $REALTIME"
sudo chrt -p $REALTIME $PID
else
echo "错误: 必须指定进程ID"
show_help
exit 1
fi
else
echo "错误: 必须指定要设置的优先级"
show_help
exit 1
fi
# 显示设置后的优先级
if [[ -n "$PID" ]]; then
echo ""
echo "设置后的进程优先级:"
ps -p $PID -o pid,nice,rtprio,command
elif [[ -n "$USER" ]]; then
echo ""
echo "设置后的用户进程优先级:"
ps -u $USER -o pid,nice,rtprio,command
fi示例2:动态调整进程优先级的脚本
#!/bin/bash
# 动态调整进程优先级的脚本
# 配置
TARGET_PROCESS="nginx" # 目标进程名称
MAX_CPU_USAGE=80 # CPU使用率阈值(%)
LOW_PRIORITY=10 # 低优先级(高nice值)
HIGH_PRIORITY=-5 # 高优先级(低nice值)
CHECK_INTERVAL=5 # 检查间隔(秒)
# 检查进程是否存在
check_process() {
local pid=$(pgrep -f "$TARGET_PROCESS" | head -1)
if [[ -z "$pid" ]]; then
echo "错误: 找不到进程 '$TARGET_PROCESS'"
return 1
fi
echo "找到进程 '$TARGET_PROCESS',PID: $pid"
return 0
}
# 获取进程的CPU使用率
get_cpu_usage() {
local pid="$1"
local cpu_usage=$(ps -p $pid -o %cpu= | awk '{print int($1)}')
echo $cpu_usage
}
# 调整进程优先级
adjust_priority() {
local pid="$1"
local cpu_usage="$2"
if [[ $cpu_usage -gt $MAX_CPU_USAGE ]]; then
# CPU使用率过高,降低优先级
echo "CPU使用率过高 ($cpu_usage%),降低进程优先级"
sudo renice $LOW_PRIORITY $pid
else
# CPU使用率正常,提高优先级
echo "CPU使用率正常 ($cpu_usage%),提高进程优先级"
sudo renice $HIGH_PRIORITY $pid
fi
}
# 主循环
main() {
echo "=== 动态调整进程优先级脚本 ==="
echo "目标进程: $TARGET_PROCESS"
echo "CPU使用率阈值: $MAX_CPU_USAGE%"
echo "低优先级: $LOW_PRIORITY"
echo "高优先级: $HIGH_PRIORITY"
echo "检查间隔: $CHECK_INTERVAL 秒"
echo ""
while true; do
# 检查进程是否存在
if ! check_process; then
sleep $CHECK_INTERVAL
continue
fi
# 获取进程ID
local pid=$(pgrep -f "$TARGET_PROCESS" | head -1)
# 获取CPU使用率
local cpu_usage=$(get_cpu_usage $pid)
echo "当前CPU使用率: $cpu_usage%"
# 调整优先级
adjust_priority $pid $cpu_usage
# 显示当前优先级
echo "当前进程优先级:"
ps -p $pid -o pid,nice,command
echo ""
# 等待指定的间隔
sleep $CHECK_INTERVAL
done
}
# 运行脚本
main示例3:优先级监控脚本
#!/bin/bash
# 优先级监控脚本
# 配置
LOG_FILE="priority_monitor.log" # 日志文件
CHECK_INTERVAL=10 # 检查间隔(秒)
# 初始化日志文件
init_log() {
echo "=== 进程优先级监控日志 ===" > "$LOG_FILE"
echo "开始时间: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
echo "检查间隔: $CHECK_INTERVAL 秒" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
}
# 记录进程优先级
log_priorities() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp]" >> "$LOG_FILE"
echo "PID USER NICE RTPRIO %CPU %MEM COMMAND" >> "$LOG_FILE"
echo "-------------------------------------------------" >> "$LOG_FILE"
ps -eo pid,user,nice,rtprio,%cpu,%mem,command --sort=-%cpu | head -20 >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
}
# 显示实时监控
show_real_time() {
echo "=== 进程优先级实时监控 ==="
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "检查间隔: $CHECK_INTERVAL 秒"
echo "日志文件: $LOG_FILE"
echo ""
echo "按Ctrl+C退出监控"
echo ""
}
# 主循环
main() {
# 初始化日志文件
init_log
# 显示实时监控
show_real_time
while true; do
# 清屏
clear
# 显示实时监控
show_real_time
# 显示当前进程优先级
echo "=== 当前进程优先级 ==="
echo "PID USER NICE RTPRIO %CPU %MEM COMMAND"
echo "-------------------------------------------------"
ps -eo pid,user,nice,rtprio,%cpu,%mem,command --sort=-%cpu | head -20
echo ""
# 记录到日志文件
log_priorities
# 等待指定的间隔
sleep $CHECK_INTERVAL
done
}
# 运行脚本
main总结
本集介绍了 Linux 中的进程优先级管理,包括:
- 进程优先级的概念和作用
- nice值与优先级的关系
nice命令:在启动进程时设置其优先级renice命令:修改正在运行的进程的优先级- 实时优先级的概念和设置方法
chrt命令:设置或获取进程的实时优先级- 进程优先级的查看方法
同时,本集还介绍了多个实用案例和代码示例,包括:
- 调整批处理任务的优先级
- 提高关键服务的优先级
- 管理系统负载
- 实时应用的优先级设置
- 批量调整进程优先级
- 进程优先级管理脚本
- 动态调整进程优先级的脚本
- 优先级监控脚本
通过掌握进程优先级管理的知识和技巧,用户可以更好地管理系统资源,提高系统的整体性能。在实际工作中,应根据进程的重要性和系统的负载情况合理调整进程的优先级,以确保系统的稳定运行和关键任务的顺利执行。