上次项目中遇到一个很奇怪的问题,服务器程序在运行的过程中,每到凌晨4点左右就会莫名其妙地变慢,无法正常回应心跳包,甚至导致服务器程序与主控制单元失去连接。
这个问题在客户端增加到十个左右时开始出现,但并非客户端一上就出现,而是在固定的时间出现,这让我们困惑了很久。
首先,我们决定优化程序,特别是在计算最短路径的算法上,增加了很多优化的地方,但效果并不明显。然后猜测是打印log造成性能的损失,于是精简log,几乎精简到原来的1/3。
虽然我们在优化上做了大量的工作,但效果并不明显,问题还是会出现。
事实上,这段时间我们的工作并没有白费。大量性能上的优化虽然没有解决问题,但是却是必须的。我们应该感谢这个bug,让我们的软件在性能上有了很大提升,这些提升也都是这个问题驱动出来的。
最终,通过分析,我们决定在Linux性能上找原因。
原因还没有找到,我就被分到了其他的项目组,但我一直关注的问题的进展。去年11月份的时候,原项目组的同事告诉我他已经发现了问题的根源:项目中使用的RetHat操作系统没到一定的时间会运行一些非常耗费系统资源的进程,具体的我不记得了,只知道有一个是负责log清理的。这些进程几乎会占用所有的系统资源,导致我们的程序运行变慢。
我的同事通过修改配置文件的方法解决了这个问题,客户端加到上百也没有再出现一开始提到的情况。问题似乎是解决了,也留给了我们深深的疑问。如何快速的定位问题?压力测试对软件的重要性?已经一个Linux下的程序员应该对系统了解多深?都值得我们深思。
好了,就写到这吧。也告诫自己,以后多多总结多多整理,多做事少偷懒。