随笔-压测-TCP并发测试
目录
linux内核优化(百万级别长连接,并发测试指南)
百看不如一练,动手测试单机百万连接的保姆级教程!
Linux服务器百万并发实现与问题排查
只测试到5w, 如果再上去可能会遇到 nf_conntrack 资源数不足,详细参考 Iptables之nf_conntrack模块,后续有测试再补充
TCP 连接限制配置(压测客户端和服务器)
1、客户端限制配置(以65535为例):
- 确认当前配置:
系统fd限制:
sudo sysctl -a | grep -E 'net.ipv4.ip_local_port_range|fs.file-max|fs.nr_open'
用户fd限制:
limit -n
- 修改系统配置:
# vi /etc/sysctl.conf 然后使用sysctl -p 使配置生效
net.ipv4.ip_local_port_range = 5000 65535
fs.file-max=65535
fs.nr_open=65535
- 修改用户配置:
# 在运行测试工具前,执行ulimit -n 65535
ulimit -n 65535; run command
2、服务器配置
同上配置fs.file-max
、fs.nr_open
和ulimit -n
问题1:压测3w个请求(长连接),caps 1000,有一半的请求超时
排查:
ss -ntlapo | grep -i SYN-RECV
发现有大量连接处在这个状态,通过对比TCP状态和系统接口,也就是
服务器没有及时accept()
通过代码确认,服务器使用poll技术,poll模式每次接口返回都需要遍历所有的fd, 随着连接数增加,需要遍历的fd呈乘线性增长,需要遍历的时间也相应增加
优化 配置网卡中断分配到多个cpu
参考:
# 首先,找到与您的网卡对应的IRQ号
grep eth0 /proc/interrupts
# 查看该IRQ号对应的smp_affinity_list值
cat /proc/irq/IRQ_NUMBER/smp_affinity_list
# 将smp_affinity值设置为允许第0到第3个CPU核心处理该中断(smp_affinity值为16进制的一个数)
# f 对应二进制 00001111
echo "f" > /proc/irq/IRQ_NUMBER/smp_affinity
cat /proc/irq/IRQ_NUMBER/smp_affinity
wireshark 查看rtt
选择Statistics->TCP Stram Graph->Round Trip Time Graph
rtt Round-Trip Time 往返时间 即从发送方发送数据开始,到发送方接收到来自接收方的确认消息所经过的时间
更详细的内容,参考: TCP中RTT时延的理解
查看系统每秒收到的TCP请求数
先记录每秒系统的除了处于
LISTEN|CLOSE-WAIT
状态的tcp连接,然后计算两个值之间的差值
# 先记录
while true; do sleep 1s; echo "$(ss -ntlapo | ss -nt | grep -v CLOSE | wc -l)";done
# 计算两个值之间的差值和总的平均值
awk 'NR==1{prev=$1; next} {diff=$1-prev; sum+=diff; count++; print diff; prev=$1} END{avg=sum/count; print "平均值:", avg}' your_file.txt
区间图:
awk -F ';' 'NR>1{
bin = int($2);
count[bin]++;
}
END {
for (bin in count) {
print bin, "-", bin + 9.99, count[bin];
}
}' sf_reg_28041_rtt.csv | sort -n -k 1
附:服务器网络参数配置
# Add parameters to sysctl.conf
echo "net.core.netdev_max_backlog = 262144" >> /etc/sysctl.conf
echo "net.core.optmem_max = 1048576" >> /etc/sysctl.conf
echo "net.core.rmem_default = 33554432" >> /etc/sysctl.conf
echo "net.core.rmem_max = 67108864" >> /etc/sysctl.conf
echo "net.core.wmem_default = 33554432" >> /etc/sysctl.conf
echo "net.core.wmem_max = 67108864" >> /etc/sysctl.conf
# Apply changes
sysctl -p
# Adjust network interface parameters
ethtool -G eth1 rx 4096 tx 4096
# Disable rp_filter
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
本文来自博客园,作者:LiYanbin,转载请注明原文链接:https://www.cnblogs.com/stellar-liyanbin/p/18197269