linux性能监测

一个完整运行的 Linux 系统包括很多子系统(介绍,CPU,Memory,IO,Network,…),监测和评估这些子系统是性能监测的一部分。我们往往需要宏观的看整个系统状态,也需要微观的看每个子系统的运行情况。

系统由若干子系统构成,通常修改一个子系统有可能影响到另外一个子系统,甚至会导致整个系统不稳定、崩溃。所以说优化、监测、测试通常是连在一起的,而且是一个循环而且长期的过程,通常监测的子系统有以下这些:

  • CPU
  • Memory
  • IO
  • Network

这些子系统互相依赖,了解这些子系统的特性,监测这些子系统的性能参数以及及时发现可能会出现的瓶颈对系统优化很有帮助。

应用类型

不同的系统用途也不同,要找到性能瓶颈需要知道系统跑的是什么应用、有些什么特点,分清不同系统的应用类型很重要,通常应用可以分为两种类型:

  1. IO 密集型,IO 相关的应用通常用来处理大量数据,需要大量内存和存储,频繁 IO 操作读写数据,而对 CPU 的要求则较少,大部分时候 CPU 都在等待硬盘或者网络IO,比如,数据库服务器、文件服务器等。

  2. CPU 密集型,CPU 相关的应用需要使用大量 CPU,比如高并发的图像/视频处理、科学计算等都可被视作 CPU 相关的应用。

CPU性能

CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中断让 CPU 知道拷贝已经完成;科学计算通常占用较多的 CPU,大部分计算工作都需要在 CPU 上完成,内存、硬盘等子系统只做暂时的数据存储工作。

要想监测和理解 CPU 的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等。

CPU使用率

top命令显示的是程序在运行期间实时占用的CPU百分比

  1. User Time(us): CPU在用户空间运行线程所花的时间的百分比
  2. System Time(sy): CPU执行内核线程和中断(interrupt)所花的时间的百分比
  3. Wait IO(wa): 所有进程因为等待IO完成而被阻塞,导致CPU idle所花的时间的百分比
  4. Idle(id): CPU完全idle的时间的百分比

sy较高时说明内核消耗的cpu资源很多,代表用户进程消耗时间占比,如果长期大于50%,就需要引起注意
根据经验us+sy的参考值为80%,如果us+sy大于80%说明cpu资源不足。

上下文切换

线程在运行过程中,CPU时间片用完,或者是被更高优先级的的资源抢占了CPU,该线程都会被放到一个等待队列,等待下一次被调度,这样的一次过程称为一次上下文切换,上下文切换是有一定开销的,需要一定的时间进行事务处理:保存和装入寄存器值以及内存影响,更新各种表格和列表,清除和重新调入内存高速缓存等,这些过程大概会消耗1ms左右的时间,时间片长度20~50ms,一个线程在这段时间内会完全占用cpu,但是如果发生阻塞,如等待io,就会立即释放时间片,这样就会产生较多的上下文切换,降低cpu利用率。

可运行队列

线上linux操作系统一般采用时间片轮转算法和优先级结合的方法进行线程作业调度,监控CPU调度程序运行队列对于分辨系统是否满负荷运行具有重要意义。运行队列(run queue)中就是那些已准备好运行、正等待可用CPU的轻量级进程。如果准备运行的轻量级进程数超过系统所能处理的上限,运行队列就会很长,时间片长度时间片一般被设置成20~50ms,时间片到了才会触发线程切换,操作系统调度其它任务执行,运行队列长表明系统负载可能已经饱和,任务可能会等待很长一段时间才被调度,轮到一个任务执行的时间就越长,响应就越慢。系统运行队列长度等于处理器个数时,用户不会明显感觉到性能下降。当运行队列长度达到虚拟机处理的4倍或者更多时,系统的响应就非常迟缓了。

CPU负载

Load(也就是cpu run queue的长度)显示的是一段时间内正在使用CPU和等待使用CPU的平均任务数。CPU使用率高,并不意味着负载就一定大。举例来说:如果我有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的工作负载则是趋近于“1”,因为CPU仅负责一个工作嘛!如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。所以也就是说,当CPU的工作负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。

调度的优先级

在Linux系统中,内核scheduler调度资源包括两种:threads(Process是由threads组成)和interrupt,这些被调度的资源是有特定的优先级的,以下从高到底:

  1. Interrupts: Interrupt被设备用来通知内核相关的事件,优先级是最高的
  2. Kernel(System) Processes:所有的系统进程都是以仅次于Interrupt的优先级被调度的
  3. User Processes: 所有的应用程序都是run在用户态空间,以最低的优先级被内核调度

一般指导性原则:

  • 如果很长一段时间里,运行队列的长度一直超过处理器个数的1倍,就需要关注,只是暂时还不需要立刻采取行动。
  • 如果很长一段时间里,运行队列的长度达到处理器个数的3~4倍或更高,则需要立刻引起注意或采取行动。

vmstat命令

Linux操作系统可以用vmstat命令监控运行队列的长度,vmstat输出的第一列就是运行队列长度。

vmstatvmstat

  • r 可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用。
  • b 表式等待资源的进程数,比如正在等待I/O、或者内存交换等。
  • in,被处理过的中断数
  • cs,系统上正在做上下文切换的数目
  • us,用户占用 CPU 的百分比
  • sy,内核和中断占用 CPU 的百分比
  • wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
  • id,CPU 完全空闲的百分比

中断数(in)明显远大于上下文切换的数目(cs)暗示可能有进程不停地访问外设监控 CPU 性能由以下几个部分组成:

  1. 检查system的运行队列,以及确定不要超出每个处理器3个可运行状态线程的限制.
  2. 确定CPU 利用率中user/system比例维持在70/30
  3. 当CPU 开销更多的时间在system mode,那就说明已经超负荷并且应该尝试重新调度优先级
  4. 当I/O 处理得到增长,CPU 范畴的应用处理将受到影响

内存

Linux操作系统采用虚拟存储分页技术,并通过MMU将虚拟地址映射为物理地址,虚拟地址空间以页面为单位划分,在物理内存中对应的单位成为页帧。页面和页帧的大小总是一样的,常用页的大小一般从512字节到64K,RAM和磁盘之间的转换总是以页面为单位, 页面在物理内存和磁盘之间会采用一定的置换算法换入换出,当内核写内存到磁盘或者读磁盘到内存,这就是一次写内存到页的过程.内核通常是在swap分区和文件系统之间进行这样的操作.

内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K。Linux 内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的.

缺页中断

Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。

Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断
(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高

vmstat命令

  • swpd ,表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。
  • free,可用的物理内存大小,KB 为单位;
  • buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位,一般对块设备的读写才需要缓冲。;
  • cache,列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
  • si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
  • so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位;
  • bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
  • bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;

一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存

磁盘IO

磁盘I/O子系统是Linux 系统中最慢的部分,每次磁盘 IO 请求都需要一定的时间,和访问内存比起来这个等待时间简直难以忍受,Linux内核优化需要最低程度的降低I/O 数,Linux会合并操作相邻扇区的IO请求。

IO 可分为顺序 IO 和 随机 IO 两种,顺序IO消耗传输能力,而随机IO消耗的是寻址能力,性能监测前需要弄清楚系统偏向顺序 IO 的应用还是随机 IO 应用。顺序 IO 是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序 IO 可以同时很快的移动大量数据。相对随机 IO 而言,顺序 IO 更应该重视每次 IO 的吞吐能力。

随机 IO 是指随机请求数据,其 IO 速度不依赖于数据的大小和排列,依赖于磁盘的每秒能 IO 的次数,每次请求的数据都很小,随机 IO 每秒同时会有更多的请求数产生,所以磁盘的每秒能 IO 多少次是关键。

iostat

man iostat 可以看到详细说明,下面仅选取关键部分进行说明;

常用参数

  • iostat -c :和top命令的cpu信息一致
  • iostat -d :吞吐率、每秒读写、总的读写
  • iostat -x :每秒读写次数、平均IO队列长度、平均每次IO操作总耗时、平均每次IO操作的实际执行时间、IO使用率。

指标说明

  • Blk_read/s表示每秒读取的数据块数。
  • Blk_wrtn/s表示每秒写入的数据块数。
  • Blk_read表示读取的所有块数。
  • Blk_wrtn表示写入的所有块数。

需要关注的几个参数含义:

  1. await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
  2. svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
  3. %util表示一秒中有百分之几的时间用于I/O操作。

对以磁盘IO性能,一般有如下评判标准:

正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。

await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。

%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。

swap

当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用 swap 的代价非常大。如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们已经有很多工具可以用来监测 swap 和 swapping 情况,比如:top、cat /proc/meminfo、vmstat 等

高速缓存更新策略

Linux采用的策略,称为“回写”,在这种策略下,程序执行写操作直接写到缓存中,后端存储不会利可直接更新,而是将页高速缓存中被写入的页面标记为“脏”,并且被加到脏页链表中。然后由一个进程(回写进程)周期性将脏页链表中的页写回到磁盘,从而让内存数据和磁盘中的一致。最后清理“脏页”标识。回写策略要好于写透策略,因为通过延迟写磁盘,方便以后的时候合并更多的数据和再一次刷新

Network

网络环境恶化包含以太网冲突情况、拥塞等也涉及到各种利用tcp/ip协议漏洞进行的攻击,如syn flood攻击。

猜你喜欢

转载自fxbull.iteye.com/blog/2292092