资讯专栏INFORMATION COLUMN

解决系统TIME_WAIT回收慢问题

IT那活儿 / 1189人阅读
解决系统TIME_WAIT回收慢问题

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!





问题概述



近期,客户一套核心数据库MySQL5.7版本在业务高峰时出现连接数激增,连接数触及max_connections阈值,造成新建连接被拒绝,经分析所有连接中80%为TIME_WAIT状态,存在TIME_WAIT连接回收慢问题。
操作系统版本:RedHat Enterprise7.4
uname -r :3.10.0-693.el7.x86_64





优化方案



参数:net.ipv4.tcp_tw_reuse = 1、net.ipv4.tcp_timestamps = 1,允许TIME_WAIT的Socket重新用于新的TCP连接。
参数:net.ipv4.tcp_fin_timeout = 10,默认为60s,下调为10s仅会改善FIN_WAIT_2状态连接的数量,对TIME_WAIT连接数量不起作用。
参数:TCP_TIMEWAIT_LEN,硬编码参数,默认为60s,Linux系统停留在 TIME_WAIT的时间为固定的60秒,调整此参数,需要改内核源码,重新编译内核。
以上参数中net.ipv4.tcp_tw_reuse、net.ipv4.tcp_timestamps、net.ipv4.tcp_fin_timeout无法满足解决TIME_WAIT回收慢问题,需要通过调低参数TCP_TIMEWAIT_LEN,重新进行内核编译提高TIME_WAIT的回收速度。





系统内核参数调整



1. 挂载镜像包并配置YUM源
mount -o loop -t iso9660 ~/rhel-server-7.4-x86_64-dvd.iso /mnt/dvd
echo "mount -o loop -t iso9660 ~/rhel-server-7.4-x86_64-dvd.iso /mnt/dvd" >> ~/.bash_profile
cat > /etc/yum.repos.d/rhel-media.repo <[rhel-media]
name=Red Hat Enterprise Linux 7.4
baseurl=file:///mnt/dvd
enable=1
gpgcheck=0
gpgkey=file://mnt/dvd/RPM-GPG-KEY-redhat-release
EOF

mount -o loop -t iso9660 ~/CentOS-7-x86_64-Everything-1708.iso /mnt/dvd2
cat > /etc/yum.repos.d/centos-media.repo <[Centos7-Everything]
name=centos 7.4
baseurl=file:///mnt/dvd2
enabled=1
gpgcheck=0
EOF

yum clean all; yum makecache fast


2. 环境预配置

2.1 加快shell建立连接的速度:
sed -i s/.*UseDNS.*/UseDNS no/g /etc/ssh/sshd_config
2.2 增加历史记录数,便于问题回溯:
sed -i s/HISTSIZE=.*/HISTSIZE=100000/g /etc/profile
2.3 关闭强制访问控制,重启后确认已正常关闭:
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
2.4 重启:
reboot
2.5 查看SELinux运行模式:
getenforce
2.6 关闭防火墙:
systemctl disable firewalld
3. 编译准备
3.1 创建用户、组:
groupadd mockbuild
useradd mockbuild -g mockbuild
3.2 安装内核源码包:
rpm -ivh kernel-3.10.0-693.el7.src.rpm
3.3 安装依赖包:
yum install -y yum-utils
yum-builddep kernel-3.10.0-693.el7.src.rpm
yum install -y pesign elfutils-devel zlib-devel binutils-devel audit-libs-devel java-devel numactl-devel pciutils-devel ncurses-devel rpm-build bison
3.4 生成源码:
cd ~/rpmbuild/SPECS/
rpmbuild -bp kernel.spec
4. 修改源码
切换到源码目录并修改TCP_TIMEWAIT_LEN参数值。
cd ~/rpmbuild/BUILD/kernel-3.10.0-693.el7/linux-3.10.0-693.el7.x86_64
perl -p -i -e s/define TCP_TIMEWAIT_LEN (60*HZ)/define
TCP_TIMEWAIT_LEN (10*HZ)/g
 ./include/net/tcp.h
5. 编译内核
5.1 拷贝当前内核配置到源码根目录:
cp /boot/config-3.10.0-693.el7.x86_64 .config
5.2 编译:
make -j16
5.3 编译安装模块:
make -j16 modules_install
5.4 安装:
make install
6. 设置BOOT引导菜单
6.1 查看所有菜单入口,第一条为新编译的内核:
awk -F $1=="menuentry " {print $2} /etc/grub2.cfg
6.2 设置从第一个菜单引导:
grub2-set-default 0 && init 6
6.3 验证内核版本号:
uname -r






验   证



1. 找到一个监听端口:
netstat -an | grep LISTEN
2. 尝试访问本机的25端口:
telnet localhost 25
3. 退出,直接在屏幕上输入QUIT+回车。
4. 观察TIME_WAIT连接在10s后被回收:
while true
do
date;
netstat -an | grep TIME_WAIT
sleep 1s
done






总  结



通过调低系统内核参数TCP_TIMEWAIT_LEN的值,加快TIME_WAIT状态会话的回收,减少无效连接的存在,同时也降低了对资源的占用。


本文作者:丁 伟

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129610.html

相关文章

  • 【Java】留下没有基础眼泪的面试题

    摘要:表示连接已经成功建立。在这个状态下,应用程序还有接受数据的能力,但是已经无法发送数据。表示收到了对方的报文,并发送出了报文。状态下的连接会等待罕见的状态。在窗口中还没有发出的接收方还有空间。进程的亲缘关系通常是指父子进程关系。 前言 只有光头才能变强 本文力求简单讲清每个知识点,希望大家看完能有所收获 一、如何减少线程上下文切换 使用多线程时,不是多线程能提升程序的执行速度,使用多线程...

    light 评论0 收藏0
  • centos系统大量time wait占用的解决

    摘要:发现存在大量状态的连接通过调整内核参数解决编辑文件,加入以下内容然后执行让参数生效。当出现等待队列溢出时,启用来处理,可防范少量攻击,默认为,表示关闭表示开启重用。 统计在一台前端机上高峰时间TCP连接的情况,统计命令:netstat -n | awk /^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} 除了ESTABLISHED,可以看...

    betacat 评论0 收藏0
  • 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法

    摘要:服务器出现异常最长出现的状况是服务器保持了大量的状态。此时主动关闭一方必须保持一个有效的状态下维持状态信息,以便可以重发。这就意味着,一个成功建立的连接,必须使得之前网络中残余的数据报都丢失了。,维持这些状态给服务器端带来巨大的负担。 showImg(https://segmentfault.com/img/bV9DQk?w=732&h=563); showImg(https://se...

    LeanCloud 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<