随笔-压测-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-maxfs.nr_openulimit -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
posted @ 2024-05-17 09:57  LiYanbin  阅读(102)  评论(0编辑  收藏  举报