问题现象
HDM 告警
您的自建DB实例
dbvipcenter@10.159.36.193:3307 ( 别名: HMCENTER_M, 集群: 互联互通 )
MySQL活跃会话数达到131
Show processlist
检查实时会话状态,发现出现大量的 "Writing to net"
1 | | 41106 | canal | 10.138.225.187:36737 | NULL | Binlog Dump | 14240 | Writing to net | NULL | 0.000 | |
原因分析
Writing to net:The server is writing a packet to the network.
SQL 语句查询流程:
- 扫描一行写到
net_buffer
,这里net_buffer
是按照 net_buffer_length 初始化,但可以动态增长到 max_allowed_packet 配置值 - 继续获取满足条件的行,直到写满
net_buffer
,然后调用网络接口发送出去 - 客户端接收网络包完成,清空
net_buffer
- 重复上面 1 到 3 的步骤
- 如果发送未完成,表示
socket send buffer
写满,这时会进入等待状态,显示Writing to net
,直到socket send buffer
重新可写,再继续发送
由于 MySQL 是边扫描边发送数据的,当客户端接收慢时,就会阻塞整个查询进程,导致执行变慢。
1 | MariaDB [(none)]> show variables like 'net_buffer_length'; |
解决方法
- 调整 max_allowed_packet 参数
- 排查客户端异常情况
1 | MariaDB [(none)]> set global max_allowed_packet=67108864; |