证监会:加强对拟上市公司投资的离职系统员工监管
06-17
前言 Apache Bench(ab)主要用于为HTTP服务提供性能压力测试。下面总结一下ab在日常使用中用到的压力测试。
测量方法。 ab更接近实用主义,不像其他工具那样包含大量参数,使用场景很少。
当看到man或者--help帮助文档中显示的密密麻麻的参数时,难免有些人会望而却步。本文面向生产和日常使用,不会对每个参数进行钻探。
当您阅读本文时,您一定已经有了解决问题的需求,并尽量让您用最少的时间和成本,提高业务绩效。 ,对负载能力有一个大致完整的评估。
1、如何安装ab1.Linux建议直接从软件源安装。默认情况下会安装每个组件所需的依赖项。
编译安装需要手动安装依赖。每个发行版的依赖组件的命名可能不同。
你可能会遇到各种错误,就像递归一样,你必须陷入其中,所以我更喜欢实用和简约,除非自带的软件版本太旧,不满足需要,或者我看看每个版本的版本。更改日志后,请务必指定某个安装版本,然后才能选择编译安装。
安装不是本文的重点,所以我尽量简单提一下。发行版安装命令 Arch pacman -Sy apache CentOS yum install -y httpd-tools Debian/Ubuntuapt install -y apache2-utils2。
对于 Windows 客户端,请参见此链接,下载压缩文件并解压,将 bin 目录设置为环境变量或者用cmd输入进入bin目录,然后使用ab命令。 2、压力试验机参数优化。
当使用压力测试工具进行压力测试时,会受到工具性能或机器本身性能的限制。如果受机器本身硬件性能限制,建议使用多个客户端进行压测。
同时,单机本身也有一些网络相关的内核参数可以优化。 1.tcp_fin_timeoutMSL为:Maximum Segment Lifetime,定义了任何消息允许存活的最大时间。
如果超过,就会被丢弃。然后tcp_fin_timeout用来设置MSL,默认是60s。
代码语言:shell copy cat /proc/sys/net/ipv4/tcp_fin_timeout2.tcp_tw_reuselinux 分配给每个用户的文件句柄数量是有限的。连接断开后,端口及相关资源不会立即释放,而是进入time_wait状态。
等待2MSL后进入CLOSE状态。此时,连接被释放。
可以参考RFC的定义:显然,在压测场景下,我们需要让压测机在短时间内建立尽可能多的TCP连接,并且time_wait状态如果保持2MSL(即2分钟),一旦该2MSL对应的time_wait占用的句柄达到上限,则无法添加新的TCP连接。我们需要开启tcp_tw_reuse参数,让系统启用time_wait状态复用,允许该状态下的资源可以被新的TCP连接复用。
暂时打开即可: 代码语言:shell copy sysctl -w sysctl net.ipv4.tcp_tw_reuse = 1 或: 代码语言:txt copy echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 如果需要永久打开,则需要写入 /etc/sysctl.conf 并执行 sysctl -p 才能生效。 3.tcp_tw_recycle 顾名思义,该参数用于在time_wait状态下回收资源,一般与tcp_tw_reuse配合使用。
暂时开启: 代码语言:shell copy sysctl -w sysctl net.ipv4.tcp_tw_recycle = 1 或: 代码语言:shell copy echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle 如果需要永久开启,则需要写入/etc/sysctl.conf,执行sysctl -p即可生效。 4.ip_local_port_range 该参数表示可用于本地到外部连接的端口范围。
该参数默认值为8 9,表示单机同时最多可以建立1个连接:根据压测场景适当调整该参数。例如,要添加更多端口,可以是: 代码语言:shell copy echo '8 9' > /proc/sys/net/ipv4/ip_local_port_range5。
统计每个状态下的连接数。最后,要统计各个状态下的连接数,可以是: code 语言:shell copy netstat -an|awk '/tcp/{print $6}'|sort |uniq -cnetstat -an|awk '/tcp/{ s[$6]++}END{for(i in s)print i ,s[i]}' 3. 开始压力测试之旅。
使用--help查看参数支持列表:压力测试格式为:ab [选项] 主机名[:端口]/路径/注意:主机名后面不要放选项。不支持此用途。
1、压测短连接(-m/-c/-n)采用HTTP GET请求,每次最大并发数,压测次数为0,:代码语言:shell copy ab -m GET -c -n 0 -m 指定HTTP请求方式,如GET/POST/HEAD/PUT等,如果不指定该参数,则默认发送GET。 -c 最大同时请求数,即并发请求数。
-n 请求总数。输出信息: 代码语言:shell copy 服务器软件:nginxServer 主机名:xxxServer 端口:80文档路径:/文档长度:bytes #返回的分页大小 Concurrency Level: #并发连接数 Time take for test: 0.seconds #完成请求所花费的总时间: 0 #Total Completed requests Failed requests: 0 #Failed requests Total Transmission: bytes #传输的总字节数 HTML Transfer: bytes #传输的字节数 Requests per Second: 6.07 [#/sec] (mean) #每秒平均数of requests 每个请求的时间: 45.[ms] (mean #每个并发请求的时间: 0.[ms] (mean, across all并发请求) #每个请求的平均实际运行时间。
传输速率:0.59 [Kbytes/sec] 接收 #传输速率 连接时间 (ms) #压力测试期间的连接处理时间min Mean[+/-sd] 中值 maxConnect: 1 20 2.7 20 28 处理:7 24 5.0 23 43Waiting : 1 17 4.8 16 33Total: 22 43 4.1 43 57 一定时间内服务的请求百分比(ms) #一定时间内请求响应时间占50% 43 #一半请求完成后,统计平均响应时间,可推导出如下: 66% 44 75% 46 80% 47 90% 48 95% 50 98% 52 99% 55 % 57(最长请求)对应的抓包: 不难看出ab每次GET都会和目的地握手,同一个TCP连接不会被重用,在很短的时间内发送0次GET请求并建立0次,导致0个会话。如果需要较大剂量,如:代码语言:shell copy ab -m GET -c 0 -n 0,则每次最多发起0个请求。
由于并发量较大,可能会超出单个用户打开文件的最大数量。这个需要设置ulimit: 代码语言:shell copy ulimit -n 5ulimit是Linux系统的一个内部关键函数。
它有一组参数,用于设置 shell 进程及其生成的子进程的资源使用限制。 。
设置用户打开文件(用户可以打开的最大文件数)。查看当前用户打开的文件数量,可以使用如下命令: 代码语言:shell copy lsof -u `whoami` |wc -l2。
压测长度连接 (-k) 代码语言:shell copy ab -m GET -k - c -n 00 -m 指定HTTP请求方式,如GET/POST/HEAD/PUT等,如果不指定该参数,默认发送GET。 -c 最大同时请求数,即并发请求数。
-n 请求总数。 -k keepalive,使用长连接并尝试重用一个TCP连接。
可以明显看到,长连接模式压力测试中QPS得到了明显的提升,因为每个GET资源都尽量复用一个连接,而不像短连接每次都需要握手然后GET。同时从HTTP头字段的Connection:keep-alive可以看出,-k参数压力测试方式就是在HTTP头中添加该字段:为什么对端没有超时或者压力测试过程中响应时间显着增加?至少可以说明,此时客户端请求量级<=服务器业务层处理量级,所以只用一个客户端对服务器进行压力测试。
如果对端没有达到性能瓶颈,那么可以考虑增加压测并发度或者多客户端同时压测。下面以外部Web测试机作为演示: 从上图可以看到,服务器已经处于高负载模式,无法正常响应请求,返回状态码。
使用htop观察服务器的负载和内存使用情况。 CPU和内存都满了:统计服务器建立的连接数: 代码语言:shell copy lsof -i :80|awk '/ESTABLISHED/{S+=1}END{print S }'这个连接是指定的数量ab-c。
如果想统计指定IP已建立的连接,可以使用: 代码语言:shell copy lsof -i :80|awk '/ESTABLISHED/&&/ipaddress/{S+=1}END{print S} '3.指定超时 (-s) -s s 用于指定超时时间(以秒为单位)。从man帮助文档可以看出,2.4.4之后的版本才有该参数,默认超时时间为30s。
使用方法也很简单,只需与其他压力测量参数一起使用即可。长连接模式下,每个 GET 请求都被视为超时请求,最长 5 秒: 代码语言:shell copy ab -m GET -s 3 -k -c -n 0 -m POST -s 5 -c -n 0 '指定TLS协议版本:如何知道对方支持什么协议版本?代码语言:shell copy openssl s_client -connect hostname:-tls1/-tls1_2/-tls1_3 #注意这里的“/”不能直接写。
一次仅输入一个 tls 版本。如果有多个,可以使用循环遍历或者使用在线网站查看支持的TLS协议版本。
示例:指定 TLS1.1 版本: 代码语言:shell copy ab -f TLS1.1 -m GET -k -c -n 0 从抓包中可以清楚地看出,客户端向服务器声明自己使用了 TLS1 TLS握手包.1版本:在HTTPS场景下,不同版本的TLS和密码套件加解密强度不一致,性能损失不一致,也会直观地体现在QPS上。 5.插入cookies(-C) -C用于指定cookie信息。
格式类似于键值对: 当需要对某些需要登录的场景进行压力测试时,插入cookie来维持登录状态: 代码语言:shell copy ab - m GET -k -c -n -C 'cookie -name=value' -X proxy[:port] 代码语言:shell copy ab -m GET -X proxyip:port -k -c -n 自定义 HTTP 标头内容 指定 HOST: 代码语言:shell copy ab -m GET -H 'Host:test.com' -c -n -k -m GET -H 'Host:domain' -H 'User-Agent: RokasYang/1.0 -c - n -k 用于限制压力测试的总持续时间,类似于超时命令。单位是秒。
如果默认不指定,则没有时间限制。压力测试限5秒结束: 代码语言:shell copy ab -m GET -t 5 -c -n HEAD 改为,效果是一样的,都是发送HEAD请求。
代码语言:shell copy ab -i -k -c -n 将每个结果的测量值输出到文件。-e 以百分比进度条(1%-%)记录所有请求所花费的时间,后面一般是一个csv格式的文件,即Excel格式的文件。
记录每次请求的时间:代码语言:shell copy ab -k -c -n 0 -g output -k -c -n 0 -e output.csv HTTP状态码,可以增加客户端数量进行压力测试,我认为要确定一个服务最真实的QPS表现,需要找到从业务正常到业务异常/无响应的QPS临界点。如果使用不同的客户端对同一台服务器进行压力测试,QPS会参差不齐,这是正常现象。
当不同客户端的硬件性能不同时,发送和接收数据包的性能受到限制,QPS和网络延迟也是密不可分的。关系,哪怕是几毫秒的差异,都可能导致多级QPS差距。
尤其是在小数据包场景下,每个连接都需要与大量的数据包进行交互。在这种场景下,延迟差距造成的QPS差距不容小觑。
。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-21
06-21
06-18
06-17
06-17
06-17
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用