公司的一个软件项目已经到尾声了,就看甲方那边有没有什么问题反馈过来,如果没有问题的话,项目就应该验收了!但是好事多磨,甲方突然反映了一个问题,那就是当把我们的软件打开以后,每隔一段时间客户的系统就会无响应,软件操作不了、电脑反映迟钝,基本上就处于不能操作的状态!
接到甲方的反馈,因为软件是由我负责的,于是公司让我来查电脑看代码,看看哪里有问题。
但是,这个软件虽然是由我负责的,但我其实是半路接手的这个工作。之前写这块代码的另外一个研发同事去忙别的事情去了,我只是在他的代码基础上进行增量开发。
因为只是做增量开发,所以我不需要关心以前的代码是怎么样的。因此,当甲方把问题反馈给公司以后,我不得不重新把所有代码查阅一遍,以便能够找出问题所在。
根据我以往的工作经验,首先我全局查看了所有跟循环和线程有关的代码,确定循环没有无限循环以及没有锁线程的情况存在。又看查看了所有跟数据库查询有关的代码,确定没有大数据查询以及数据查询导致的死锁。最后,只能依靠猜测象征性地改了一些代码,然后让我们的实施同事去测试。
当我们实施的同事跑到甲方那边把软件重新部署后,发现问题依然存在。跟我们的实施同事沟通了好久,教了他很多查找问题的方法,基本上都没有确定问题出现的原因。所以,我基本上可以确定这个问题在我们的测试环境是无法调试出来的,而且,靠着我们公司实施同事去发现问题基本上也没什么可能了!于是,公司就派我亲自去甲方那边查找原因。
因为在公司环境测不出问题,在甲方那边就很容易出现。问题出现的时候,只要把任务管理器打开,就会发现我们的软件一直在频繁的读取磁盘。这种问题的症状有点像是系统的问题,因为一直读取磁盘内容这个行为符合甲方系统在刚发布的时候出现的一个Bug,只不过后来被修复了!
于是,我想当然地认为,甲方的系统可能存在问题,并一直以这个为方向在找问题,但一直没什么结果!
后来偶然间,我在监控系统资源的时候,发现一个文件夹一直在被读取,只不过它所占用的资源比较少,所以我一开始没有在意。但是当我多次见到这个文件夹的时候,我似乎感觉这个文件夹之前在哪里见过!
然后我就如醍醐灌顶一般,想起来了!原来在不久之前,甲方提出了一个要求,就是我们系统的服务端每天大概会向这个文件夹写入一些数据文件,当时间久了以后,这些数电脑据文件就会非常占用磁盘空间。于是,甲方就要求我们去定期删除里面的旧文件,只保留指定时间内的较新文件。
而我做的操作,就是遍历这个文件夹里面的所有文件,逐一判断文件的创建时间。符合删除条件的则删除,其他的则都留下!
于是,我心里产生了一个大胆的猜测:“假设这个文件夹里面有一百万个文件,对这一百万个文件进行读取的话,会发生什么?”。
为了印证我的猜测,我打开了这个文件夹。可是事实告诉我,这个文件夹里面的内容比我想象的更夸张!尽管软件会定期删除旧的文件,而较新的文件竟然也有两百多万个!
我的天呐!我实在不敢想象,这个文件夹里面竟然被写入了那么多文件,而且这些文件还是被保留下来的那部分,可以想象,如果这个文件夹里面的文件如果都没有被删除,该是什么样的情况?
开始甲方让我去定期删除文件的时候,我只是认为这个文件夹里面的文件最多也就几万个,定期删除的话应该不会留下多少。并且,因为是服务端写入的文件,我本来也不需要关心这个文件夹到底写了多少文件。
很明显,我每次去删除旧的文件的时候,只要对两百多万个文件进行IO,从而获取它们的创建时间以便删除。但是,就是因为频繁地IO,最后导致磁盘一直在被读取,导致软件无响应、系统无响应无法操作。
自责之余,我也不禁感慨,哪有这么保存文件的!写服务端的程序员难道是个傻子吗?
要知道,以往我遇到这种需要向文件夹写入大量文件的项目需求的时候,首先想到的就是分开存放,至少也得按天为单位去建文件夹保存文件。但是,很显然,写服务端的这个家伙图省事,直接将这些文件放在了一个文件夹里了。
最后,我将问题反馈给了写服务端的研发同事,让人遗憾的是,他给我的回复是:“你将文件夹里的文件清空,然后把删除间隔缩短一点就可以了!”。
他电脑的意思很清楚,总之就是不愿意改代码!于是我只能按照他的意思来,将文件夹里面的文件清空,并且将文件保存的期限缩短。虽然这种方法表面上解决了问题,但其实是“掩耳盗铃”的做法!
如果哪一天甲方需要查看时间更久一点的数据,显然就没有办法了!
当然,想要从我这边入手解决问题也不是没有办法,比如我每次检索文件夹里面的文件时,将文件按天进行归类,每天都新建一个文件夹来存放对应日期的文件。而因为这些文件的目录在数据库里是有记录的,所以我还得把数据库中的文件地址也更新下。还有其他更多更好的办法!
但是,如果我这么做了,不光影响软件性能,另外还会让服务端的同事感觉我很好说话,以后再遇到这样的事情会想当然地通过我来解决问题。
如果这样,问题是解决了,但是一般问题被发现都是在后期,排查问题既浪费公司的人力物力,而且会给甲方留下不好的印象!觉得我们公司这种低级错误都能犯!
因此,我的决定是——不改!并且将我在甲方那里得到的结果反馈给公司,由公司决定到底谁来负责!
电脑 电脑