性能·CPU / 命令文档

CFS调度器运维指南

$ cfs 15 个章节 Linux 命令详解

概述

Linux完全公平调度器 - 运维工程师必知必会

是什么 怎么工作 为什么重要 如何运维 故障排查

CFS是什么?

CFS 是Linux内核的默认进程调度器,从2.6.23版本开始使用。

核心理念: 让所有进程获得"完全公平"的CPU时间。

3个关键概念

红黑树 - 用来管理等待运行的进程,按虚拟运行时间排序

虚拟运行时间(vruntime) - 记录进程的"公平"运行时间

权重 - 根据nice值决定进程优先级

一句话理解: CFS就像排队买票,谁等得久就让谁先买,保证每个人都公平。

调度流程(4步搞定)

选择红黑树最左边(vruntime最小)的进程

根据权重计算给这个进程多少时间片

进程运行,同时增加它的vruntime

时间片用完,重新按vruntime插入红黑树

关键公式

vruntime = 实际运行时间 × (1024 / 进程权重) 时间片 = 调度周期 × (进程权重 / 所有进程权重之和)

Nice值与权重对照

Nice值权重CPU占比用途
-2088761最高系统关键进程
01024默认普通用户进程
1915最低后台任务

为什么CFS重要?

公平性

响应性

可扩展

简洁

对运维的价值

• 性能稳定: 系统负载均衡,避免单个进程独占CPU

• 故障隔离: 问题进程不会严重影响其他服务

• 资源优化: 通过调节nice值精确控制资源分配

• 监控友好: 丰富的调试接口,便于问题定位

监控命令(必会5个)

# 1. 查看进程调度信息 top -H # 2. 查看系统负载 uptime # 3. 监控上下文切换 vmstat 1 # 4. 查看调度统计 cat /proc/schedstat # 5. 分析调度延迟 perf sched record -a sleep 5 && perf sched latency

关键参数调优

参数路径默认值调优场景
调度延迟/proc/sys/kernel/sched_latency_ns6ms交互应用减小,批处理增大
最小粒度/proc/sys/kernel/sched_min_granularity_ns0.75ms高并发时适当增大
唤醒粒度/proc/sys/kernel/sched_wakeup_granularity_ns1ms实时性要求高时减小

常用运维操作

# 调整进程优先级 renice -n 10 -p PID # 降低优先级 nice -n -5 command # 高优先级启动 # 绑定CPU核心 taskset -c 0,1 PID # 绑定到指定核心 taskset -cp 0-3 PID # 绑定到核心范围 # 查看进程调度信息 cat /proc/PID/sched # 查看进程调度详情 chrt -p PID # 查看调度策略

运维最佳实践: • 重要服务设置负nice值(-1到-5) • 后台任务设置正nice值(5到19) • 定期监控load average和CPU使用率 • 生产环境谨慎修改内核参数

问题1:系统响应慢

检查负载:uptime 看load average是否过高

找出CPU消耗大户:top -o %CPU

调整优先级:renice +10 PID

问题2:进程切换频繁

# 查看上下文切换 vmstat 1 5 # 如果cs列数值很高(>10000/s),考虑: echo 10000000 > /proc/sys/kernel/sched_latency_ns # 增大调度延迟 echo 1000000 > /proc/sys/kernel/sched_min_granularity_ns # 增大最小粒度

问题3:某个进程抢占CPU

# 限制CPU使用 cpulimit -p PID -l 50 # 限制进程CPU使用率为50% # 或者降低优先级 renice +19 PID # 设为最低优先级 # 查看进程调度策略 chrt -p PID

紧急处理原则: 1. 先用nice/renice快速缓解 2. 再分析根本原因 3. 最后考虑内核参数调整 4. 重要:修改前备份配置

一键监控脚本

#!/bin/bash # CFS状态检查 echo "=== CFS调度器状态 ===" echo "负载: $(uptime | awk -F'load average:' '{print $2}')" echo "运行进程数: $(ps aux | wc -l)" echo "上下文切换: $(vmstat 1 2 | tail -1 | awk '{print $12}')/s" echo "CPU使用: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)" echo "" echo "=== TOP 5 CPU消耗进程 ===" ps aux --sort=-%cpu | head -6

同分类 · 其他命令文档