做运维或后端开发,经常会遇到服务器性能问题——网站响应慢、CPU占用高、内存不足、磁盘IO瓶颈、网络拥塞。遇到这些问题,怎么排查?
很多人遇到性能问题,第一反应是重启服务器,或者升级配置。但这只是治标不治本,没有找到根本原因,问题还会再出现。正确的做法是用性能分析工具,一步步排查,找到性能瓶颈,然后针对性优化。
Linux提供了丰富的性能分析工具,常用的有top、vmstat、iostat、free、netstat、sar、pidstat等。掌握这些工具,能快速定位性能问题。今天就来分享这些工具的使用方法和排查思路。
性能排查的一般思路是:先看整体(系统级),再看局部(进程级);先看CPU,再看内存、磁盘IO、网络。通过工具收集数据,分析瓶颈在哪里,然后针对性优化。
top:查看进程和CPU
top是最常用的性能分析工具,几乎每个Linux发行版都自带。运行top命令,会显示一个实时更新的系统状态界面,包括系统整体信息和进程列表。
top界面的上半部分是系统整体信息:
- 第一行:系统时间、运行时间、登录用户数、系统负载(load average,1分钟/5分钟/15分钟平均负载)
- 第二行:进程总数、运行中、睡眠、停止、僵尸进程数
- 第三行:CPU使用情况(us用户态、sy内核态、ni优先级、id空闲、wa等待IO、hi硬中断、si软中断)
- 第四行:内存使用情况(总量、已用、空闲、缓存)
- 第五行:交换分区使用情况
下半部分是进程列表,按CPU使用率排序,显示每个进程的PID、用户、优先级、虚拟内存、常驻内存、状态、CPU使用率、内存使用率、运行时间、命令等。
top的常用交互命令:
- P:按CPU使用率排序(默认)
- M:按内存使用率排序
- T:按运行时间排序
- k:杀死进程(输入PID)
- r:修改进程优先级
- 1:显示每个CPU核心的使用情况
- h:显示帮助
- q:退出
用top排查性能问题:
- CPU使用率高:看是哪个进程占用CPU高,然后分析这个进程为什么耗CPU(是计算密集型、还是死循环、还是异常)
- 系统负载高:load average大于CPU核心数,说明系统负载过重。看是CPU密集、还是IO等待(wa高说明IO等待多)
- 内存不足:看内存使用情况,free少、cached多是正常的(缓存会自动释放);如果swap使用量大,说明物理内存不足,开始用交换分区了
- 僵尸进程:有zombie进程,说明子进程退出后父进程没有回收,需要检查父进程
vmstat:查看系统整体状态
vmstat(Virtual Memory Statistics)用于查看系统的虚拟内存、进程、CPU活动等整体状态。它能显示系统的实时性能数据,包括进程、内存、交换、IO、CPU等。
运行vmstat命令,默认显示一次统计。常用的用法是vmstat [间隔秒数] [次数],比如vmstat 1 5表示每秒输出一次,共5次。
vmstat的输出分为几个部分:
- procs(进程):r运行队列中的进程数,b等待IO的进程数
- memory(内存):swpd虚拟内存使用量,free空闲内存,buff缓冲区,cache缓存
- swap(交换):si从磁盘换入内存的量,so从内存换出到磁盘的量
- io(IO):bi从块设备读入的块数,bo写入块设备的块数
- system(系统):in每秒中断数,cs每秒上下文切换数
- cpu(CPU):us用户态CPU时间,sy内核态CPU时间,id空闲时间,wa等待IO时间
用vmstat排查性能问题:
- r列持续大于CPU核心数:说明CPU排队严重,CPU是瓶颈
- b列持续大于0:说明有进程在等待IO,可能是磁盘IO瓶颈
- si和so持续大于0:说明系统在频繁使用交换分区,物理内存不足
- bi和bo持续很高:说明磁盘IO频繁,可能是IO瓶颈
- in和cs很高:说明中断和上下文切换频繁,可能是系统调用过多或进程太多
- us很高:说明用户态进程占用CPU多,需要优化应用
- sy很高:说明内核态占用CPU多,可能是系统调用频繁或驱动问题
- wa很高:说明CPU在等待IO,磁盘IO是瓶颈
vmstat的优势是能一眼看到系统的整体状态,快速判断瓶颈在CPU、内存还是IO。建议性能排查时先用vmstat看整体,再用其他工具深入分析。
iostat:查看磁盘IO
iostat用于查看磁盘IO的统计信息,包括磁盘的读写速度、IOPS、响应时间、CPU使用率等。它是排查磁盘IO性能问题的必备工具。
iostat通常在sysstat包里,需要安装(apt-get install sysstat或yum install sysstat)。
运行iostat命令,默认显示CPU和所有磁盘的统计。常用用法:
- iostat -x 1:每秒显示一次详细的磁盘IO统计
- iostat -d 1:只显示磁盘统计,每秒一次
- iostat -c 1:只显示CPU统计,每秒一次
iostat -x的详细输出包括:
- rrqm/s:每秒合并的读请求数
- wrqm/s:每秒合并的写请求数
- r/s:每秒读请求数(读IOPS)
- w/s:每秒写请求数(写IOPS)
- rkB/s:每秒读数据量(KB)
- wkB/s:每秒写数据量(KB)
- avgrq-sz:平均请求大小(扇区)
- avgqu-sz:平均请求队列长度
- await:平均请求等待时间(毫秒,包括队列等待和服务时间)
- r_await:平均读请求等待时间
- w_await:平均写请求等待时间
- svctm:平均请求服务时间(毫秒)
- %util:磁盘利用率(忙碌时间百分比)
用iostat排查磁盘IO问题:
- %util持续接近100%:说明磁盘已经饱和,IO是瓶颈
- await持续很高(大于50ms):说明磁盘响应慢,IO请求等待时间长
- avgqu-sz持续很高:说明IO请求队列长,磁盘处理不过来
- r/s和w/s很高:说明IOPS高,看是否超过磁盘的IOPS上限
- rkB/s和wkB/s很高:说明数据传输量大,看是否超过磁盘的带宽上限
- svctm和await差距大:说明大部分时间在队列等待,而不是磁盘服务,可能是请求太多
磁盘IO优化方向:
- 应用优化:减少不必要的磁盘读写,增加缓存(Redis、Memcached),批量写入
- 数据库优化:优化SQL,增加索引,分库分表,读写分离
- 系统优化:调整IO调度算法(deadline、noop),调整文件系统挂载参数(noatime、nodiratime)
- 硬件升级:换更快的磁盘(SSD替代HDD),组RAID,增加磁盘数量
free:查看内存使用
free命令用于查看系统内存使用情况,包括物理内存、交换分区、缓冲区、缓存等。
运行free -h(人类可读格式),输出:
- total:总内存
- used:已使用内存
- free:空闲内存
- shared:共享内存
- buff/cache:缓冲区和缓存
- available:可用内存(应用程序可以使用的内存,包括缓存可释放的部分)
很多人看到free少就以为内存不足,其实不是。Linux会把空闲内存用作缓存(cache)和缓冲区(buffer),来提升系统性能。这些缓存在应用需要时会自动释放。所以判断内存是否充足,应该看available列,而不是free列。
如果available很少,而且swap使用量持续增加(si和so大于0),说明物理内存确实不足了,需要优化内存使用或增加内存。
内存优化方向:
- 应用优化:修复内存泄漏,减少不必要的内存占用,及时释放不再使用的内存
- 服务优化:调整服务的内存配置(如PHP-FPM的进程数、MySQL的缓冲池大小、JVM的堆内存)
- 系统优化:调整swappiness参数(减少交换分区的使用),关闭不必要的服务
- 硬件升级:增加物理内存
netstat:查看网络连接
netstat用于查看网络连接、路由表、接口统计等网络信息。虽然现在推荐用ss命令(更快、更详细),但netstat仍然是最常用的网络工具之一。
常用用法:
- netstat -tlnp:查看TCP监听端口(t=TCP,l=监听,n=数字显示,p=进程信息)
- netstat -anp:查看所有网络连接和进程
- netstat -rn:查看路由表
- netstat -i:查看网络接口统计
- netstat -s:查看网络协议统计
用netstat排查网络问题:
- 端口是否在监听:netstat -tlnp看需要的端口是否在监听
- 连接数是否过多:netstat -an | grep ESTABLISHED | wc -l看建立的连接数
- TIMEWAIT连接过多:netstat -an | grep TIMEWAIT | wc -l,如果很多,说明短连接多,可以调整内核参数(tcptwreuse、tcptwrecycle)
- 哪个进程占用端口:netstat -tlnp看端口对应的进程
- 网络错误:netstat -s看协议统计,有没有错误包、丢包、重传
排查案例
举一个实际的排查案例:网站响应慢。
第一步,用vmstat 1看系统整体状态。发现r列很高(大于CPU核心数),us列很高(80%以上),说明CPU是瓶颈,用户态进程占用CPU多。
第二步,用top看是哪个进程占用CPU高。发现是php-fpm进程,多个php-fpm进程CPU使用率都很高。
第三步,分析php-fpm为什么耗CPU。可能是PHP代码执行慢、或者请求量太大。用strace跟踪php-fpm进程,看系统调用;或者开启PHP慢日志,看哪些PHP脚本执行慢。
第四步,发现是某个PHP接口执行慢,因为有一个复杂的数据库查询,没有索引,导致查询很慢,占用CPU。
第五步,优化:给数据库表增加索引,优化SQL查询,增加缓存(Redis缓存查询结果)。优化后,php-fpm的CPU使用率降下来了,网站响应也快了。
这就是一个典型的性能排查过程——从整体到局部,从系统到应用,一步步找到瓶颈,然后针对性优化。
总结
Linux性能优化是一个系统工程,需要掌握各种工具,有清晰的排查思路。top、vmstat、iostat、free、netstat这些工具,是性能排查的基础工具,熟练掌握它们,能快速定位大多数性能问题。
性能排查的核心思路是:先看整体(vmstat),再看局部(top/iostat/netstat);先判断瓶颈类型(CPU/内存/IO/网络),再深入分析具体原因;找到原因后,针对性优化。
性能优化不是一次性的工作,而是持续的过程。系统在变化,流量在增长,性能瓶颈也会变化。定期监控和分析系统性能,及时发现和解决问题,才能保证系统的稳定和高效。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录