zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C++11 std::function函数包装器
    C++ spdlog日志管理
    c++ error C2663:n个重载没有“this”指针的合法转换
    nlohmann json for modern C++
    更新CMake3.16+的方法
    VS 设置Tab为空格
    Visual Studio 2019 UTF-8编码调试显示中文
    Notepad++ 设置Tab为空格
    C++11 =default 和 =delete
    C++11 constexpr
  • 原文地址:https://www.cnblogs.com/chang290/p/3392882.html
Copyright © 2011-2022 走看看