赞
踩
在Centos7服务器中部署了基于Netty实现的UDP服务,用来采集日志。将数据发送到UDP服务端之后,没有复杂业务处理,直接写入本地的log文件中。经过监控分析,成功找出优化方案,将目标3000QPS每秒丢包率3%降至0.00002%,5000QPS也比较良好。
netstat -s -u命令,统计指标主要数据说明
主要关注packets received、acket receive errors、receive buffer errors三个指标
netstat -uap命令下的一些常见指标的含义:
基于业务,主要关注Recv-Q指标值来做分析
将netstat -s -u、netstat -uap命令返回监控信息保存到文本中,每秒保存一次
#!/bin/bash
step=1
for (( i = 0; i < 60; i = (i+step) )); do
echo "$(date) $(netstat -uap)" >> /opt/udpSocket.txt
sleep $step
done
exit 0
#!/bin/bash
step=1
for (( i = 0; i < 60; i = (i+step) )); do
echo "$(date) $(netstat -s -u)" >> /opt/1.output.txt
sleep $step
done
exit 0
* * * * * sh /opt/test.sh
* * * * * sh /opt/test1.sh
将两个监控数据文件中,时间和packet receive errors、时间和Recv-Q进行分析,计算丢包数在发送样本的占比
使用Excel对两份数据建立数据透视图
packet receive errors指标错误数和receive buffer errors错误数一致,且发送条数减去日志文件写入条数等于packet receive errors错误数,初步得出结论缓冲区错误是丢包率过高的主要原因。
分析Recv-Q指标,数值持续保持峰值,很少有为0的时候,说明应用来不及读取接收缓冲区中的数据,接收缓冲区一直是满着的状态,更加证明Linux内核中默认socket接收缓冲区最大值满足不了当前的并发情况,需要增加缓冲区大小。
打开终端,并使用 root 或具有管理员权限的用户登录。
编辑 /etc/sysctl.conf 文件,可以使用任何文本编辑器打开该文件。
在文件的末尾添加以下行来设置接收缓冲区大小:
net.core.rmem_default = <new_size>
net.core.rmem_max = <new_size>
其中,<new_size> 是你想要设置的新的接收缓冲区大小。
保存并关闭文件。
运行以下命令以使更改生效:
sudo sysctl -p
这将重新加载 /etc/sysctl.conf 文件中的配置,并使更改生效。
使用netstat -anp 命令查看内核中接收缓冲区的个数,每个TCP、UDP都会有对应的一个接收缓冲区,假如应用程序中有使用tomcat,则内存使用范围在tomcat200最大线程 * 1MB+其他运行线程 *1MB,以本地虚拟机为例,默认有21个接收缓冲区,再加上tomcat的默认最大200线程,内核中接收缓冲区内存占用在200多MB。对其他业务影响不大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。