性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。其中包括(压力测试、负载测试、并发测试、疲劳强度测试等)并评估系统的承受能力、稳定性等例如(响应时间、事务处理效率、并发量等)。
目的是验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈,优化软件,最后起到优化系统的目的。
包括以下方面:
1.检验系统满足性能标准,评估系统的处理能力。
2.查找系统瓶颈。
3.系统调优。
4.验证稳定性。
5.比较多个的系统性能。
性能目标主要包括客户端交易处理性能指标、服务器资源监控指标、数据库资源监控指标、Web服务器监控指标、中间件监控指标。性能目标根据系统的技术和用途不同,一般包含如下部分:
1.并发量和吞吐量。
1)交易处理指标:平均事务响应时间、每秒事务数、每条事务总数、事务摘要、事务性能摘要、事务响应时间(负载下百分比下的事务、分布)。
2)web请求指标:每秒点击次数、吞吐量、吞吐量摘要、HTTP状态代码摘要、每秒HTTP响应数、每秒下载页面数、每秒重试次数,重试次数摘要、连接数、每秒连接数、每秒SSL连接数。
2.服务器响应时间等。
3.数据库指标
1)监测数据读和写的情况。
2)监控数据库资源(cpu、内存、io等)使用的情况。
3)监测大数据读写深度测试。
4)监测数据库连接数。
5)监测数据库锁资源情况。
6)监测数据库业务数据表的空间增长。
7)监测数据库并发情况。
Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。测试输出报告保存为HTML或JMeter的兼容的XML。Multi-Mechanize最常用于web性能和可扩展性(scalability)测试,也适用于任何python可以访问的API。尤其适合后台性能测试。懂编程这个工具会远强过商业的性能测试工具。
主要特征包括:
1、支持各种HTTP methods
2、高级超链接和HTML表单支持
3、支持SSL
4、自动处理Cookies
5、可设置HTTP头
6、支持代理
7、支持HTTP认证
以Centos为例,在Centos中已经默认安装Python环境,此方法使用标准的Python安装方式进行。
1、安装matplotlib插件 (主要是支持作图)命令 yum �Cy installpython-matplotlib。
2、安装multi-mechanize 命令pip install multi-mechanize 或者使用easy_installmulti-mechanize。
1、multimech-newproject my_project创建一个新项目,包括有以下文件和目录
2、编写测试代码(存放在test_scripts目录下)
将编写的主要测试代码放入def run(self):函数里
3、配置config.cfg
4、运行multimech-run my_project,待运行结束后会自动生成 results目录,里面存放测试结果数据。
主要看:
results.csv(测试返回结果,如果错误等,这个文件里面可以看出是什么错误),
results.html(统计结果)
客户端--网络--服务器
测试过程监测:
1、客户端、服务器的连接数是否正常,命令( netstat -anp | wc �Cl)数量是否随着压力增大而在适量的增,随着压力减小不断的减少。
2、客户端、服务器网络是否正常,命令(dstat、iptraf)流量是否达到客户端或者服务器的最大网络速率,如果基本已经接近最大速率那里网络可能存在堵塞。
3、客户端、服务器cpu、内存和磁盘是否正常 命令(top、vmstat、dstat、iostat、 free、pidstat)等cpu是否长期处于非常繁忙>80%、wa是否过高、si软中断是否过高、队列(r)是否等待进程数不应该超过3个线程(每处理器),内存是否空闲太少等,I/O是否等待时间过长,磁盘下载速率持续是否占转速的50%。并查看是那些程序占用大量资源。
4、吞吐量:服务器处理的事务数。
5、并发数:系统同时每秒处理的事务数。
6、响应时间:(网络+服务器+数据库)。
7、是否有错误信息。
8、是否符合要求的响应时间内和并发数。
Contos 7中重要参数:
/proc/sys/kernel/shmmax: |
单个共享内存段的最大值。linux的32位系统一般为33554432 / 1024 / 1024 M,这对oracle等相当不够用;在64位为 68719476736 / 1024 /1024 = 65536 M。 |
/proc/sys/net/core/netdev_max_backlog |
在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。默认是32768。 |
/proc/sys/net/core/optmem_max |
表示每个套接字所允许的最大缓冲区的大小,默认20480. |
/proc/sys/net/core/rmem_default |
默认的TCP数据接收窗口大小,默认8388608 |
/proc/sys/net/core/rmem_max: |
最大socket读buffer,默认16777216 |
/proc/sys/net/core/somaxconn |
定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。默认是32768。 |
/proc/sys/net/core/wmem_default |
默认的TCP数据发送窗口大小(字节),默认8388608 |
/proc/sys/net/core/wmem_max |
最大的TCP数据发送窗口(字节)。,默认16777216 |
/proc/sys/net/ipv4/ip_local_port_range |
表示TCP/UDP协议允许使用的本地端口号,默认1024 65535,性能测试客户端通常需要增大此值 |
/proc/sys/net/ipv4/tcp_fack |
启用转发应答,可以进行有选择应答(SACK)从而减少拥塞情况的发生,这个选项也应该启用。默认开启 |
/proc/sys/net/ipv4/tcp_fin_timeout |
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。修改系�y默认的 TIMEOUT 时间,默认值是 60。建议为30。 |
/proc/sys/net/ipv4/tcp_keepalive_intvl |
探测消息未获得响应时,重发该消息的间隔时间(秒)。默认75,建议30 |
/proc/sys/net/ipv4/tcp_keepalive_probes |
在认定TCP连接失效之前,最多发送多少个keepalive探测消息。默认9,建议3 |
/proc/sys/net/ipv4/tcp_keepalive_time |
TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。默认7200 seconds (2 hours) 建议 1800。 |
/proc/sys/net/ipv4/tcp_low_latency |
允许TCP/IP栈适应在高吞吐量情况下低延时的情况,这个选项应该禁用,默认也是禁用。 |
/proc/sys/net/ipv4/tcp_max_syn_backlog |
对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字。默认65536 |
/proc/sys/net/ipv4/tcp_mem |
确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。默认94500000 915000000 927000000。 |
/proc/sys/net/ipv4/tcp_retries2 |
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源. |
/proc/sys/net/ipv4/tcp_rmem: |
为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。默认:4096 87380 6291456 |
/proc/sys/net/ipv4/tcp_sack |
启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。默认开启 |
/proc/sys/net/ipv4/tcp_syncookies |
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为1,表示开启; |
/proc/sys/net/ipv4/tcp_timestamps |
TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。默认关闭。 |
/proc/sys/net/ipv4/tcp_tw_reuse |
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为开启; |
/proc/sys/net/ipv4/tcp_tw_recycle = 1 |
表示开启TCP连接中TIME-WAIT sockets的快速回收,默认开启。 |
/proc/sys/net/ipv4/tcp_window_scaling |
启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大至1GB,TCP连接双方都启用时才生效。默认开启。 |
/proc/sys/net/ipv4/tcp_wmem |
为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。默认4096 16384 4194304 |
1、优化网络设备接收队列
(该文件表示在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。)
使用命令查看cat /etc/sysctl.conf ,net.core.netdev_max_backlog=3000(确保网络可以流畅通顺) Centos 7 建议使用32768
2、net.ipv4.conf.lo.accept_redirects
参数值为布尔值,1表示接收这类重定向 icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用“安全重定向”(见下文)以消除安全性隐患(禁止接收路由重定向报文,防止路由表被恶意更改。)
查看命令 /proc/sys/net/ipv4/conf/eth0/accept_redirects其中eth0是网络接口
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0 建议加上以上4句
3、打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
查看命令cat /etc/sysctl.conf
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1 建议修改以上两句
/proc/sys/net/ipv4/tcp_tw_recyle
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随意修改这个值。 缺省设置:0
/proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
缺省设置:0
4、减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30 调整这个时间或者注释
查看命令 cat /etc/sysctl.conf
5、减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800 (默认是7200)
6、增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=65536 (建议这个数)
7、(1)优化系统套接字缓冲区(最大socket读buffer 单位字节)
net.core.rmem_max=16777216(该文件指定了接收套接字缓冲区大小的最大值)
net.core.wmem_max=16777216(该文件指定了发送套接字缓冲区大小的最大值)
(2)该文件指定了接收套接字缓冲区大小的缺省值
net.core.rmem_default = 8388608
(3)该文件指定了发送套接字缓冲区大小的缺省值
net.core.wmem_ default=8388608
8、打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击。
net.ipv4.tcp_syncookies=1
9、优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=409687380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
方法:统计输出各个函数执行时间、主流程优化以及执行时间较长函数优化。