Linux系统性能排查基础

勿忘初心2018-10-24 11:22

此文已由作者李晶授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


上一期运维季刊中,我们重点从CPU方面分析了Linux系统性能瓶颈,除了CPU之外,内存、IO和网络也是常见的造成系统出现问题的根源,本篇我们继续介绍如何从这三个子系统来排查Linux整个系统的性能问题。


1. 内存


Linux系统实现了非常复杂同时又非常高效的内存管理。通过虚拟内存机制,对于每个进程而言,都可以使用整个地址空间。物理内存是系统硬件提供的内存,是有限的。Linux会在物理内存不足时,使用交换分区的虚拟内存。为了更加高效的使用内存,内核会将暂时不用的内存数据写回到交换空间,这样一来,释放掉的这块内存就可以用于其它目的,当需要用到原有内容时,这些信息又会被重新从交换空间读入物理内存。Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核通过页面回收算法将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。 为了了解内存在系统性能上的影响和一些内存工具的原理,我们需要比较详细的了解Linux内存管理的细节,这里不再叙述。当我们怀疑内存有问题的时候,首先使用free命令查看系统的内存情况:


图 1 关于free的输出有下面几个等式:


Linux总是最大限度地使用物理内存,因此Mem[free]在所有的Linux系统中看起来都会是一个相对较小的值。而真正可用内存是buffers[free],因此了解整体内存概况一般都看buffers和Swap行。free命令只能单纯地看到内存的状态, 需要利用top和vmstat更进一步地查看内存数据,vmstat 1结果如下:


图 2 如表1,这里主要是看内存的活动状态以及与IO和CPU的联动信息,swap分区可以让机器在内存猛涨的情况下卡而不死,当内存回落机器则会恢复,swap分区关闭的话,一旦内存需求超过物理内存,系统会直接OOM。


表 1 我们简单地构造一个内存泄露的例子,然后找出内存泄露的原因。使用如下脚本可以模拟出一个内存泄露的进程,在后台运行下面的脚本。


在未知的环境中,我们并不知道哪个进程出现了内存问题,通过基础监控只能初步地知道,系统中有进程可能存在内存泄露问题。使用top找出使用内存最多的几个进程,然后逐步地排除。在模拟的时候已经确切的知道了进程pid是14231,然后使用watch -d -n 1 pmap 14231,如图3,可以清楚地看到进程在内存中的布局,另外对于哪一项在增加也是一目了然,图中匿名映射的地址已经给出,这样子就可以去追踪程序的问题了。另外有时候进程可能是内存泄露相当缓慢,我们可以将pmap的数据记录之后逐项画 图,就可以很直接地知道哪一块的内存在增加了。



2. IO


计算机系统中最慢的就是IO设备了,Linux本身提供了很多方式来适应高速设备与低速设备之间的数据交互。当怀疑是IO造成系统性能问题的时候,需要使用下面的步骤来进一步确定。如图4所示,可以使用iostat -x -k -d 1来每隔一秒输出IO相关信息。需要关心的指标及其含义如下:


表2


如果[r/s]/[rkB/s]的值相对于正常机器小,可以说明应用程序有良好的读取性能,多数IO都是顺序IO,反之则是随机读占多数,如果有可能就可以修改应用程序尽量避免大量随机IO产生。 avgqu-sz相对正常机器偏大的话,就代表IO请求队列过大,IO负载有点偏高了。 svctm可以作为硬盘性能的一个指标,值越小,代表性能越好。 await 实际上是svctm加上等待时间,await与svctm越相近,说明系统IO越空闲。 %util是最直观的体现IO性能的,>50就代表IO忙了,100就说明IO饱和,系统会变的很慢。


当内存快要耗尽,并且swap分区开启的情况下,系统会出现频繁的换页操作,这种情况也会将IO打满,所以在系统慢的时候是需要结合CPU、内存和IO共同来确定原因。


3. 网络


还有一个让人头痛的子系统,那就是网络。网络的连通涉及到很多复杂的事情,系统为我们提供了一系列的网络诊断工具。当网卡性能出现问题,也就 是网络传输的速率明显低于预期的时候,可以通过下面几个步骤来确定原因:


  • 确定网卡工作速率是否正常,目前普通服务器一般都是1000Mb/s,使用命令ethtool eth0 | grep Speed,如果不是预期的速率,那么有可能是 网卡、网线、水晶头或者是交换机接口出现问题。

  • 理论上千M网卡的数据传输速度能够达到1000/8MB/s, 如果我们的数据足够大,而通过sar -n DEV 1 观测到的速率远小于理论最大值,那么问题可能是带宽、对端性能、自身硬盘速率或应用程序中的一种。带宽与对端性能都是本机不可控的因素。一般来说数据传输都需要写入硬盘,而硬盘的写入速度比网卡速度低,因此导致传输速率慢,可以通过使用内存来缓存数据的方式解决,或者提升硬盘的性能例如使用SSD;而应用程序的原因就是在接收或者发送数据之前,应用程序的处理逻辑导致其变慢,例如在使用scp或者rsync传输拷贝数据的时候,一般即使是在使用SSD硬盘的情况下也只能达到40MB/s左右,这主要受限于两个命令默认参数下的处理逻辑,特别是耗时的加解密操作。使用ssh的参数-c blowfish,可以将速率提升到50MB/s,这时候CPU已经成了性能瓶颈,将数据分块,同时起多个任务就可以将速率增加到几乎与网卡理论值相同的值。 网络最复杂的还是连接,而不单单是性能问题,对于具体的诊断技术,这里不再叙述。


4. 总结


CPU、内存、IO和网络,基本上覆盖了Linux系统多数情况下的性能问题。除此以外,还有系统全局的,例如资源限制(经常遇到的不能打开文件,不能创建进程等),系统参数(例如tcp_max_tw_buckets 设置过小会导致连接数达到一定数量后网络连接建立不成功)等。当然每个问题都有其特殊性,需要具体问题具体分析,并且需要多方面因素一起联动分析。有很多问题,我们也没有一个永久有效的排查方法,只能根据经验和系统相关指标来找寻答案,总是在学习中慢慢成长,同时在成长中继续学习。



网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击