今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库
服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%,可以肯定的是mysql连接出现问题:
netstat -an 192.168.12.13:3306 192.168.12.12:30443 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30444 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30445 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30446 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30447 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30448 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30449 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30450 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30451 TIME_WAIT 192.168.12.13:3306 192.168.12.12:30452 TIME_WAIT ... ...
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的
DWORD键,设置为60,以缩短TIME_WAIT的等待时间
登陆到web服务器(linux):
netstat -ae |grep mysql tcp 0 0 aaaa:53045 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53044 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53051 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53050 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53049 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53048 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53055 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53054 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53053 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53052 192.168.12.13:mysql TIME_WAIT root 0 tcp 0 0 aaaa:53059 192.168.12.13:mysql TIME_WAIT root 0
发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vi /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
修改之后,再用
netstat -ae|grep mysql tcp 0 0 aaaa:50408 192.168.12.13:mysql ESTABLISHED nobody 3224651 tcp 0 0 aaaa:50417 192.168.12.13:mysql ESTABLISHED nobody 3224673 tcp 0 0 aaaa:50419 192.168.12.13:mysql ESTABLISHED nobody 3224675
发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,各网站访问正常!!
以上只是暂时的解决方法,最后仔细巡查发现是前天新上线的一个系统,程序代码中没有使用mysql.colse(),才导致大量的mysql TIME_WAIT
相关推荐
本文主要探讨了如何解决CentOS服务器上存在的大量TIME_WAIT TCP连接问题,这可能导致服务器连接数过多,进而引起服务假死。当服务器之间的通信过于频繁,如通过REST请求互相调用时,Java服务器可能无法及时回收TCP...
针对这一问题,可以通过调整Linux系统的内核参数来优化TIME_WAIT状态的处理,以下是一些具体的优化策略: ### 1. 开启SYN Cookies `net.ipv4.tcp_syncookies=1` 此参数用于在SYN队列满时启用SYN Cookies功能。在...
TIME_WAIT状态带来的主要问题在于资源占用,尤其是在服务器端,大量并发连接进入TIME_WAIT可能导致端口耗尽,影响新连接的建立。解决这个问题的方法包括: 1. **调整TCP参数**:可以在操作系统层面修改TCP的超时...
总结来说,优化Linux服务器的socket连接数和sysctl配置对于处理高并发场景至关重要。通过调整`sysctl.conf`文件中的相关参数,可以有效地提升系统性能,降低延迟,增强服务的稳定性。不过,任何改动都需要结合具体...
客户端和服务器之间的 TCP 连接,在关闭连接时,需要经历四个阶段:FIN_WAIT_1、CLOSE_WAIT、FIN_WAIT_2 和 TIME_WAIT。其中,FIN_WAIT_2 状态是指客户端已经发送了 FIN 报文,并等待服务器的确认响应。 现在,假设...
本文将深入探讨Linux下的TCP编程,包括TCP套接字(socket)的工作原理、C/S架构的实现以及相关的TCP/Linux优化策略。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手建立连接,并...
1. `tcp_tw_reuse`:允许在TIME_WAIT状态下重用连接,减少资源消耗,但可能引发混淆。 2. `tcp_tw_recycle`:快速回收TIME_WAIT连接,但可能导致时间戳问题,影响连接的正确性。 3. `tcp_fin_timeout`:控制FIN_WAIT...
6. **TCP状态机**:理解TCP连接的不同状态,如CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK和TIME_WAIT。 7. **性能优化**:如何调整内核参数以优化...
通过启用SO_REUSEADDR,程序可以在TIME_WAIT状态结束后立刻重用端口,无需等待整个TIME_WAIT周期。 在Linux中,还可以使用SO_REUSEPORT选项进一步优化端口复用。此选项允许多个进程同时绑定到同一个端口,通过内核...
Apache服务器是世界上最流行的Web服务器之一,它以其稳定性和可扩展性而受到广泛的使用。在软件开发过程中,确保服务器能够...同样,过多的`TIME_WAIT`状态可能表明服务器未能有效地管理连接关闭,需要优化相关设置。
下面我们将深入探讨Linux环境下的TCP通讯机制,特别是TCP握手的过程和相关源码分析。 一、TCP三次握手 1. SYN (Synchronize Sequence Numbers):当客户端想要与服务器建立连接时,它会发送一个SYN包,包含一个随机...
- `SO_REUSEADDR`:允许在TIME_WAIT状态下重用套接字地址,这对于多线程服务器避免等待TIME_WAIT超时特别有用。 - `SO_KEEPALIVE`:在无数据传输时周期性发送探测报文,检查连接是否仍然活跃。 - `TCP_NODELAY`:...
例如,可以通过修改`/proc/sys/net/ipv4/tcp_`系列的内核参数,如`tcp_congestion_control`选择不同的拥塞控制算法,`tcp_tw_reuse`允许重用TIME_WAIT套接字以减少资源消耗,或`tcp_keepalive_time`设置连接空闲多久...
本文将深入探讨标题"ice_chen_linux_function"所涉及的Linux下C语言编程常用系统函数,并结合描述中的提示,介绍它们的功能和使用方法。 1. **标准I/O库函数**: - `printf` 和 `scanf`:用于格式化输入输出,是...
`net.ipv4.tcp_fin_timeout = 30`缩短FIN_WAIT_2状态的时间,减少资源占用。 除了文件句柄和TCP参数,还应关注其他内核参数,如共享内存(`shmmax`、`shmall`等)和信号灯(`semmns`、`semmsl`等)的数量,以适应...
本主题将深入探讨Linux API的核心概念、常用函数以及它们在实际开发中的应用。 Linux API包含了众多用于进程管理、内存管理、文件操作、网络通信、设备驱动等关键功能的函数和结构体。下面我们将逐一解析这些关键...
在探讨Linux服务器能负载多少个连接之前,首先要理解TCP连接的本质。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它基于四元组(src_ip, src_port, dst_ip, dst_port)来唯一识别一个...