项目12月14日凌晨从AWS迁移到了阿里云,15号下午13:58分开始报首页没有内容的问题。
查看项目网元内存占用在40%左右,CPU更低,整体正常。
查看项目网元日志,有如下报错:
通常这种错误是网元处理超时,网关主动断开,或用户主动放弃。
也就是说从网元看,并没有发现数据库连接的问题,但是存在大量响应时间超过1秒的请求:
从阿里云数据库监控平台看,存在慢查询,并且CPU达到了100%:
分析慢查询问题的同时,继续根据网关日志分析是否是由于请求暴增导致。
出现问题前的1个小时内的请求数量跟前一天同时段的相比并没有太大的变化。
接近20分钟后,数据库并没有自动恢复,因此重启数据库,但是重启后CPU很快就又达到了100%。
运维查看show processlist结果,发现80%以上都是上面的第一个SQL语句处于Copying to tmp table on disk状态,尝试修改tmp_table_size(从2M调整到16M)后问题解决。
数据库恢复后执行上述慢查询语句,实际并不慢,不到1秒。
综合上述过程分析,不是请求暴增导致,而应该不是慢查询导致,后来调整思路,由于mysql CPU是突然飙升到100%,而不是慢慢累积,因此联系数据库专家进一步分析。
最后得出结论,CPU飙升是因为部分查询返回数据量大于tmp_table_size,导致数据库操作在磁盘进行,大大降低了处理速度,数据库进入低速模式(但是并没有死)。
将AWS数据库参数跟阿里云参数做了全面对比排查,没有发现其他参数存在不一致。
总结:
1、如果发现数据库CPU很快飙升到100%就马上联系数据库专家进行分析,不要紧盯着业务进行分析。
2、服务器迁移后,服务器配置都需要保持一致,甚至要留有冗余,包括网元分配的实例树、网元CPU、内存配置,数据库内存,数据库重要参数(如tmp_table_size)等。