《linux 性能测试与分析》由会员分享,可在线阅读,更多相关《linux 性能测试与分析(22页珍藏版)》请在金锄头文库上搜索。
1、Linux 性能测试与分析Linux 性能测试与分析Revision HistoryVersion Date Author Description1.0 2011/5/26 初稿1.1 2011/6/23 添加 CPU 分析1.2 2012/2/20 添加 MEM,IO 分析1.3 2012/2/23 更新工作原理1.4 2012/2/25 添加中断分析1.5 2012/2/28 添加网络分析1 性能测试简介l 性能测试的过程就是找到系统瓶颈的过程。l 性能测试(包括分析和调优)的过程就是在操作系统的各个子系统之间取得平衡的过程。l 操作系统的各个子系统包括: CPU Memory
2、 IO Network他们之间高度依赖,互相影响。比如:1. 频繁的磁盘读写会增加对内存的使用2. 大量的网络吞吐,一定意味着非常可观的 CPU 利用率3. 可用内存的减少可能增加大量的 swapping,从而使系统负载上升甚至崩溃2 应用程序类型性能测试之前,你首先需要判断你的应用程序是属于那种类型的,这可以帮助你判断哪个子系统可能会成为瓶颈。通常可分为如下两种:CPU bound 这类程序,cpu 往往会处于很高的负载,当系统压力上升时,相对于磁盘和内存,往往 CPU 首先到达瓶颈。Web server,mail server 以及大部分服务类程序都属于这一类。I/O bound 这类程序
3、,往往会频繁的访问磁盘,从而发送大量的 IO 请求。IO 类应用程序往往利用 cpu 发送 IO 请求之后,便进入 sleep 状态,从而造成很高的 IOWAIT。数据库类程序,cache 服务器往往属于这种类型。3 CPU3.1 性能瓶颈3.1.1 运算性能瓶颈作为计算机的计算单元,其运算能力方面,可能出现如下瓶颈:1. 用户态进程 CPU 占用率很高2. 系统态(内核态)CPU 占用率很高测试 CPU 的运算性能,通常是通过计算圆周率来测试 CPU 的浮点运算能力和稳定性。据说Pentium CPU 的一个运算 bug 就是通过计算圆周率来发现的。圆周率的计算方法,通常是计算小数点后 10
4、4 万位,通过比较运算时间来评测 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 可能会
5、出现如下性能瓶颈: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
6、.1 参数含义 LoadLoad 是指 CPU 所有内核正在处理的任务加上处于运行队列中的进程数之和。处于运行队列(run queue)中的进程包括 TASK_RUNNING 和 TASK_UNINTERRUPTIBLE 两种状态的任务: 处于可运行状态的进程 等待不可中断任务的进程在一个双核的系统中,如果两个进程正在执行,有四个进程处于 run quque 当中,那么load 就是 6Vmstat 中 r 指的就是 run queue 中的进程数目对比一下同一时刻 top 统计出来的 load Nice%用户进程空间内,通过调用 nice 或 setpriority 系统调用改变过优先级的进
7、程的 CPU 占用率 Iowait%CPU 等待 IO 操作的时间 Idle%CPU 空闲时间 Intr/s每秒钟处理的中断数 Hi%服务于 IRQs 的时间占比 Si%服务于 Soft IRQs 的时间占比 St%关于 st 的解释,在 IBM 的一份文档里,有一段描述:IBMs 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 ano
8、ther virtual processor.3.3 工作原理为了更好地理解 CPU 的性能参数,需要了解下面几个概念3.3.1 进程及进程调度算法1. 什么是线程图 3:进程和线程的数据结构 从性能测试角度来看,我倾向于这样理解线程:1. 线程和进程的确不同,因为他们可以共享进程的资源,如地址空间等。因此在上下文切换的过程中线程可能会产生较小的性能损耗。2. 站在调度器(scheduler)的角度来说,线程就是一个进程,或者说是一个轻量级的进程(Light Weight Process)。Kernel 实际上就是通过轻量级的进程来支持多线程应用程序的。我们经常用的线程开发库 pthread
9、就是通过将轻量级进程和线程关联起来,来实现的。这样既可以实现资源的共享,又可以让每个线程被调度器独立调度。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.
10、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)引脚相关联。每个
11、IRQ 输出线的中断信号,只能被一个 CPU core 处理,IRQ 线从 0 开始编号。如何观察 IRQ 的状态:问题 3:大量的中断,是否会使 CPU 响应中断成为瓶颈呢?答案是一般不会,中断享有最高的优先级,有硬件中断发生时,CPU 会立即停下手中的工作,响应中断,并调用相应中断处理程序。瓶颈一般发生在中断处理程序。IRQ 硬件中断是否意味着不会出现瓶颈呢?瓶颈有可能出现在中断的服务例程中,看下面的流程图:IRQ 在多处理器上的分发:遵循对称多处理模型,每个 IO 中断的处理时间片是相同的,均匀分配。Kernel 通过中断向量表来将中断信号发送到特定的 CPU 上去。在必要的时候,Lin
12、ux 2.6 利用 kirqd 的内核线程来纠正 IRQ 在 CPU 上的分配。kirqd 线程周期性的执行扫描每个 CPU 处理的中断个数,发现不均衡时重新调整 CPU 的负载。下面的案例表明,IRQ 在 CPU 上的分配不够均衡,因为 8 个 CPU,只有 4 个 CPU 有负载:3.3.5 软中断Linux kernel 通过一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断(softirq)。Linux 中的软中断软中断 说明NET_TX_SOFTIRQ 把数据包传送到网卡NET_RX_SOFTIRQ 从网卡接收数据包从网卡到 IP 层的数据处理,是有以上软中断来处理的。
13、软中断是否可能出现瓶颈呢?Ksoftirqd每个 CPU 都有自己的 ksoftirqd/n(n 为 CPU 的逻辑号码)。每个 ksoftirqd/n 内核线程都运行 ksoftirqd()函数来处理自己的中端队列上的软中断。当网卡和 IP 层数据包处理很繁忙时,中断处理程序会出现瓶颈.下图可看出 ksoftirqd 出现了瓶颈:软中断处理出现瓶颈,ksoftirqd 可通过 cpu 的 si%的来观察到。4 内存4.1 虚拟内存Linux kernel 使用虚拟内存机制来利用磁盘对内存的空间进行扩展。Kernel 将暂时不用的内存写入到磁盘从而释放出更多的可用内存。当这些数据再次被使用时,
14、会被重新加载到内存当中。用作虚拟内存的磁盘空间被称作 swap space。对硬盘的读写,相对于内存来说速度要慢许多,因此使用了虚拟内存的程序,速度也会相应变慢。对虚拟内存的使用,往往被认为是内存出现瓶颈的标志。问题 n:swap 空间被使用是否意味着出现了内存瓶颈?Kswapd 和 Page Frame Reclaim Algorithm当系统的可用内存低于阈值时(page_low,page_high),kswpad 服务比那开始扫描可以被swap out 的空间,并试图一次 swap out 32 个内存页。该过程不断重复知道可用内存达到page_high 水平线位置。被 swap out
15、 的内存也被放在 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 页高速缓存页高速缓存是 Lin