敲个命令都没反应。TOP命令显示的是一些Oraclesession占用CPU资源太多。杯具的是在服务器上连sqlplus都进不去了,命令都没反应。只好把服务器重启了。重启之后再看了一下,是一个同事测试的SQL有问题。一条SQL占用CPU就30%。
不同的系统用途也不同,要找到性能瓶颈需要知道系统跑的是什么应用、有些什么特点,比如webserver对系统的要求肯定和fileserver不一样,所以分清不同系统的应用类型很重要,通常应用可以分为两种类型:
事先建立一个底线,如果性能监测得到的统计数据跨过这条线,我们就可以说这个系统性能差,如果数据能保持在线内我们就说性能好。建立这样底线需要知道一些理论、额外的负载测试和系统管理员多年的经验。如果自己没有多年的经验,有一个简单划底线的办法就是:把这个底线建立在自己对系统的期望上。自己期望这个系统有个什么样的性能,这是一个底线,如果没有达到这个要求就是性能差。
工具简单介绍
top查看进程活动状态以及一些系统状况
vmstat查看系统状态、硬件和系统信息等
iostat查看CPU负载,硬盘状况
sar综合工具,查看系统状况
mpstat查看多处理器状况
netstat查看网络状况
iptraf实时网络状况监测
tcpdump抓取网络数据包,详细分析
mpstat查看多处理器状况
tcptrace数据包分析工具
netperf网络带宽工具
dstat综合工具,综合了vmstat,iostat,ifstat,netstat等多个信息
二.CPU
CPU的占用主要取决于什么样的资源正在CPU上面运行,比如拷贝一个文件通常占用较少CPU,因为大部分工作是由DMA(DirectMemoryAccess)完成,只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成;科学计算通常占用较多的CPU,大部分计算工作都需要在CPU上完成,内存、硬盘等子系统只做暂时的数据存储工作。要想监测和理解CPU的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等。这里用个例子来简单介绍一下这些概念和他们的关系,CPU每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。
CPU也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是CPU的管理程序,用来管理和分配CPU资源,合理安排进程抢占CPU,并决定哪个进程该使用CPU、哪个进程该等待。操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。每个CPU都维护着一个可运行队列,用来存放那些可运行的线程。线程要么在睡眠状态(blocked正在等待IO)要么在可运行状态,如果CPU当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。
可以从以下几个方面监控CPU的信息:
(1)中断;
(2)上下文切换;
(3)可运行队列;
(4)CPU利用率。
2.1底线
通常我们期望我们的系统能到达以下目标:
(1)CPU利用率,如果CPU有100%利用率,那么应该到达这样一个平衡:65%-70%UserTime,30%-35%SystemTime,0%-5%IdleTime;
(2)上下文切换,上下文切换应该和CPU利用率联系起来看,如果能保持上面的CPU利用率平衡,大量的上下文切换是可以接受的;
(3)可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。
2.2vmstat
vmstat是个查看系统整体性能的小工具,小巧、即使在很heavy的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据。
$vmstat1
procs-----------memory-------------swap-------io------system-------cpu------
rbswpdfreebuffcachesisobiboincsussyidwast
2114027879803363043531996000128116650333370250
01140278829633630435319960000119456053369250
01140278843633630435319960000124980365467250
01140278268833630435319960000133377926664250
311402779292336304353199200028132370874567250
参数介绍:
(1).r,可运行队列的线程数,这些线程都是可运行状态,只不过CPU暂时不可用;
(2).b,被blocked的进程数,正在等待IO请求;
(3).in,被处理过的中断数
(4).cs,系统上正在做上下文切换的数目
(5).us,用户占用CPU的百分比
(6).sys,内核和中断占用CPU的百分比
(7).wa,所有可运行的线程被blocked以后都在等待IO,这时候CPU空闲的百分比
(8).id,CPU完全空闲的百分比
举两个现实中的例子来实际分析一下:
$vmstat1
procs-----------memory-------------swap-------io------system-------cpu------
rbswpdfreebuffcachesisobiboincsussyidwast
4014029154763412883951700000010575231981000
4014029157243412963951700000010485461981000
4014029158483412963951700000010445141882000
40140291584834129639517000002410445642080000
4014029158483412963951700000010605461882000
从上面的数据可以看出几点:
(1).interrupts(in)非常高,contextswitch(cs)比较低,说明这个CPU一直在不停的请求资源;
(2).usertime(us)一直保持在80%以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着CPU;
(3).runqueue(r)刚好在4个。
$vmstat1
procs-----------memory-------------swap-------io------system-------cpu------
rbswpdfreebuffcachesisobiboincsussyidwast
14014029043163419123952308000460110695933664100
170140290349234191239517800000103796143565100
200140290201634191239520000000104697393564100
1701402903904341912395188800076104498793763000
160140290458034191239521080000105598083465100
从上面的数据可以看出几点:
(1).contextswitch(cs)比interrupts(in)要高得多,说明内核不得不来回切换进程;
(2).进一步观察发现systemtime(sy)很高而usertime(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(systemcall);
(3).runqueue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。
我上午CPU100%时的信息:
top-11:49:08up50days,22:25,6users,loadaverage:59.79,59.98,60.50
Tasks:200total,61running,139sleeping,0stopped,0zombie
Cpu0:26.5%us,73.5%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st
Cpu1:25.0%us,75.0%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st
Mem:1939780ktotal,1744412kused,195368kfree,95704kbuffers
Swap:4401800ktotal,662836kused,3738964kfree,811124kcached
[root@localhost~]#vmstat210
procs-----------memory-------------swap-------io------system-------cpu------
rbswpdfreebuffcachesisobiboincsussyidwast
58166283619598895428810740004106412347210
591662836195988954488107320001282352212872000
5916628361959889544881076800002162092872000
2.3mpstat
mpstat和vmstat类似,不同的是mpstat可以输出多个处理器的数据。
注意:需要安装sysstat包后才有这个命令,可以使用yum安装:
#yuminstallsysstat
sysstat包含iostat、mpstat、sar、命令。
[root@localhostgmail]#exportLANG=en_US
[root@localhostgmail]#mpstat-PALL
Linux2.6.18-8.el5xen(localhost.localdomain)02/21/2011
10:20:16PMCPU%user%nice%sys%iowait%irq%soft%steal%idleintr/s
10:20:16PMall11.490.002.581.040.010.130.0184.74314.61
10:20:16PM015.730.002.560.550.020.230.0180.89241.09
10:20:16PM17.250.002.601.530.000.020.0188.5973.52
[root@localhostgmail]#mpstat-PALL1
Linux2.6.18-8.el5xen(localhost.localdomain)02/21/2011
10:20:18PMCPU%user%nice%sys%iowait%irq%soft%steal%idleintr/s
10:20:19PMall0.000.000.000.000.000.000.00100.00136.63
10:20:19PM00.000.000.000.000.000.000.00100.0086.14
10:20:19PM10.000.000.000.000.000.000.00100.0050.50
10:20:19PMCPU%user%nice%sys%iowait%irq%soft%steal%idleintr/s
10:20:20PMall0.000.000.000.470.000.000.0099.53105.00
10:20:20PM00.000.000.000.000.000.000.00100.0079.00
10:20:20PM10.000.000.000.900.000.000.0099.1026.00
2.4ps
查看某个程序、进程占用了多少CPU资源:
[root@localhostgmail]#while:;dops-eopid,ni,pri,pcpu,psr,comm|grep'oracle';sleep1;done
PIDNIPRI%CPUPSRCOMMAND
36680240.00oracle
36700210.00oracle
36720240.00oracle
36740230.00oracle
36760240.01oracle
36780230.00oracle
36800210.01oracle
36820240.01oracle
36840240.00oracle
36860210.00oracle
三.Memory
这里的讲到的内存包括物理内存和虚拟内存,虚拟内存(VirtualMemory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存变多了,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且RAM和SWAP之间的交换增加了系统的负担。
在操作系统里,虚拟内存被分成页,在x86系统上每个页大小是4KB。Linux内核读写虚拟内存是以页为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。内存和SWAP的这种交换过程称为页面交换(Paging),值得注意的是paging和swapping是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和paging只交换程序的部分(页面)是两个不同的概念。纯粹的swapping在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是paging或者paging/swapping混合,swapping最初是在UnixsystemV上实现的。
在这里只介绍和性能监测有关的两个内核进程:kswapd和pdflush。
(1)kswapddaemon用来检查pages_high和pages_low,如果可用内存少于pages_low,kswapd就开始扫描并试图释放32个页面,并且重复扫描释放的过程直到可用内存大于pages_high为止。
扫描的时候检查3件事:
1)如果页面没有修改,把页放到可用内存列表里;
2)如果页面被文件系统修改,把页面内容写到磁盘上;
3)如果页面被修改了,但不是被文件系统修改的,把页面写到交换空间。
(2)pdflushdaemon用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬盘,由pdflush决定什么时候把相应页面写入硬盘,这由一个内核参数vm.dirty_background_ratio来控制,比如下面的参数显示脏页面(dirtypages)达到所有内存页面10%的时候开始写入硬盘。
#/sbin/sysctl-nvm.dirty_background_ratio
10
3.1vmstat
#vmstat1
procs-----------memory-------------swap-------io------system-------cpu------
rbswpdfreebuffcachesisobiboincsussyidwast
032526962432268714836042368360823722882880021781
022534842216228710453682976537230369305190001000
01259252261612861481978418712197841871238211853013951
1226000821881446824118242584126642584134711741400860
212621402964128585224912173042495217304473723418610004
部分参数说明:
(1).swpd,已使用的SWAP空间大小,KB为单位;
(2).free,可用的物理内存大小,KB为单位;
(3).buff,物理内存用来缓存读写操作的buffer大小,KB为单位;
(4).cache,物理内存用来缓存进程地址空间的cache大小,KB为单位;
(5).si,数据从SWAP读取到RAM(swapin)的大小,KB为单位;
(6).so,数据从RAM写到SWAP(swapout)的大小,KB为单位;
(7).bi,磁盘块从文件系统或SWAP读取到RAM(blocksin)的大小,block为单位;
(8).bo,磁盘块从RAM写到文件系统或SWAP(blocksout)的大小,block为单位;
上面是一个频繁读写交换区的例子,可以观察到以下几点:
(1).物理可用内存free基本没什么显著变化,swapd逐步增加,说明最小可用的内存始终保持在256MB(物理内存大小)*10%=2.56MB左右,当脏页达到10%的时候(vm.dirty_background_ratio=10)就开始大量使用swap;
(2).buff稳步减少说明系统知道内存不够了,kwapd正在从buff那里借用部分内存;
(3).kswapd持续把脏页面写到swap交换区(so),并且从swapd逐渐增加看出确实如此。根据上面讲的kswapd扫描时检查的三件事,如果页面被修改了,但不是被文件系统修改的,把页面写到swap,所以这里swapd持续增加。
四.IO
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离CPU距离最远而且CPU访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测IO性能,有必要了解一下基本原理和Linux是如何处理硬盘和内存之间的IO的。
4.1内存页
在第三节Memory中提到了内存和硬盘之间的IO是以页为单位来进行的,在Linux系统上1页的大小为4K。可以用以下命令查看系统默认的页面大小:
$/usr/bin/time-vdate
...
Pagesize(bytes):4096
...
4.2缺页中断
Linux利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux内核首先检查CPU的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(PageFault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(MajorPageFault)和次缺页中断(MinorPageFault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。
上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。
下面的time命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:
$/usr/bin/time-vdate
...
Major(requiringI/O)pagefaults:1
Minor(reclaimingaframe)pagefaults:260
...
4.3FileBufferCache
从上面的内存缓存区(也叫文件缓存区FileBufferCache)读取页比从硬盘读取页要快得多,所以Linux内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候Linux才开始释放一些不用的页。我们运行Linux一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了Linux对内存管理很低效的假象,事实上Linux把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。下面是一台Sun服务器上的物理内存和文件缓存区的情况:
$cat/proc/meminfo
MemTotal:8182776kB
MemFree:3053808kB
Buffers:342704kB
Cached:3972748kB
这台服务器总共有8GB物理内存(MemTotal),3GB左右可用内存(MemFree),343MB左右用来做磁盘缓存(Buffers),4GB左右用来做文件缓存区(Cached),可见Linux真的用了很多物理内存做Cache,而且这个缓存区还可以不断增长。
4.4页面类型
Linux中内存页面有三种类型:
(1).Readpages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
(2).Dirtypages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由pdflush负责同步到硬盘,内存不足的时候由kswapd和pdflush把数据写回硬盘并释放内存。
(3).Anonymouspages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由kswapd负责将它们写到交换分区并释放内存。
4.5IO’sPerSecond(IOPS)
每次磁盘IO请求都需要一定的时间,和访问内存比起来这个等待时间简直难以忍受。在一台2001年的典型1GHzPC上,磁盘随机访问一个word需要8,000,000nanosec=8millisec,顺序访问一个word需要200nanosec;而从内存访问一个word只需要10nanosec.(数据来自:TeachYourselfProgramminginTenYears)这个硬盘可以提供125次IOPS(1000ms/8ms)。
4.6顺序IO和随机IO
IO可分为顺序IO和随机IO两种,性能监测前需要弄清楚系统偏向顺序IO的应用还是随机IO应用。
(1)顺序IO是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序IO可以同时很快的移动大量数据。可以这样来评估IOPS的性能,用每秒读写IO字节数除以每秒读写IOPS数,rkB/s除以r/s,wkB/s除以w/s.下面显示的是连续2秒的IO情况,可见每次IO写的数据是增加的(45060.00/99.00=455.15KBperIO,54272.00/112.00=484.57KBperIO)。
相对随机IO而言,顺序IO更应该重视每次IO的吞吐能力(KBperIO):
$iostat-kx1
avg-cpu:%user%nice%system%iowait%steal%idle
0.000.002.5025.250.0072.25
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util
sdb24.0019995.0029.0099.004228.0045060.00770.1245.01539.657.8099.80
avg-cpu:%user%nice%system%iowait%steal%idle
0.000.001.0030.670.0068.33
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util
sdb3.0012235.003.00112.00768.0054272.00957.22144.85576.448.70100.10
(2)随机IO是指随机请求数据,其IO速度不依赖于数据的大小和排列,依赖于磁盘的每秒能IO的次数,比如Web服务、Mail服务等每次请求的数据都很小,随机IO每秒同时会有更多的请求数产生,所以磁盘的每秒能IO多少次是关键。
$iostat-kx1
avg-cpu:%user%nice%system%iowait%steal%idle
1.750.000.750.250.0097.26
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util
sdb0.0052.000.0057.000.00436.0015.300.030.540.231.30
avg-cpu:%user%nice%system%iowait%steal%idle
1.750.000.750.250.0097.24
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util
sdb0.0056.440.0066.340.00491.0914.810.040.540.191.29
按照上面的公式得出:436.00/57.00=7.65KBperIO,491.09/66.34=7.40KBperIO.与顺序IO比较发现,随机IO的KBperIO小到可以忽略不计,可见对于随机IO而言重要的是每秒能IOPS的次数,而不是每次IO的吞吐能力(KBperIO)。
4.7SWAP
当系统没有足够物理内存来应付所有请求的时候就会用到swap设备,swap设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用swap的代价非常大。如果系统没有物理内存可用,就会频繁swapping,如果swap设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的IO问题,最终导致整个系统迟缓,甚至崩溃。swap设备和内存之间的swapping状况是判断Linux系统性能的重要参考,我们已经有很多工具可以用来监测swap和swapping情况,比如:top、cat/proc/meminfo、vmstat等:
$cat/proc/meminfo
MemTotal:8182776kB
MemFree:2125476kB
Buffers:347952kB
Cached:4892024kB
SwapCached:112kB
...
SwapTotal:4096564kB
SwapFree:4096424kB
...
$vmstat1
procs-----------memory-------------swap-------io------system-------cpu------
rbswpdfreebuffcachesisobiboincsussyidwast
1226000821881446824118242584126642584134711741400860
21262140296412858522491217304249521730447372341861000
五.network
网络的监测是所有Linux子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与Linux主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为Linux网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。我们可以通过ethtool工具来查看网卡的配置和工作模式:
#/sbin/ethtooleth0
Settingsforeth0:
Supportedports:[TP]
Supportedlinkmodes:10baseT/Half10baseT/Full
100baseT/Half100baseT/Full
1000baseT/Half1000baseT/Full
Supportsauto-negotiation:Yes
Advertisedlinkmodes:10baseT/Half10baseT/Full
100baseT/Half100baseT/Full
1000baseT/Half1000baseT/Full
Advertisedauto-negotiation:Yes
Speed:100Mb/s
Duplex:Full
Port:TwistedPair
PHYAD:1
Transceiver:internal
Auto-negotiation:on
SupportsWake-on:g
Wake-on:g
Currentmessagelevel:0x000000ff(255)
Linkdetected:yes
上面给出的例子说明网卡有10baseT,100baseT和1000baseT三种选择,目前正自适应为100baseT(Speed:100Mb/s)。可以通过ethtool工具强制网卡工作在1000baseT下:
#/sbin/ethtool-seth0speed1000duplexfullautonegoff
5.1iptraf
两台主机之间有网线(或无线)、路由器、交换机等设备,测试两台主机之间的网络性能的一个办法就是在这两个系统之间互发数据并统计结果,看看吞吐量、延迟、速率如何。iptraf就是一个很好的查看本机网络吞吐量的好工具,支持文字图形界面,很直观。下面图片显示在100mbps速率的网络下这个Linux系统的发送传输率有点慢,Outgoingrates只有66mbps.
#iptraf-deth0
5.2netperf
netperf运行在client/server模式下,比iptraf能更多样化的测试终端的吞吐量。先在服务器端启动netserver:
#netserver
Startingnetserveratport12865
Startingnetserverathostname0.0.0.0port12865andfamilyAF_UNSPEC
然后在客户端测试服务器,执行一次持续10秒的TCP测试:
#netperf-H172.16.38.36-l10
TCPSTREAMTESTfrom0.0.0.0(0.0.0.0)port0AF_INETto172.16.38.36(172.16.38.36)port0AF_INET
RecvSendSend
SocketSocketMessageElapsed
SizeSizeSizeTimeThroughput
bytesbytesbytessecs.10^6bits/sec
87380163841638410.3293.68
从以上输出可以看出,网络吞吐量在94mbps左右,对于100mbps的网络来说这个性能算的上很不错。上面的测试是在服务器和客户端位于同一个局域网,并且局域网是有线网的情况,你也可以试试不同结构、不同速率的网络,比如:网络之间中间多几个路由器、客户端在wi-fi、VPN等情况。
netperf还可以通过建立一个TCP连接并顺序地发送数据包来测试每秒有多少TCP请求和响应。下面的输出显示在TCPrequests使用2K大小,responses使用32K的情况下处理速率为每秒243:
#netperf-tTCP_RR-H172.16.38.36-l10---r2048,32768
TCPREQUEST/RESPONSETESTfrom0.0.0.0(0.0.0.0)port0AF_INETto172.16.38.36(172.16.38.36)port0AF_INET
Local/Remote
SocketSizeRequestResp.ElapsedTrans.
SendRecvSizeSizeTimeRate
bytesBytesbytesbytessecs.persec
163848738020483276810.00243.03
1638487380
5.3iperf
iperf和netperf运行方式类似,也是server/client模式,先在服务器端启动iperf:
#iperf-s-D
------------------------------------------------------------
ServerlisteningonTCPport5001
TCPwindowsize:85.3KByte(default)
------------------------------------------------------------
RunningIperfServerasadaemon
TheIperfdaemonprocessID:5695
然后在客户端对服务器进行测试,客户端先连接到服务器端(172.16.38.36),并在30秒内每隔5秒对服务器和客户端之间的网络进行一次带宽测试和采样:
#iperf-c172.16.38.36-t30-i5
------------------------------------------------------------
Clientconnectingto172.16.38.36,TCPport5001
TCPwindowsize:16.0KByte(default)
------------------------------------------------------------
[3]local172.16.39.100port49515connectedwith172.16.38.36port5001
[ID]IntervalTransferBand width
[3]0.0-5.0sec58.8MBytes98.6Mbits/sec
[ID]IntervalTransferBand width
[3]5.0-10.0sec55.0MBytes92.3Mbits/sec
[ID]IntervalTransferBand width
[3]10.0-15.0sec55.1MBytes92.4Mbits/sec
[ID]IntervalTransferBand width
[3]15.0-20.0sec55.9MBytes93.8Mbits/sec
[ID]IntervalTransferBand width
[3]20.0-25.0sec55.4MBytes92.9Mbits/sec
[ID]IntervalTransferBand width
[3]25.0-30.0sec55.3MBytes92.8Mbits/sec
[ID]IntervalTransferBand width
[3]0.0-30.0sec335MBytes93.7Mbits/sec
5.4tcpdump和tcptrace
tcmdump和tcptrace提供了一种更细致的分析方法,先用tcpdump按要求捕获数据包把结果输出到某一文件,然后再用tcptrace分析其文件格式。这个工具组合可以提供一些难以用其他工具发现的信息:
#/usr/sbin/tcpdump-wnetwork.dmp
tcpdump:listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes
511942packetscaptured
511942packetsreceivedbyfilter
0packetsdroppedbykernel
#tcptracenetwork.dmp
1argremaining,startingwith'network.dmp'
Ostermann'stcptrace--version6.6.7--ThuNov4,2004
511677packetsseen,511487TCPpacketstraced
elapsedwallclocktime:0:00:00.510291,1002714pkts/secanalyzed
tracefileelapsedtime:0:02:35.836372
TCPconnectioninfo:
1:zaber:54581-boulder:111(a2b)6>5<(complete)
2:zaber:833-boulder:32774(c2d)6>5<(complete)
3:zaber:pcanywherestat-172.16.39.5:53086(e2f)2>3<
4:zaber:716-boulder:2049(g2h)347>257<
5:172.16.39.100:58029-zaber:12865(i2j)7>5<(complete)
6:172.16.39.100:47592-zaber:36814(k2l)255380>255378<(reset)
7:breakpoint:45510-zaber:7012(m2n)9>5<(complete)
8:zaber:35813-boulder:111(o2p)6>5<(complete)
9:zaber:837-boulder:32774(q2r)6>5<(complete)
10:breakpoint:45511-zaber:7012(s2t)9>5<(complete)
11:zaber:59362-boulder:111(u2v)6>5<(complete)
12:zaber:841-boulder:32774(w2x)6>5<(complete)
13:breakpoint:45512-zaber:7012(y2z)9>5<(complete)
tcptrace功能很强大,还可以通过过滤和布尔表达式来找出有问题的连接,比如,找出转播大于100segments的连接:
#tcptrace-f'rexmit_segs>100'network.dmp
如果发现连接#10有问题,可以查看关于这个连接的其他信息:
#tcptrace-o10network.dmp
下面的命令使用tcptrace的slice模式,程序自动在当前目录创建了一个slice.dat文件,这个文件包含了每隔15秒的转播信息:
#tcptrace-xslicenetwork.dmp
#catslice.dat
datesegsbytesrexsegsrexbytesnewactive
---------------------------------------------------------------
16:58:50.2447088505545134180066
16:59:05.24470811092158828960002
16:59:20.24470812610766978270013
16:59:35.24470815171980435970002
16:59:50.2447083729619805570003
17:00:05.2447086788280023
17:00:20.244708149220530012
17:00:35.2447083040800001
17:00:50.2447083956880001
17:01:05.2447086788280023
17:01:11.0810803741210013