locust使用经验---每个任务使用新的链接以及处理大量TIME_WAIT连接

最近由于项目需要,在研究打压测试工具,以及当测试连接过多后端服务器配置问题

测试工具选用locust,locust中文意思为蝗虫,可以想象,locust就像成片的蝗虫,扑向我们的服务。

它支持分布式的打压测试,每个实例可自定义执行任务,执行任务可用python脚本实现,具体如何写python脚本这里就不详细介绍了,网上能搜到很多相关资料,这次的文章主要着重介绍如何实现我们的需求以及对遇到的问题分析。遇到的问题主要是两个:如何在每次执行任务都使用新的连接,大量连接时如何处理大量出现的TIME_WAIT连接

首先,我的测试场景是,大量的客户端会间歇性的请求服务器,并不会长时间连接,基本可以理解为每次请求都是短连接,每条连接发起一次请求后就会断开。所以首先需要解决的问题是,如何使每次执行任务都是用新的连接。

locust默认使用的是requests库,创建的会话默认会使用长连接,会复用连接,一条发起多次请求,这并不符合我的要求,所以在每次请求完数据后,我需要自己关闭连接。

关闭连接的手段有很多:

a、断开整个会话的连接

self.client.close()

b、断开客户端连接

r = self.client.request("post", "/api/query", data=json.dumps(payload), verify=False)
    r.connection.close()

c、请求时带着Connection: close头部,让服务器断开连接(在HTTP1.1协议中,Connection头部有两个值,close和keep-alive,这个头就相当于客户端告诉服务端,服务端你执行完成请求之后,是关闭连接还是保持连接,保持连接就意味着在保持连接期间,只能由客户端主动断开连接)

r = self.client.request("post", "/api/query", headers={‘Connection‘:‘close‘}, data=json.dumps(payload), verify=False)

不论a、b还是c,都能实现每次请求后连接断开的目的,但是引发的副作用却不一样。

因为tcp连接有一种TIME_WAIT状态,连接的主动关闭方在发送四次挥手的最后一个ACK后会变为TIME_WAIT状态,保留此状态的时间为两个MSL(linux里一个MSL为30s,是不可配置的)

仔细的同学可能已经发现了这里的区别,a和b方法是客户端断开连接,c是服务器断开连接,这也就决定了TIME_WAIT会在哪一端出现(前面已经说过,连接的主动关闭方会变为TIME_WAIT状态)。

抓包验证发现:

a、b方法的FIN报文都是由客户端发起的

c方法的FIN报文由服务器发起

如果由服务器断开连接,会导致服务器端产生大量TIME_WAIT状态的连接,这个问题直接的影响就是服务器的端口很快会被耗尽,导致客户端无法与服务器成功建立新的连接

而如果由客户端断开连接,经测试,测试机端很快出现上万的TIME_WAIT状态的连接,测试量根本打不上去,大量连接建立失败

所以我们需要调整系统的配置,来优化tcp连接的处理

如果由客户端关闭连接,需要修改的配置如下:

vi /etc/sysctl.conf

net.ipv4.tcp_timestamps=1 开启后下面的tw参数才能生效
net.ipv4.tcp_tw_reuse=1  开启重用,允许将TIME_WAIT重用与新的连接
net.ipv4.tcp_fin_timeout = 30  增大最多允许TIME_WAIT的数量

net.ipv4.tcp_max_tw_buckets = 256000  缩短TIME_WAIT_2到TIME_WAIT的超时时间

sysctl -p 使能新的配置

如果必须由服务器断开连接,这个问题如何优化?(参考链接:https://www.jianshu.com/p/2da62c5e10fa)

1,尽量调大系统TIME_WAIT连接数

net.ipv4.tcp_max_tw_buckets = 256000  最多允许time-wait数量,最大阈值

2,调整TIME_WAIT_2到TIME_WAIT的超时时间,默认是60s,优化到30s:
          net.ipv4.tcp_fin_timeout = 30

3,下面再说一些linux里TIME_WAIT专有的优化参数reuse、recycle,默认都是关闭的,这两个参数必须在timestamps打开的前提下才能生效使用

注意:对于tw的reuse、recycle其实是违反TCP协议规定的,服务器资源允许、负载不大的条件下,尽量不要打开(副作用大

net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_tw_reuse = 1

机器作为客户端时起作用,开启后time_wait在一秒内回收

net.ipv4.tcp_tw_recycle = 0 (建议不要开启,现在互联网NAT结构很多,可能直接无法三次握手)

开启后在3.5*RTO(RTO时间是根据RTT时间计算而来)内回收TIME_WAIT,并60s内同一源ip主机的socket connect请求中的timestamp必须是递增的,对于服务端,同一个源ip可能会是NAT后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接,直接导致不能三次握手。

经过权衡,最终决定,服务器暂时不开启副作用较大的tw参数,由客户端断开连接,修改客户机的配置。

修改后测试,16个slave实例,模拟480个用户压测查询接口,客户端与服务器均不再出现大量TIME_WAIT连接,RPS轻松上3k

服务器硬件配置较低,2核2G内存,不需要打的特别狠,满足需求即可

原文地址:https://www.cnblogs.com/satuer/p/9630838.html

时间: 2024-08-01 20:10:48

locust使用经验---每个任务使用新的链接以及处理大量TIME_WAIT连接的相关文章

js打开新的链接下载文件

var p =params.join("&"); var a = document.createElement('a'); a.href = 'report/exportpubcount.do'+p; a.target = '_blank'; a.id='exppub'; document.body.appendChild(a); var alink = document.getElementById('exppub'); alink.click(); alink.parent

通过<base>标签实现全网页新窗口链接。

对比前一篇博文通过<meta>标签实现全网页新窗口链接. 使用<base>标签,不光可以实现全网页新窗口链接,更可以设定自定义的基底地址. 什么叫基底地址? 比如你某个网页的地址是a.com/1.html,但是你希望该网页下所有相对地址"/xxx/xxx"指向的是b.com/xxx/xxx,而不是a.com/xxx/xxx,就需要在<head>标签中使用这个<base>标签. 具体使用方法: <base href="链接地

NET Framework 4.5新特性 (一) 数据库的连接加密保护。

NET Framework 4.5 ado.net数据库连接支持使用SecureString内存流方式保密文本.  一旦使用这类操作,文本加密是私有不能共享的,并在不再需要时从计算机内存中删除.  SecureString此类不能被继承. 下面做了一些演示 private void Login_Click(object sender, EventArgs e) { //登录参数 string userName = Username.Text; SecureString password = se

Mantis去掉登录界面的“注册一个新账号”链接

Mantis1.1.2主界面提供了新账号注册功能,但是只能注册默认权限的帐号.不是很实用,那就干脆去掉吧. (1) 打开Mantis目录下的login_page.php和lost_pwd_page.php: (2) 查找print_signup_link()并将其注释掉: (3) 重新打开Mantis,注册新帐号的链接就没有了.

通过&lt;meta&gt;标签实现全网页新窗口链接。

虽然说弹出新窗口这个有点儿流氓,但是毕竟有要用的时候.如果每一个链接都target="_blank"岂不是很麻烦? 其实只需要在head标签中加入一行代码即可. 1 <meta http-equiv:"windows-target" content="_top"/>

正则替换实现字符串链接每4位用“-”连接成新的字符串

using System.Text.RegularExpressions; //比如:74B87337454200D4D33F80C4663DC5E5运用它后就变成:74B8-7337-4542-00D4-D33F-80C4-663D-C5E5 string upstr = Regex.Replace(str, @"(\w{4}(?=[^$]))", "$1-"); 原文出处:http://www.cnblogs.com/firstcsharp/p/5430778.

硬链接和软链接(符号连接)的区别

linux系统下提供ln指令来进行文件链接.文件链接主要分为硬链接和软链接. 硬链接:由于linux下的文件是通过索引节点(Inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配inode.每添加一个一个硬链接,文件的链接数就加1. 可以用:ln命令来建立硬链接.语法: [php] view plaincopy ln [options] existingfile newfile ln[options] existingfile-list directory

chrome新标签页 无法访问此网站 连接已重置

andytimes commented on 20 Apr 如果您用的是 Chrome dev,可以参考下面的方法: 我手机上的 Chrome dev 51.0.2704.10 (Android) 有同样的问题.问题出现在最近更新 chrome dev 后,用搜索框搜索出现链接重置. 问题无关 hosts,在于你发的那个链接是 http 方式访问. 你可以在搜索框输入 chrome://net-internals/#hsts在 Input a domain name to add it to t

新的服务器安装的mysql使用navcat连接不上

首先出现问题 然后在防火墙添加3306端口 /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 又出现了问题 ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server 1.在本机登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost&qu