电话
400 9058 355
应通过监控连接使用率趋势而非瞬时值来实时预警:PG用pg_stat_activity计数与max_connections比值≥85%持续2分钟告警;MySQL结合Threads_connected、Threads_running及滑动窗口分析,避免误判业务波动。
max_connections 即将耗尽PostgreSQL 和 MySQL 的连接数被打满时,新连接会直接拒绝,错误通常是 FATAL: remaining connection slots are reserved for non-replication superuser connections(PG)或 Too many connections(MySQL)。不能等报错才响应,得提前预警。
关键不是查当前用了多少,而是看「趋势」+「临界阈值」。建议在监控系统中配置:
SELECT COUNT(*) FROM pg_stat_activity;,对比 SHOW max_connections;,当使用率 ≥ 85% 持续 2 分钟触发告警SHOW STATUS LIKE 'Threads_connected'; 和 SHOW VARIABLES LIKE 'max_connections';,注意 Threads_connected 包含空闲连接,需结合 Threads_running 判断真实压力max_connections 的安全操作路径动态调大 max_connections 不是简单改个参数重启就行,它受底层资源硬约束。不检查就扩,可能引发 OOM 或内核拒绝分配内存。
执行前必须确认:
shared_buffers 和 work_mem 是否已随连接数线性增长——每个连接默认至少占用几 MB 内存,max_connections 从 100 扩到 500,若 work_mem=4MB,理论内存新增约 (500−100)×4MB = 1.6GB
table_open_cache、innodb_buffer_pool_instances 等关联参数是否需同步调整,否则可能卡在文件描述符或 mutex 竞争上ulimit -n 查当前进程允许打开的文件数,max_connections 必须 ≤ 该值 × 0.8(留出日志、socket 等其他句柄空间)线上临时扩容推荐分两步走:ALTER SYSTEM SET max_connections = 300; SELECT pg_reload_conf();(PG),或修改 my.cnf 后 mysqladmin shutdown && mysqld_safe &(MySQL,无法在线生效)。
真正活跃的连接可能只有十几个,但 pg_stat_activity 显示几百个——这通常不是配置太小,而是应用没正确释放连接。
常见诱因:
connection.close() 或未进 finally 块,尤其在异常分支里漏关maximumPoolSize 设为 100,但 connection-timeout 过长(如 30s),导致请求堆积后大量连接卡在“获取中”状态state = 'idle in transaction' 或 wait_event = 'Lock' 的连接会持续占 slot,需用 pg_blocking_pids(pid) 定位源头这类问题扩 max_connections 只是掩盖症状,必须配合 pg_stat_activity 中的 backend_start、state_change、query_start 字段做时间差分析。
告警响了,第一反应不是改配置,而是先释放可杀的连接保服务。
PostgreSQL(谨慎执行):
SELECT pid, usename, application_name, state, now() - backend_start AS uptime, now() - state_change AS idle_time, query
FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'idle') AND now() - state_change > interval '5 minutes';确认无误后批量终止:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle in transaction' AND now() - state_change > interval '5 minutes';
MySQL 类似:
KILL [CONNECTION] [thread_id]; -- 先查 SHOW PROCESSLIST; 找出 Command='Sleep' 且 Time > 300 的
注意:pg_terminate_backend() 对超级用户连接无效;MySQL 的 KILL 不会回滚事务,只断开连接,后续需人工检查数据一致性。
真正难的不是扩容动作本身,而是区分“该扩”还是“该修”——连上去看到 200 个 idle 连接,90% 的情况该翻应用日志,而不是去改 max_connections 配置文件。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...