分析系统瓶颈:
系统瓶颈大致分为内存瓶颈、IO瓶颈、CPU瓶颈,系统响应变慢,首先得定位大致的问题出在哪里,使用top工具能够比较全面的查看我们关注的点:
进入交互模式后:
- 输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题(检测内存泄漏问题);
- 输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源的使用者是否有问题;
top第三行显示当前系统的,其中有两个值很关键:
- %id:空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈;
- %wa:等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈;
CPU占用率过高分析:
- 定位进程:执行“ top ”命令,输入P,查看CPU占用情况,找到占用率最高的进程ID;
- 定位线程:输入“ top -Hp 进程ID ” ,找到占用CPU最高的线程ID;
- 定位代码:首先,需要把线程转成16进制:“ printf %x 线程ID ” ,然后通过 “pstack 进程ID | grep -A 200 转成16进制后的线程”;
- 解决问题:多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,然后排查代码。
- 以上前面2点,可以使用阿里开源的 arthas 来定位:“ thread -n 3 ” ,用于查看cpu占比前三的线程。
分析内存瓶颈
查看内存是否存在瓶颈,使用top指令看比较麻烦,而free命令更为直观:
top工具显示了free工具的第一行所有信息,但真实可用的内存,还需要自己计算才知道; 系统实际可用的内存为free工具输出的free+buffer+cached;如果是因为缺少内存,系统响应变慢很明显,因为这使得系统不停的做换入换出的工作;
进一步的监视内存使用情况,可使用vmstat工具,实时动态监视操作系统的内存和虚拟内存的动态变化。
vmstat语法:vmstat [-V] [-n] [delay [count]]
- -V表示打印出版本信息;
- -n表示在周期性循环输出时,输出的头部信息仅显示一次;
- delay是两次输出之间的延迟时间;
- count是指按照这个时间间隔统计的次数。
Procs(进程):
- r: 运行队列中进程数量
- b: 等待IO的进程数量
Memory(内存):
- swpd: 使用虚拟内存大小
- free: 可用内存大小
- buff: 用作缓冲的内存大小
- cache: 用作缓存的内存大小
Swap:
- si: 每秒从交换区写到内存的大小
- so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
- bi: 每秒读取的块数
- bo: 每秒写入的块数
system:
- in: 每秒中断数,包括时钟中断
- cs: 每秒上下文切换数
CPU(以百分比表示)
- us: 用户进程执行时间(user time)
- sy: 系统进程执行时间(system time)
- id: 空闲时间(包括IO等待时间)
- wa: 等待IO时间
分析IO瓶颈
如果IO存在性能瓶颈,top工具中的%wa会偏高;进一步分析使用iostat工具:(用来动态监视系统的磁盘操作活动)
- 如果%iowait的值过高,表示硬盘存在I/O瓶颈。
- 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
- 如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
- 如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
- 如果avgqu-sz比较大,也表示有大量io在等待。
命令格式:iostat[参数][时间][次数]
命令参数:
- -C 显示CPU使用情况
- -d 显示磁盘使用情况
- -k 以 KB 为单位显示
- -m 以 M 为单位显示
- -N 显示磁盘阵列(LVM) 信息
- -n 显示NFS 使用情况
- -p[磁盘] 显示磁盘和分区的情况
- -t 显示终端和CPU的信息
- -x 显示详细信息
- -V 显示版本信息
分析进程调用
通过top等工具发现系统性能问题是由某个进程导致的之后,接下来我们就需要分析这个进程;继续查询问题在哪;这里我们有两个好用的工具: pstack和pstrace。
pstack用来跟踪进程栈,这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;
而pstrace用来跟踪进程中的系统调用;这个工具能够动态的跟踪进程执行时的系统调用和所接收的信号。是一个非常有效的检测、指导和调试工具。系统管理员可以通过该命令容易地解决程序问题。
其他工具:sar 找出系统瓶颈的利器