最近有个问题困扰了我一个多月,在最近对项目进行压力测试时,MySQL数据库总是莫名其妙的出现表锁死的现象,经过不懈的努力和不错的运气,这个问题终于解决了。这个项目我是半路接手的,到手时几乎是个完备的成品了,这是个实时监控的项目,在低压力下(5个终端)运行一切正常。但是在高压力(300-900终端)总是会出现不稳定的状况。 一开始还算正常,但是运行一段时间后就会发生表锁死。
我特意买了一本关于MySQL的默认存储引擎InnoDB的书,仔细研究了一下,进行了各种优化调整但是问题依旧没有解决。 此时数据库缓存的命中率达到了99.2%,但是依旧没有解决长久运行锁死的问题。
终于在一个明媚的早晨,我来到公司,打开 WorkBench,查看了正在运行的测试服务器,这个工具软件是MySql自带的,我刚刚发现其功能十分强大,在进程监控一项,我突然发现了问题所在:3个计时器阻塞了所有进程!
这三个计时器是用来计算30秒、5分钟、1小时的数据平均值,然后存在另外的表里,设备少了,他们还行,但是如果有900台设备,那么但就30秒表来说,每30秒就会产生900个额外线程对实时数据表进行读取和运算。其中还有个运算的过程,要知道InnoDB引擎最不擅长的就是对数据的运算,所以即使你有100个并发线程,但是都在访问实时表,再加上运算,表的锁死现象就不足为怪了。
之后我修改了计时器的策略,把运算交由java后台进行,然后数据库一切都清爽了,900台的压力不足一提,稳定高效。
总结这次困扰了我1月多的问题,有以下几点经验教训:
1、半路接手的项目没有吃透,尤其是对于以前没有接触过的计时器,不是很了解,所以没有意识到问题的根源。
2、一开始没有使用合理的工具,直到利用了 WorkBench 才发现问题所在。
3、千万不要用InnoDB进行大量数据运算(那3计时器不是我写的,不是我的锅

总之,通过这次我也是涨了经验了,还对InnoDB研究了一帆, 看来没有解决不了的问题,只有不够执着的程序猿。