《Linux 性能测试与分析(10页).doc》由会员分享,可在线阅读,更多相关《Linux 性能测试与分析(10页).doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-Linux 性能测试与分析-第 10 页Linux性能测试与分析Linux 性能测试与分析Revision HistoryVersionDateAuthorDescription1.02011/5/26dengwu初稿1.12011/6/23dengwu添加CPU分析1.22012/2/20dengwu添加MEM,IO分析1.32012/2/23dengwu更新工作原理1.42012/2/25dengwu添加中断分析1.52012/2/28dengwu添加网络分析1性能测试简介l性能测试的过程就是找到系统瓶颈的过程。l性能测试(包括分析和调优)的过程就是在操作系统的各个子系统之间取得平衡的过
2、程。l操作系统的各个子系统包括:CPUMemoryIONetwork他们之间高度依赖,互相影响。比如:1.频繁的磁盘读写会增加对内存的使用2.大量的网络吞吐,一定意味着非常可观的CPU利用率3.可用内存的减少可能增加大量的swapping,从而使系统负载上升甚至崩溃2应用程序类型性能测试之前,你首先需要判断你的应用程序是属于那种类型的,这可以帮助你判断哪个子系统可能会成为瓶颈。通常可分为如下两种:CPU bound 这类程序,cpu往往会处于很高的负载,当系统压力上升时,相对于磁盘和内存,往往CPU首先到达瓶颈。Web server,mail server以及大部分服务类程序都属于这一类。I/
3、O bound 这类程序,往往会频繁的访问磁盘,从而发送大量的IO请求。IO类应用程序往往利用cpu发送IO请求之后,便进入sleep状态,从而造成很高的IOWAIT。数据库类程序,cache服务器往往属于这种类型。3CPU3.1性能瓶颈3.1.1运算性能瓶颈作为计算机的计算单元,其运算能力方面,可能出现如下瓶颈:1.用户态进程CPU占用率很高2.系统态(内核态)CPU占用率很高测试CPU的运算性能,通常是通过计算圆周率来测试CPU的浮点运算能力和稳定性。据说Pentium CPU的一个运算bug就是通过计算圆周率来发现的。圆周率的计算方法,通常是计算小数点后104万位,通过比较运算时间来评测
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可能会出现如下性能瓶颈:1.Load平均值超过了系统可承受的程度2.IOWait占
5、比过高,导致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)中
6、的进程包括TASK_RUNNING 和 TASK_UNINTERRUPTIBLE两种状态的任务:处于可运行状态的进程等待不可中断任务的进程在一个双核的系统中,如果两个进程正在执行,有四个进程处于run quque当中,那么load就是6Vmstat 中 r 指的就是run queue中的进程数目对比一下同一时刻top统计出来的loadNice%用户进程空间内,通过调用nice或setpriority系统调用改变过优先级的进程的CPU占用率Iowait%CPU等待IO操作的时间Idle%CPU空闲时间Intr/s每秒钟处理的中断数Hi%服务于IRQs的时间占比Si%服务于Soft IRQs的时间
7、占比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 another virtual processor.3.3工作原理为了更好地理解CPU的性能参数,需要了解下面几个概念3.3.1进程及进程调度算法1.什么是线程图3:进程和线程的数据结构从性能测试角度来看,我倾向于这样理
8、解线程:1.线程和进程的确不同,因为他们可以共享进程的资源,如地址空间等。因此在上下文切换的过程中线程可能会产生较小的性能损耗。2.站在调度器(scheduler)的角度来说,线程就是一个进程,或者说是一个轻量级的进程(Light Weight Process)。Kernel实际上就是通过轻量级的进程来支持多线程应用程序的。我们经常用的线程开发库pthread就是通过将轻量级进程和线程关联起来,来实现的。这样既可以实现资源的共享,又可以让每个线程被调度器独立调度。2.进程的状态可运行状态(TASK_RUNNING)不可中断的等待状态(TASK_UNINTERRUPTIBLE)暂停状态(TASK
9、_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(I
10、nterrupt ReQuest)请求叫做中断请求(可屏蔽中断)每个能够发出中断的IO设备都有一个IRQ输出线(部分高级千兆网卡,和大部分万兆网卡都多条IRQ输出线)。每条IRQ输出线和可编程中断控制器(Programmable Interrupt Controller)引脚相关联。每个IRQ输出线的中断信号,只能被一个CPU core处理,IRQ线从0开始编号。如何观察IRQ的状态:问题3:大量的中断,是否会使CPU响应中断成为瓶颈呢?答案是一般不会,中断享有最高的优先级,有硬件中断发生时,CPU会立即停下手中的工作,响应中断,并调用相应中断处理程序。瓶颈一般发生在中断处理程序。IRQ硬件中
11、断是否意味着不会出现瓶颈呢?瓶颈有可能出现在中断的服务例程中,看下面的流程图:IRQ在多处理器上的分发:遵循对称多处理模型,每个IO中断的处理时间片是相同的,均匀分配。Kernel通过中断向量表来将中断信号发送到特定的CPU上去。在必要的时候,Linux 2.6利用kirqd的内核线程来纠正IRQ在CPU上的分配。kirqd线程周期性的执行扫描每个CPU处理的中断个数,发现不均衡时重新调整CPU的负载。下面的案例表明,IRQ在CPU上的分配不够均衡,因为8个CPU,只有4个CPU有负载:3.3.5软中断Linux kernel通过一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断
12、(softirq)。Linux 中的软中断软中断说明NET_TX_SOFTIRQ把数据包传送到网卡NET_RX_SOFTIRQ从网卡接收数据包从网卡到IP层的数据处理,是有以上软中断来处理的。软中断是否可能出现瓶颈呢?Ksoftirqd每个CPU都有自己的ksoftirqd/n(n为CPU的逻辑号码)。每个ksoftirqd/n内核线程都运行ksoftirqd()函数来处理自己的中端队列上的软中断。当网卡和IP层数据包处理很繁忙时,中断处理程序会出现瓶颈.下图可看出ksoftirqd出现了瓶颈:软中断处理出现瓶颈,ksoftirqd可通过cpu的 si%的来观察到。4内存4.1虚拟内存Linu
13、x kernel使用虚拟内存机制来利用磁盘对内存的空间进行扩展。Kernel将暂时不用的内存写入到磁盘从而释放出更多的可用内存。当这些数据再次被使用时,会被重新加载到内存当中。用作虚拟内存的磁盘空间被称作swap space。对硬盘的读写,相对于内存来说速度要慢许多,因此使用了虚拟内存的程序,速度也会相应变慢。对虚拟内存的使用,往往被认为是内存出现瓶颈的标志。问题n:swap空间被使用是否意味着出现了内存瓶颈?Kswapd和Page Frame Reclaim Algorithm当系统的可用内存低于阈值时(page_low,page_high),kswpad服务比那开始扫描可以被swap ou
14、t的空间,并试图一次swap out 32个内存页。该过程不断重复知道可用内存达到page_high水平线位置。被swap out的内存也被放在swap spae当中。Kswapd回收内存的算法被称作Page Frame Reclaim Algorithm,一下类型的内存也是可以被回收的:Swappable anonymous memory pagesSyncable pages backed by a disk fileDiscardable static pages, discarded pages内存的回收采用LRU策略,最近不被经常使用的内存页,应该首先被回收。现在来回答上面的问题:s
15、wap空间被利用恰恰说明了Linux的内存使用的合理性,并不能表示内存出现了瓶颈。对Swap空间的换入换出的速率是表征内存出现瓶颈的重要标志。5IOIO 子系统架构图5.1页高速缓存页高速缓存是Linux kernel使用的主要的磁盘缓存技术。磁盘高速缓存是一种软件机制,它允许系统把存放在磁盘上的一些数据保留在内存中,以便对那些数据的再次访问不再需要访问磁盘。Kernel在读取磁盘时,如果数据页不再高速缓存当中,就会将读出的磁盘数据填充到页高速缓存当中。通过将数据页在高速缓存当中驻留,从而使进程再使用该页时不再需要访问磁盘。Kernel在把一页数据写到磁盘之前,首先检查页是否已经在高速缓存当中
16、,如果不在,首先会将页数据填充到高速缓存当中。更新到磁盘I/O的动作不是立即进行的,而是会有一点延时,从而使进程有机会对写入的数据进一步修改,这就是内核的延迟写操作。脏数据的同步进程对页高速缓冲区中的数据修改之后,数据页被标记为”脏数据”,即把PG_Dirty标志置位。Linux系统允许对脏数据写入磁盘块设备的延迟操作,被认为是显著增加了系统I/O能力的一种机制。在下列条件下,脏数据写入磁盘:1.页高速缓存空间不足2.变脏以来,太久没有过更新3.进程通过系统调用(sync(),fsync(),fdataasync()来强行对将对快设备的更新同步到磁盘。Msync系统调用用来将内存映射状态下的脏
17、数据刷新到磁盘。PdflushPdflush内核线程负责定期扫描缓存中的脏数据,并在合适的时候将其更新到磁盘。定时器一般是500分之一秒,可以通过/proc/sys/vm/dirty_writeback_centisecs文件调整这个值。Pdflush线程的个数是根据情况动态调整的:1.至少有2个,最多有8个pdflush线程。(通过/proc/sys/vm/nr_pdflush_threads参数)可以修改这些变量的值。2.如果最近1s内,没有空闲的pdflush线程,就创建新的。3.如果pdflush的空闲时间超过了1s,就删除一个pdflush。Buffer/cacheCache - 全
18、称page cache。当进程发起对磁盘的读写操作时,主要用来在内存中缓存磁盘中的数据,与磁盘的同步由pdflush负责。Buffer 全称block buffer。Block buffer中存放的是bio结构体数据。BIO 结构体是VFS和 block layer之间的接口。通俗的理解,Block buffer是page cache和磁盘驱动器之间打交道的一层缓存。系统页高速缓存的使用情况可以通过buffer/cache的监控数据来分析。从文件读写角度来看,buffer多用于缓存文件的管理信息,如目录位置,inode信息等。Cache缓存的是文件内容。由于CPU不能直接处理外设上的数据,bu
19、ffer用来标记那些文件的位置等描述信息。Cache主要目的是增加传输性能,用于缓存文件内容。从操作系统的工作原理来讲,buffer/cache的目的主要是为了减少MPFs,增加MnPFs。MPFKernel要读取数据的时候,首先会查找CPU 的cache然后是物理内存,如果没有会发出一个major page fault(MPF)。一个MPF可以看作是kernel发送的一个请求,将磁盘数据加载到内存。MnPF当磁盘数据被加载到内存当中,kernel再次读取时,会发出一个minor page fault(MnPF)。下面的例子展示了第一次访问一个程序和第二次访问同样的程序所产生的MPF和MnPF
20、。/usr/bin/time -v javaMajor (requiring I/O) page faults: 103Minor (reclaiming a frame) page faults: 2356第二次访问:/usr/bin/time -v javaMajor (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 2581下图展示了磁盘高速缓存过程强行同步全部页高速缓存此处介绍强行将所有内存缓存数据同步到磁盘,并演示释放后的free输出结果Free pagecacheEcho 1 /proc/sy
21、s/vm/drop_caches;Free dentries and inodesEcho 2 /proc/sys/vm/drop_caches;Free pagecache and dentries and inodesEcho 3 /proc/sys/vm/drop_caches;Direct I/O有一些更复杂的程序(通常称为自缓存应用程序),更愿意自己控制I/O的传输过程(),通过将O_DIRECT标志位置位,I/O数据的传送便绕过了页高速缓存。出于以下原因,系统页高速缓存技术是有害的:1.处理页高速缓存的多余指令,降低了read(),write()的效率2.Read(),write(
22、)系统调用不是在磁盘和用户空间直接传送,而是分成两步:在磁盘和内核空间,在内核空间到用户空间。与页高速缓存相关的系统参数1./proc/sys/vm/dirty_background_ratio表示系统可用内存中,最高可用于存储 dirty 数据的百分比。The maximum of percentage of(cache+free)-mapped)。缺省10%。2./proc/sys/vm/dirty_ratio表示进程产生的脏数据到达系统整体内存的百分比,此时触发pdflush进程把数据回写到磁盘。缺省设置40.3./proc/sys/vm/dirty_expire_centisecs表示
23、脏数据在内存中驻留超过该值,pdflush会将该数据回写到磁盘。缺省是3000。4./proc/sys/vm/dirty_writeback_centisecs表示pdflush周期性间隔多久处理脏数据回写。6网络6.1性能瓶颈标识6.1.1through put出现瓶颈sar n DEV 16.1.2网卡出现丢包通常情况下,网络性能测试的极限是不能出现丢包。下表是千兆网卡的丢包率情况:6.1.3网卡出现错误(errors)6.1.4Socket buffer出现泄露观察方法:sudo cat /proc/slabinfo |grep skb6.1.5CPU的软中断处理程序成为瓶颈6.2认识你
24、的网卡此处贴图千兆网卡和万兆网卡的lspci和ethtool eth0的对比。千兆 Broadcom网卡万兆Intel网卡6.3监控网络流量6.4测试工具iperf -网络性能评测工具netperf - TCP/IP层的网络测试工具packet gen 集成在内核的IP层发包工具TC Traffic Control.流量控制tsung 分布式并发压力测试工具httpsender http压力测试工具synfloodEx TCP攻击工具udpflood UDP攻击工具6.5调整你的进程最大连接数通过以下方法可以修改进程的最大连接数到60000sudo vi /etc/security/limit
25、s.conf* soft nofile 60000* hard nofile 600006.6重用你的time_wait状态的连接sudo vi /etc/sysctl.confnet.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1sudo sysctl -p 生效6.7如何利用TrafficControl进行流量控制每个网卡接口(network interface),都有一个hook点,即允许用户添加一个策略(qdisk),默认的处理策略是FIFO。6.7.1利用TC修改网络延时添加策略:sudo tc qdisc add dev eth0
26、root netem delay 1000ms删除策略:sudo tc qdisc del dev eth0 root netem delay 1000ms6.7.2利用TC控制丢包率添加策略:sudo tc qdisc add dev eth0 root netem loss 10%删除策略:sudo tc qdisc del dev eth0 root netem loss 10%6.7.3利用TC控制上行或下行带宽控制上行速度sudo tc qdisc add dev eth0 root tbf rate 5800kbit latency 50ms burst 1540sudo tc q
27、disc del dev eth0 root tbf rate 5800kbit latency 50ms burst 1540在本机上限制对10.10.10.21的下载带宽sudo tc qdisc add dev eth0 root handle 2: htbsudo tc class add dev eth0 parent 2: classid 2:1 htb rate 5120kbitsudo tc class add dev eth0 parent 2:1 classid 2:21 htb rate 5120kbit ceil 6000kbit burst 100ksudo tc qdisc add dev eth0 parent 2:21 handle 21: sfqsudo tc filter add dev eth0 parent 2:0 protocol ip prio 4 u32 match ip dst 10.10.10.21 flowid 2:21更多TC资料:6.8Tsung控制客户端集群发送http请求6.9Httpsender发送http请求,通过md5验证数据一致性6.10 Synflood packet gen发送大量报文6.11 UDPFlood发送大量udp报文转载自:
限制150内