Linux-Web应用服务性能测试初探
一、服务端与客户端的准备工作
对于服务器最想要的数据就是,每秒支持的并发数,以及相应的内存CPU使用情况。
服务端需要设置最大打开描述符的限制(以支持创建大量的socket),配置socket参数。客户端要产生大量的并发请求时,也有相应的参数需要设置。
可参考我的另一篇随笔:http://www.cnblogs.com/chang290/archive/2013/05/09/3069474.html
二、服务端主机主要参数监控
1、内存,可以使用top、vmstat监控,free
vmstat可参考:http://www.cnblogs.com/peida/archive/2012/12/25/2833108.html
top可参考:http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html
free可参考:http://www.cnblogs.com/peida/archive/2012/12/25/2831814.html
2、磁盘IO的监控 iostat ,可参考:http://www.cnblogs.com/peida/archive/2012/12/28/2837345.html
3、网络IO的监控(若传输的数据较大,尽量采用千兆网连接以防止网络产生瓶颈),iftop 监控, 可参考:http://www.vpser.net/manage/iftop.html
4、系统负载 uptime
三、某些样例
1、当通过上述命令监控,发现内存充足,CPU空闲,并且IO也不满,那么很有可能就是网络IO瓶颈了,并发客户端的数据传不到服务器。
2、对于磁盘IO频繁的程序,当IO负载达到满时,无论增加在大的并发量也无济于事,可能的解决方法为增加磁盘分散来读写。另外要防止多线程大量并发读写磁盘这样会导致比单线程更慢。通常一个线程读,一个线程写,就足够了。增加线程一般不增加性能。
四、使用sar监控
如果系统没有安装sar,那么可以通过 yum install sysstat 安装,ubuntu安装 sudo apt-get install sysstat
sar命令格式为,sar [opt ] [interval] [count] [-o filename] [-f filename]
opt表示sar支持的各种类型监控信息;
interval表示多长时间显示一次;
count表示总共显示次数,若没有该字段则一直监控不停止;
-o filename表示将数据写入到文件中; sar -P -ALL 1 -o ./all_cpu.txt
-f filename表示从指定文件中读取数据;sar -f ./all_cpu.txt; sar -P ALL ./all_cpu.txt
1、监控CPU使用情况: sar -P ALL 1 (单独列出每个核心统计数据),
-P表示processor,后面可添加CPU列表也可以使用ALL表示所有,sar -P 0 1 #每秒显示第一个CPU的信息
11时06分28秒 CPU %user %nice %system %iowait %steal %idle 11时06分29秒 all 3.47 0.00 2.23 0.00 0.00 94.29 11时06分29秒 0 2.00 0.00 5.00 0.00 0.00 93.00 11时06分29秒 1 3.88 0.00 1.94 0.00 0.00 94.17 11时06分29秒 2 8.65 0.00 1.92 0.00 0.00 89.42 11时06分29秒 3 0.00 0.00 1.01 0.00 0.00 98.99
CPU all 表示统计信息为所有 CPU 的平均值。 %user 显示在用户级别(application)运行使用 CPU 总时间的百分比。 %nice 改变优先级的进程所占用 CPU 总时间的百分比。 %system 在核心级别(kernel)运行所使用 CPU 总时间的百分比。 %iowait 显示用于等待I/O操作占用 CPU 总时间的百分比。 %steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。 %idle 显示 CPU 空闲时间占用 CPU 总时间的百分比。
对nice值的补充说明,参考自:http://blog.csdn.net/longdel/article/details/7317511。
进程的优先级由 pr+nice 决定,nice取值在-20~19之间。一个进程的nice值越高,那么其所占用的CPU就越少(由于privelge值越高,优先级越小),所以叫做nice。系统为了动态调整进程的CPU时间,因此会修改进程的nice取值。进程的nice cpu时间就表示为:假如调整前时间片为100,调整后为150,那么就是150-100/total。那么把所有进程的nice cu加起来就是这里的 %nice了。进程的nice取值可以通过nice,renice函数来修改。
sar -u 1(显示所有CPU的统计信息)
-u 表示CPU
11时23分41秒 CPU %usr %nice %sys %iowait %steal %irq %soft %guest %idle 11时23分42秒 all 16.08 0.00 3.02 0.00 0.00 0.00 0.00 0.00 80.90 11时23分43秒 all 2.30 0.00 1.02 0.00 0.00 0.00 0.00 0.00 96.68
%irq 表示硬件中断服务时间
%soft 表示软件中断服务时间
2、磁盘IO统计信息:sar -d -p 1
-d 表示device显示每个块设备信息,-p表示以易读取方式显示DEV名称。
14时10分06秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时10分07秒 dev8-0 4.00 0.00 40.00 10.00 0.04 10.25 6.75 2.70
tps 每秒传输次数(多次逻辑请求可能被合并成一个IO请求,一次传输特定的大小); rd_sec/s 每秒读取的散区个数(散区为512字节) wr_sec/s 每秒写入的散区个数(散区为512字节)
avgrq-sz average-request-size读写操作平均大小(以散区计算),可通过wr_sec+rd_sec/tps,计算出该值为10
avgqu-sz average-queue-size设备请求队列的平均长度
await 平均完成请求的等待时间,毫秒,包括在队列中等待时间与设备服务时间
svctm service-time设备的平均服务时间,毫秒(sar指出该值不可靠)
%util 设备处于服务状态的百分比,当该值接近100%则表示该设备使用饱和
说明:1)util值如果长时间很高表示IO已经满负荷运行。
2)队列等待时间:await-svctm 该值大表示IO请求有大量时间处于队列中等待,也就是请求过多,可以考虑合并IO请求。
3)avgrq-sz 值可以看出对IO操作的数据大小,很小很频繁的IO操作将导致占用大量的设备随机寻址时间。
例子(10个线程,拷贝同一个100MB 文件,到不同的目标文件,每次读写10字节): 14时45分37秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时45分38秒 sda 156.00 0.00 43504.00 278.87 52.84 338.72 4.59 71.60 14时45分38秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时45分39秒 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 14时45分39秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时45分40秒 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 14时45分40秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时45分41秒 sda 12.00 0.00 208.00 17.33 0.14 12.00 9.67 11.60 例子(10个线程,拷贝同一个100MB 文件,到不同的目标文件,每次读写10K字节): 14时46分27秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时46分28秒 sda 107.00 0.00 68312.00 638.43 74.46 660.79 9.35 100.00 14时46分28秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时46分29秒 sda 84.00 0.00 64112.00 763.24 64.08 686.57 11.90 100.00 14时46分29秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时46分30秒 sda 104.00 0.00 75368.00 724.69 64.06 681.23 9.62 100.00
从上述两种方式读取文件方式:1)await后者明显比较大,表示大量的请求被放到queue中等待执行。2)svctm却没有明显变化,表示虽然每次磁盘读写较小,但是服务时间没有明显的差别。3)util后者100,可见前一种方式对磁盘的使用效率高。
类似命令:iostat
3、网络性能 sar -n DEV 1
-n表示network,
DEV表示显示网卡的统计信息,
EDEV表示显示网卡的失败信息,
NFS表示NFS客户端活动的统计,NFSD表示服务端活动的统计
SOCK表示IPV4使用的套接字数量信息(查看系统当前打开的套接字数量)
14时53分43秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 14时53分44秒 lo 2.02 2.02 0.19 0.19 0.00 0.00 0.00 14时53分44秒 em1 139.39 127.27 155.85 10.38 0.00 0.00 0.00 14时53分44秒 em2 0.00 0.00 0.00 0.00 0.00 0.00 0.00
IFACE 接口名称 rxpck/s 每秒接收到的包个数 received txpck/s 每秒发送的报个数 transmitted rxkB/s 每秒接收的kB数 txkB/s 每秒发送的kB数 rxmcst/s 每秒接收到的广播包个数
说明:1)如何确定一个链路的带宽,由于链路带宽取决于两端网卡以及中间路由的带宽,因此在网络稳定的情况下使用scp拷贝大文件的方式查看每秒传输量,是比较可靠的方式。
2)可以使用dmesg | grep -i eth,来查看机器网卡的信息,如:Link is up at 100 Mbps, full duplex,则表示100Mb全双工,理论上上行下行都能达到100Mb,但是由于CPU,磁盘IO等原因实际上很难达到。
scp dest_3 root@10.0.0.1:/root/soft dest_3 100% 107MB 11.9MB/s 00:09
表示每秒传输11.9MB,两端的带宽大致为100Mb
2)平均包大小,传输中如果包很小,很显然会影响传输效率,使用 rxkB/rxpck ; txkB/txpck 可以得到读与写的平均包大小。
类似命令:ifstat http://gael.roualland.free.fr/ifstat/ 可以查看到内容与sar -n 差不多; iftop http://www.ex-parrot.com/pdw/iftop/ 可以查看到具体某个IP使用的流量。
4、套接字使用量 cat /proc/net/sockstat; sar -n SOCK
sockets: used 5363 TCP: inuse 36 orphan 0 tw 0 alloc 40 mem 20 UDP: inuse 26 mem 20 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0
sockets 表示套接字总使用量
tcp inuse 当前使用的tcp数量 orphan 无主(待关闭)数量 tw 处于timewait数量 alloc 已建立连接数 mem
UDP inuse 当前的UDP连接数 mem
参考自:http://www.cnblogs.com/jankie/archive/2013/01/30/2882441.html
附注:linux查看机器网卡参数:
ethtool eth0 查看速度等各种属性
lspci|grep -i ether 查看设备产商等
dmesg |grep -i eth 查看系统加载网卡时的信息
8、进程队列长度与平均负载 sar -q 1
-q 表示queue,表示系统的任务队列以及负载
关于负载其他查看方法:top、uptime、cat /proc/loadavg
16时52分49秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 16时52分50秒 0 619 0.51 0.94 0.84 0 16时52分51秒 2 619 0.51 0.94 0.84 0 16时52分52秒 1 619 0.47 0.92 0.84 0 16时52分53秒 1 619 0.47 0.92 0.84 0 16时52分54秒 3 619 0.47 0.92 0.84 0
runq-sz:运行队列的长度(等待运行的进程数) plist-sz:进程列表中进程(processes)和线程(threads)的数量 ldavg-1:最后1分钟的系统平均负载(System load average) ldavg-5:过去5分钟的系统平均负载 ldavg-15:过去15分钟的系统平均负载
说明:1)关于负载的数值,0~cpu和数之间,如果四核则合理值为4.0;2)cpu核数查看,top 然后输入1;grep 'model name' /proc/cpuinfo;
grep 'processor' /proc/cpuinfo +1;
9、按照进程对资源占用进行排序
1)根据内存占用排序 top后使用M
2)根据CPU占用排序 top后使用P
3)根据IO使用进行排序
iotop: Iotop is a Python program with a top like UI used to show of behalf of which process is the I/O going on. It requires Python ≥ 2.7 and a Linux kernel ≥ 2.6.20 with the TASK_DELAY_ACCT CONFIG_TASKSTATS, TASK_IO_ACCOUNTING and CONFIG_VM_EVENT_COUNTERS options on.
http://www.cnblogs.com/jankie/archive/2013/01/30/2882441.html
http://os.51cto.com/art/201005/200672_all.htm
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858923.html