背景
最近客户端实现了一个基于websocket的消息推送功能:长连接网络开关下发开后启动,然后保持链接,每隔15分钟发一次心跳包,服务器有数据时直接下发生效,因此需要对服务器进行压测。本次通过写python脚本的方法模拟并发进行压力测试,相关测试方法如下~
什么是websocket协议
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
测试场景
1.并发创建长连接,3min内建立连接22w,总连接数维持在22w左右,间歇下发通知,查看服务器的稳定性
2.并发创建长连接,间歇性断开并重连,保证同时在线的长连接在22w左右,运行12H,查看服务器的稳定性
测试步骤
1. 编写脚本实现并发请求并发
2.搭建测试环境
①找1台liunx机器,搭建python运行环境,安装脚本支持的包、模块
②运行websocket脚本,保证脚本正常运行
③ 编写run_test.sh脚本,运行多个websocket.py,单机大约可同时并发大约5w~6w的tcp链接,视linux 系统内核而定(因为本次需要同时并发22w,共4台liunx机器,所以单台并发6w左右)
3. 进行测试及查看服务器结果
①同时在4台linux机器中运行以上内容,保证可并行22w的用户量
②查看服务器的cpu、内存、响应时间等指标信息
问题总结
1. 有些linux系统最大tcp链接数比较小,无法支持同时并发6w量的tcp链接?
原因:
最大tcp连接数和系统允许打开的最大文件数,用户允许打开的最大文件数,TCP网络连接可用的端口范围有关,取上述的最小值;
一般的设置规则为:系统最大文件数>可用端口>用户最大文件数
修改可用端口数:
查看端口范围
sysctl -a |grep ipv4.ip_local_port_range
修改值:
vi/etc/sysctl.conf
修改可用端口数
net.ipv4.ip_local_port_range = 1024 65535
修改用户最大文件描述符和最大进程数
查看当前值:
ulimit -n # 最大文件数,一般默认为1024个
ulimit -u #最大进程数,一般为默认60000
#永久修改 vi /etc/security/limits.conf
#修改文件数 * soft nofile 10240 * hardnofile 10240
#修改进程数 * soft noproc 60000 * hardnoproc 60000
#临时修改 ulimit -n 10240
上面的永久修改方式重启还不会生效,需要执行者
# 在末尾添加
sessionrequired /usr/lib64/security/pam_limits.so
# 作用是告诉Linux在用户完成系统登录后,应该调用pam_limits.so 来执行limit.conf这个文件
一般来说,只需要修改用户的限制就可以了。
2.什么是gevent?
Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持
gevent是第三方库,通过greenlet实现协程,其基本思想是:当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。