今日接到同事的电话,说微信公共帐号中的游戏无法登陆,用户不能玩了,麻烦尽快解决。
1、登陆IDC机房查看服务器流量图,流量正常,排除故障与流量无关。
2、登陆微信公共帐号中的游戏所在服务器发现系统互载过高,mysql进程CPU使用率超过300%。
为了快速解决问题直接重启mysql服务后,再查sysql进程CPU使用率依旧高居不下。故障还没有解决,继续寻找原因。
3.登陆mysql数据库,执行show processlist;查看当前正在执行的sql语句,发现几个表出现“sending data”状态,sql执行时间过长。
4、通知开发人员检查这几个表有没有增加索引,开发人员居然无法处理,无语。。。
5、等待开发人员返场的时间里继续查询解决方法。在mysql配置文件my.cnf中增加以下参数:
tmp_table_size = 300M
query_cache_size = 1024M
希望通过增加临时表及查询缓存大小来解决问题,增加这两个参数后,发现CPU占用率有所下降,有一定效果,但还是超过100%。游戏打开依旧缓慢。
6、本着故障不等人,早点解决问题,用户就能继续玩游戏,用户也就不会产生投诉的思想。继续登陆mysql,执行show index from tablename,查询出现“sending data”的几个表,发现果然没有增加索引。此时此该有种想劈人的感觉。
7、执行增加索引的语句,把出现“sending data”的几个表全部加上索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
重启mysql服务后,mysql进程的CPU占用率恢复正常,微信公共帐号中的游戏可以正常登陆,至此故障得到解决。通知同事去验证。
此次事件从问题的开始到问题的结束一共耗时2小时,天天跟开发人员说,需要大量查询的表中一定要加索引、一定要加索引,可是依旧出现因无索引导致发生故障的事件。由此可见规范开发人员的工作习惯、规范开发流程是多么重要。
借此记录一下故障的全过程,也希望能给朋友们一个解决问题思路借鉴。