Centos大量的TIME_WAIT解决方法

本文介绍了解决系统中大量TIME_WAIT状态连接的方法,通过调整内核参数如tcp_syncookies、tcp_tw_reuse等,有效减少了TIME_WAIT状态的连接数量,并提供了一种检查TIME_WAIT状态连接数目的方式。

系统存在大量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 -nat |awk '{print $6}'|sort|uniq -c查看可以看到time_wait减少

PS:关于root账户修改tcp协议参数返回Permission denied的问题

 

bash: /proc/sys/net/ipv4/tcp_tw_recycle: Permission denied
-bash: /proc/sys/net/ipv4/tcp_tw_reuse: Permission denied
 原因:你不能设置OpenVZ平台的Kernel / TCP / UDP连接参数,但是使用Xen 平台的VPS可以。

 

如何区分虚拟机:ls /proc/  列表中有vz目录的是OpenVZ平台,否则是Xen平台。
首页/大数据 宝塔MySQL8.0.36有时无法访问(大约15秒左右),目前CPU占用1,如何解决? mysql 数据库 java 求社区用户再支个招,感谢! 宝塔MySQL8.0.36每隔 5 分钟左右没有请求时,再次请求必卡 15 s,之后一切正常。当没有数据请求后隔5分钟左右再次请求会出现上述的问题,目前没有部署项目CPU占用1%,内存为50%。 MySQL配置文件 [client] #password = your_password port = 3306 socket = /tmp/mysql.sock [mysqld] binlog_cache_size = 128K thread_stack = 256K join_buffer_size = 2048K max_heap_table_size = 128M port = 3306 socket = /tmp/mysql.sock datadir = /www/server/data default_storage_engine = InnoDB skip-external-locking key_buffer_size = 128M max_allowed_packet = 100G table_open_cache = 384 sort_buffer_size = 1024K net_buffer_length = 4K read_buffer_size = 1024K read_rnd_buffer_size = 768K myisam_sort_buffer_size = 16M thread_cache_size = 128 tmp_table_size = 128M lower_case_table_names = 1 default_authentication_plugin = mysql_native_password sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES explicit_defaults_for_timestamp = true skip-name-resolve max_connections = 300 max_connect_errors = 100 open_files_limit = 65535 log-bin=mysql-bin binlog_format=mixed server-id = 1 binlog_expire_logs_seconds = 600000 slow_query_log=1 slow-query-log-file=/www/server/data/mysql-slow.log long_query_time=3 #log_queries_not_using_indexes=on early-plugin-load = "" wait_timeout = 300 interactive_timeout = 300 innodb_data_home_dir = /www/server/data innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /www/server/data innodb_buffer_pool_size = 256M innodb_log_file_size = 128M innodb_log_buffer_size = 32M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 innodb_max_dirty_pages_pct = 90 innodb_read_io_threads = 4 innodb_write_io_threads = 4 [mysqldump] quick max_allowed_packet = 500M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 64M sort_buffer_size = 1M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout = 600 # bt_mysql_set = None # bt_mem_size = None # bt_query_cache_size = None # bt_mysql_set = None # bt_mem_size = None # bt_query_cache_size = None 轻量云4核4G centOs7 宝塔 MySQL8.0.36 若依springboot项目 已试过 my.cnf、TCP keepalive、wait_timeout、interactive_timeout,均无效,求社区用户支支招 希望能够支支招解决每隔五分钟不使用就会卡的问题
最新发布
10-20
你遇到的问题: > **MySQL 8.0.36 在空闲约 5 分钟后,首次请求会卡 15 秒左右,之后恢复正常** > 系统:CentOS 7 + 宝塔面板 + MySQL 8.0.36 + 若依 SpringBoot 项目 > 资源使用正常(CPU 1%,内存 50%) 这是一个典型的“连接断开 → 重连慢”问题,根本原因不是数据库性能瓶颈,而是 **连接生命周期管理不当 + 网络层或应用层的连接池配置缺失**。 --- ### ✅ 根本原因分析 #### 🔍 为什么空闲几分钟后第一次请求特别慢? | 原因 | 说明 | |------|------| | ✅ **连接被关闭(wait_timeout)** | `wait_timeout = 300`(即 5 分钟),超过这个时间没有活动的连接会被 MySQL 主动断开 | | ✅ **Spring Boot 默认 HikariCP 连接池未正确配置** | 如果没开启连接保活、测试语句、最小空闲连接等,会导致旧连接失效后重新建立连接 | | ✅ **TCP 层面连接中断但未及时探测到** | TCP keepalive 设置不合理时,应用认为连接还活着,实际已断,导致第一次请求超时重连 | | ❌ 不是 MySQL 启动慢或磁盘 IO 慢 | 因为后续请求很快,排除冷启动 | --- ## ✅ 解决方案(综合优化) ### ✅ 第一步:调整 MySQL 配置(适当延长 + 开启保活) 你的 `my.cnf` 已经不错,但可以微调并确认生效: ```ini [mysqld] # 当前已有 wait_timeout = 600 # 改为 600 秒(10分钟),避免太频繁断开 interactive_timeout = 600 # 必须和 wait_timeout 一起改 # 新增:启用空闲连接心跳检测(MySQL 5.7+/8.0+ 支持) # 让服务器主动 ping 客户端是否存活 # 注意:该参数在 MySQL 8.0 中默认可能关闭 # 可选(非必须) # 注意:MySQL 8.0 不支持 old_passwords 相关设置,无需担心 # 可增加以下两个参数帮助维持长连接 net_read_timeout = 60 net_write_timeout = 60 # 【重要】确保跳过 DNS 解析 skip-name-resolve # 已有 ✅ ``` 📌 修改完重启 MySQL: ```bash systemctl restart mysqld ``` > ⚠️ 注意:宝塔有时不会完全加载自定义配置,请检查 `/www/server/data/my.cnf` 是否真实写入,并通过命令验证: ```sql SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout'; ``` --- ### ✅ 第二步:Spring Boot 应用侧优化(关键!) 这是最容易忽略的关键点! 若依(RuoYi)默认使用 HikariCP 连接池。如果未正确配置,就会出现“连接断开 → 重连耗时”。 #### 修改 `application.yml` 数据库连接配置: ```yaml spring: datasource: url: jdbc:mysql://your-ip:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai &autoReconnect=true &socketTimeout=30000 &connectTimeout=10000 &validationQuery=SELECT 1 &testWhileIdle=true &testOnBorrow=true username: root password: your_password type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 20 minimum-idle: 5 # 保持最少 5 个空闲连接 idle-timeout: 600000 # 空闲 10 分钟才释放(单位毫秒) max-lifetime: 1800000 # 连接最长寿命 30 分钟 connection-timeout: 10000 # 连接超时 10s validation-timeout: 3000 keep-alive-timeout: 30000 # HikariCP 专用:定期发送 SELECT 1 维持连接 leak-detection-threshold: 60000 # 可选:检测连接泄漏 ``` #### 关键参数解释: | 参数 | 作用 | |------|------| | `minimum-idle: 5` | 始终保留至少 5 个连接,防止全部断开 | | `keep-alive-timeout` | HikariCP 每隔一段时间发 `SELECT 1` 检查连接是否有效(推荐设为 30s) | | `testWhileIdle` / `testOnBorrow` | 获取连接前先测试有效性 | | `autoReconnect=true` | 允许自动重连(配合验证查询更可靠) | --- ### ✅ 第三步:操作系统 TCP Keepalive 设置(辅助) 虽然不如连接池重要,但也建议开启: ```bash # 编辑 sysctl 配置 vim /etc/sysctl.conf ``` 添加或修改: ```conf # TCP keepalive 探测机制 net.ipv4.tcp_keepalive_time = 300 # 空闲 5 分钟后开始探测 net.ipv4.tcp_keepalive_intvl = 60 # 每 60 秒探测一次 net.ipv4.tcp_keepalive_probes = 3 # 最多探测 3 次,失败则断开 ``` 应用配置: ```bash sysctl -p ``` --- ### ✅ 第四步:验证与监控 #### 1. 查看当前连接状态 ```sql SHOW PROCESSLIST; ``` 观察是否有大量 Sleep 状态连接突然消失。 #### 2. 日志中查看慢查询是否包含连接建立过程 查看 Java 日志,搜索类似: ``` HikariPool-1 - Starting... Acquiring connection from data source ``` 如果是每次都要“acquire”,说明连接池没维护好。 #### 3. 使用 `tcpdump` 抓包(进阶) ```bash tcpdump -i any port 3306 -nn -w mysql.pcap ``` 查看是否有 RST 或长时间无响应。 --- ### ✅ 总结:你应该做什么? | 步骤 | 操作 | |------|------| | ✅ 1 | 将 `wait_timeout` 和 `interactive_timeout` 改为 `600` | | ✅ 2 | **重点修改 Spring Boot 的 HikariCP 配置**,加入 `minimum-idle`, `keep-alive-timeout`, `validationQuery=SELECT 1` | | ✅ 3 | 添加 TCP keepalive 内核参数(可选) | | ✅ 4 | 重启 MySQL 和 Spring Boot 服务 | | ✅ 5 | 观察 10 分钟后再访问,是否仍有卡顿 | --- ### 🚫 错误做法(不要做) - ❌ 单纯加大 `innodb_buffer_pool_size` → 和连接延迟无关 - ❌ 改 `max_connections` → 不解决空闲断连问题 - ❌ 以为是宝塔 bug → 实际是应用层配置问题 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值