MySQL 出現大量 Sleep 狀態連接,Time 持續增長,佔滿 max_connections 導致新連接被拒。調優參數無效,需主動清理。
kill-mysql-sleep-proc.php
MAX_SLEEP_TIME) {
$kill_id = (int)$proc["Id"];
mysqli_query($conn, "KILL $kill_id");
error_log("Killed sleep process ID: $kill_id, Time: {$proc['Time']}");
}
}
mysqli_close($conn);
?>
改進點:使用 mysqli 替代棄用的 mysql 擴展;強制類型轉換 (int) 防注入;記錄日志便於審計。
# 編輯 crontab
crontab -e
# 添加行(路徑根據實際調整)
*/2 * * * * /usr/bin/php /usr/local/sbin/kill-mysql-sleep-proc.php >> /var/log/kill-mysql-sleep.log 2>&1
close() 連接,使用連接池復用而非頻繁創建/銷毀。wait_timeout / interactive_timeout = 60-120(自動斷開閒置連接)max_connections 適度增大(配合內存)thread_cache_size 減少線程創建開銷Threads_connected / Max_used_connections 閾值告警,而非依賴定時 Kill。SHOW PROCESSLIST 中 Host/Info 定位具體應用/接口,針對性修復。定時 Kill 腳本是緊急止血手段,核心在於應用層連接管理規範化 + 服務端超時保護 + 監控體系三位一體治本。