摘要
- 基于 Linux 单机的负载评估
- 负载诊断流程
- 概念:什么是负载
- 负载:CPU 还是 I/O
- Linux 内核进程调度器
概要:负载诊断流程
- 观察load average (平均负载)
- 观察CPU、I/O是否存在瓶颈
从load avgerage等总括性的数据着手,参考CPU使用率和I/O等待时间等具体的数字,从而自顶向下快速排查各进程状态。
概念:什么是负载?
负载可以分为两大部分:CPU负载、I/O 负载 。
load average
1 | uptime |
1 | load average:0.65, 1.49, 1.76 (负载很低) |
依次时过去1分钟,5分钟,15分钟内,单位时间的等待任务数,也就是表示平均有多少任务正处于等待状态。在load average较高的情况下,就说明等待运行的任务较多,因此轮到该任务运行的等待时间就会出现较大延迟,即反映了此时负载较高。
Linux 内核进程调度器(Process Scheduler)
负责决定任务运行的优先级,以及让任务等待或使之重新开始等核心工作。调度器划分并管理进程(Process)的状态。例如:
等待分配CPU资源的状态
等待磁盘输入输出完毕的状态
进程描述符的状态
进程状态 | PS Stat | 说明 | |
---|---|---|---|
TASK_RUNNING | R(Run) | 运行状态。只要CPU空闲,随时都可以开始。 | |
TASK_INTERRUPTIBLE | S(Sleep) | 可中断的等待状态。例如系统睡眠或来自于用户输入的等待等。 | |
TASK_UNINTERRUPTIBLE | D(Disk Sleep) | 不可中断的等待状态。主要为短时间恢复时的等待状态。例如磁盘输入输出的等待 | |
TASK_STOPPED | 响应暂停信号而运行中断的状态。直到恢复(Resume)前都不会被调度 | ||
TASK_ZOMBIE | Z(Zombie) | 僵死状态。虽然子进程已经终止(exit),但父进程尚未执行wait(),因此该进程的资源没有被系统释放 |
- TASK_RUNNING 正在运行
- TASK_RUNNING (等待状态,加权换算)
- TASK_INTERRUPTIBLE(等待状态,加权换算)
- TASK_UNINTERRUPTIBLE(等待状态,不加权换算)
load average 表示“等待进程的平均数”,除了“TASK_RUNNING正在运行”,其它三个都是等待状态。TASK_INTERRUPTIBLE不被换算。即只换算“虽然需要即刻运行处理,但是无论如何都必须等待”。
load average所描述的负载就是:需要运行处理,但又必需等待队列前的进程处理完成的进程个数。具体来说:要么等待授予CPU运行权限,要么等待磁盘I/O完成。
- 内核函数:kernei/timer.c的calc-load();
- 调用周期:每次计时器中断(centos为4ms)
CPU 还是 I/O ?
load average的数字只是表示等待的任务数,仅根据load average并不能判断具体是CPU负载高还是I/O负载高。
CPU密集型程序
I/O密集型程序
Sar (System Activity Reporter)
CPU使用率和I/O等待时间都是在不断变化的,可以通过sar 命令来确认这些指标。
sar 工具包含在 sysstat 软件包内。
1 | $ sar |
1 | $ sar 1 10 |
输出参数:
- %user:用户(一般的应用软件运作模式)CPU资源
- %system:系统(内核运作)占用CPU资源
- %iowait:I/O等待率。
进程详细
1 | $ ps auxw |
输出参数:
- %CPU:该进程的CPU使用率
- %memb:物理内存百分比
- VSZ、RSS:虚拟/物理内存
- STAT:进程状态(非常重要)
- TIME:CPU占用时间
SWAP吞吐
1 | $sar -W |
输出参数:
- pswpin/s:每秒系统换入的页面数
- pswpout/s:每秒系统换出的页面数
发生频繁的交换时,服务器的吞吐量性能会大幅下降。
vmstat(Report Virtual Memory Statistics)
实时确认CPU使用率及实际的I/O等待时间1
2
3
4$ vmstat
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s2 s2 s2 s2 in sy cs us sy id
0 0 0 45411448 17973032 140 1470 13 41 33 0 0 -0 -0 -0 -0 2753 313459 4984 16 3 81
解决方案
优化的真正工作是“找出系统瓶颈并加以解决”,我们所能做的就是“充分发挥硬/软件本来的性能,解决可能存在的问题”。例如,同样是I/O问题,我们可以通过增加内存来缓解,也可以调整调度方案来优化(时间换空间),但是更多的情况是,优化应用程序的I/O算法效果更佳。
最后,重温一句经典格言
别臆断,请监控
电子书《Linux Perf Master》
扩展阅读:性能诊断指南
扩展阅读:How Linux Works
- How Linux Works:The Big Picture
- How Linux Works:BASIC Commands
- How Linux Works:BASIC Commands Extension
- How Linux Works:Device and FileSystem
- How Linux Works:Boots
- How Linux Works:用户空间
- How Linux Works:内存管理
- How Linux Works:网络管理
- PreviewHow Linux Works:路由管理
扩展阅读:动态追踪技术
- 动态追踪技术(一):DTrace 导论
- 动态追踪技术(二):strace+gdb 溯源 Nginx 内存溢出异常
- 动态追踪技术(三):Tracing Your Kernel Function!
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- 动态追踪技术(五):Welcome DTrace for Linux