当前位置:文档之家› Linux 性能测试与分析报告

Linux 性能测试与分析报告

Linux 性能测试与分析Linux 性能测试与分析Revision History1 性能测试简介l 性能测试的过程就是找到系统瓶颈的过程。

l 性能测试(包括分析和调优)的过程就是在操作系统的各个子系统之间取得平衡的过程。

l 操作系统的各个子系统包括:ØCPUØMemoryØIOØNetwork他们之间高度依赖,互相影响。

比如:1. 频繁的磁盘读写会增加对存的使用2. 大量的网络吞吐,一定意味着非常可观的CPU利用率3. 可用存的减少可能增加大量的swapping,从而使系统负载上升甚至崩溃2 应用程序类型性能测试之前,你首先需要判断你的应用程序是属于那种类型的,这可以帮助你判断哪个子系统可能会成为瓶颈。

通常可分为如下两种:CPU bound –这类程序,cpu往往会处于很高的负载,当系统压力上升时,相对于磁盘和存,往往CPU首先到达瓶颈。

Web server,mail server以及大部分服务类程序都属于这一类。

I/O bound –这类程序,往往会频繁的访问磁盘,从而发送大量的IO请求。

IO类应用程序往往利用cpu发送IO请求之后,便进入sleep状态,从而造成很高的IOWAIT。

数据库类程序,cache服务器往往属于这种类型。

3 CPU3.1 性能瓶颈3.1.1 运算性能瓶颈作为计算机的计算单元,其运算能力方面,可能出现如下瓶颈:1. 用户态进程CPU占用率很高2. 系统态(核态)CPU占用率很高测试CPU的运算性能,通常是通过计算圆周率来测试CPU的浮点运算能力和稳定性。

据说Pentium CPU的一个运算bug就是通过计算圆周率来发现的。

圆周率的计算方法,通常是计算小数点后104万位,通过比较运算时间来评测CPU的运算能力。

常用工具:1. SUPER PI(π)2. Wprime 与SuperPI不同的是,可以支持多核CPU的运算速度测试3. FritzChess 一款国际象棋测试软件,测试每秒钟可运算的步数突破CPU的运算瓶颈,一般只能靠花钱。

比如提高时钟频率,提高L1,L2 cache容量或不断追求新一代的CPU架构:Core -> Nehalem(E55x,如r710,dsc1100) -> Westmere –> Sandy Bridge3.1.2 调度性能瓶颈CPU除了负责计算之外,另一个非常重要的功能就是调度。

在调度方面,CPU可能会出现如下性能瓶颈:1. Load平均值超过了系统可承受的程度2. IOWait占比过高,导致Load上升或是引入新的磁盘瓶颈3. Context Switch过高,导致CPU就像个搬运工一样,频繁在寄存器(CPU Register)和运行队列(run queue)之间奔波4. 硬中断CPU占比接近于100%5. 软中断CPU占比接近于100%超线程超线程芯片可以使得当前线程在访问存的间隙,处理器可以使用它的机器周期去执行另外一个线程。

一个超线程的物理CPU可以被kernel看作是两个独立的CPU。

3.2 典型监控参数图1:top图2:mpstat3.2.1 参数含义ØLoadLoad是指CPU所有核正在处理的任务加上处于运行队列中的进程数之和。

处于运行队列(run queue)中的进程包括TASK_RUNNING 和 TASK_UNINTERRUPTIBLE两种状态的任务:Ø处于可运行状态的进程Ø等待不可中断任务的进程在一个双核的系统中,如果两个进程正在执行,有四个进程处于run quque当中,那么load 就是6Vmstat 中 r 指的就是run queue中的进程数目对比一下同一时刻top统计出来的loadØNice%用户进程空间,通过调用nice或setpriority系统调用改变过优先级的进程的CPU占用率ØIowait%CPU等待IO操作的时间ØIdle%CPU空闲时间ØIntr/s每秒钟处理的中断数ØHi%服务于IRQs的时间占比ØSi%服务于Soft IRQs的时间占比ØSt%关于st的解释,在IBM的一份文档里,有一段描述:IBM’s definition of steal time is actually pretty good:Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor.3.3 工作原理为了更好地理解CPU的性能参数,需要了解下面几个概念3.3.1 进程及进程调度算法1. 什么是线程图3:进程和线程的数据结构从性能测试角度来看,我倾向于这样理解线程:1. 线程和进程的确不同,因为他们可以共享进程的资源,如地址空间等。

因此在上下文切换的过程中线程可能会产生较小的性能损耗。

2. 站在调度器(scheduler)的角度来说,线程就是一个进程,或者说是一个轻量级的进程(Light Weight Process)。

Kernel实际上就是通过轻量级的进程来支持多线程应用程序的。

我们经常用的线程开发库pthread就是通过将轻量级进程和线程关联起来,来实现的。

这样既可以实现资源的共享,又可以让每个线程被调度器独立调度。

2. 进程的状态Ø可运行状态(TASK_RUNNING)Ø不可中断的等待状态(TASK_UNINTERRUPTIBLE)Ø暂停状态(TASK_STOPPED)Ø跟踪状态(TASK_TRACED)Ø僵死状态(EXIT_ZOMBIE)问题 Wait io%包含在idle%当中吗?从下面top实例可以看出,wait io%不属于idle%,等IO的过程被叫做uninterruptible sleepCpu1 : 2.7%us, 3.0%sy, 0.0%ni, 3.7%id,89.7%wa, 0.0%hi, 1.0%si, 0.0%st3.3.2 上下文切换(Context Switches)3.3.3 运行队列(Run Queue)3.3.4 硬中断性能测试中关注的中断,主要由IO设备所产生,如键盘的一次按键,网卡接收报文等等。

IRQIO设备所发出的IRQ(Interrupt ReQuest)请求叫做中断请求(可屏蔽中断)每个能够发出中断的IO设备都有一个IRQ输出线(部分高级千兆网卡,和大部分万兆网卡都多条IRQ输出线)。

每条IRQ输出线和可编程中断控制器(Programmable Interrupt Controller)引脚相关联。

每个IRQ输出线的中断信号,只能被一个CPU core处理,IRQ线从0开始编号。

如何观察IRQ的状态:问题3:大量的中断,是否会使CPU响应中断成为瓶颈呢?答案是一般不会,中断享有最高的优先级,有硬件中断发生时,CPU会立即停下手中的工作,响应中断,并调用相应中断处理程序。

瓶颈一般发生在中断处理程序。

每个CPU都有自己的ksoftirqd/n(n为CPU的逻辑)。

每个ksoftirqd/n核线程都运行ksoftirqd()函数来处理自己的中端队列上的软中断。

当网卡和IP层数据包处理很繁忙时,中断处理程序会出现瓶颈.下图可看出ksoftirqd出现了瓶颈:软中断处理出现瓶颈,ksoftirqd可通过cpu的 si%的来观察到。

4 存4.1 虚拟存Linux kernel使用虚拟存机制来利用磁盘对存的空间进行扩展。

Kernel将暂时不用的存写入到磁盘从而释放出更多的可用存。

当这些数据再次被使用时,会被重新加载到存当中。

用作虚拟存的磁盘空间被称作swap space。

对硬盘的读写,相对于存来说速度要慢许多,因此使用了虚拟存的程序,速度也会相应变慢。

对虚拟存的使用,往往被认为是存出现瓶颈的标志。

问题n:swap空间被使用是否意味着出现了存瓶颈?Kswapd和Page Frame Reclaim Algorithm当系统的可用存低于阈值时(page_low,page_high),kswpad服务比那开始扫描可以被swap out的空间,并试图一次swap out 32个存页。

该过程不断重复知道可用存达到page_high 水平线位置。

被swap out的存也被放在swap spae当中。

Kswapd回收存的算法被称作Page Frame Reclaim Algorithm,一下类型的存也是可以被回收的:•Swappable – anonymous memory pages•Syncable – pages backed by a disk file•Discardable – static pages, discarded pages存的回收采用LRU策略,最近不被经常使用的存页,应该首先被回收。

现在来回答上面的问题:swap空间被利用恰恰说明了Linux的存使用的合理性,并不能表示存出现了瓶颈。

对Swap空间的换入换出的速率是表征存出现瓶颈的重要标志。

5 IOIO 子系统架构图5.1 页高速缓存页高速缓存是Linux kernel使用的主要的磁盘缓存技术。

磁盘高速缓存是一种软件机制,它允许系统把存放在磁盘上的一些数据保留在存中,以便对那些数据的再次访问不再需要访问磁盘。

Kernel在读取磁盘时,如果数据页不再高速缓存当中,就会将读出的磁盘数据填充到页高速缓存当中。

通过将数据页在高速缓存当中驻留,从而使进程再使用该页时不再需要访问磁盘。

Kernel在把一页数据写到磁盘之前,首先检查页是否已经在高速缓存当中,如果不在,首先会将页数据填充到高速缓存当中。

更新到磁盘I/O的动作不是立即进行的,而是会有一点延时,从而使进程有机会对写入的数据进一步修改,这就是核的延迟写操作。

脏数据的同步进程对页高速缓冲区中的数据修改之后,数据页被标记为”脏数据”,即把PG_Dirty标志置位。

Linux系统允许对脏数据写入磁盘块设备的延迟操作,被认为是显著增加了系统I/O 能力的一种机制。

在下列条件下,脏数据写入磁盘:1. 页高速缓存空间不足2. 变脏以来,太久没有过更新3. 进程通过系统调用(sync(),fsync(),fdataasync())来强行对将对快设备的更新同步到磁盘。

Msync系统调用用来将存映射状态下的脏数据刷新到磁盘。

PdflushPdflush核线程负责定期扫描缓存中的脏数据,并在合适的时候将其更新到磁盘。

定时器一般是500分之一秒,可以通过/proc/sys/vm/dirty_writeback_centisecs文件调整这个值。

相关主题