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

原文地址:https://www.cnblogs.com/chang290/p/3392882.html