周一晚上,项目经理小雷给我打电话,说程序运行还是很慢,查询目录的时间平均在10秒左右,有的时候会看到进度条一直在那里转,到最后显示页面不存在。
上周开始小雷不断地跟我反映软件运行太慢,我告诉她重启一下tomcat服务再试试。刚开始重启服务之后,程序就能够正常的使用,查询效率提了起来。但是过不了多久,大概3到4个小时,程序又会坏掉。直到最后每隔一个小时需要重启一下程序,每次查询目录依然很慢。
于是与K总商量了一下,周六过去看看出了什么状况。
周六5点起床,晚上11点才回到武汉,没能找到问题的原因。
于是象征性地讲程序重新部署,以期望程序能够达到最初使用程序时的1秒内的查询状态,但结果却不尽人意,重新部署完之后,程序依旧查询很慢。
星期天,去了东西湖,K总把从别处借来的一台老式的高速扫描仪放在了办公室。我从住处出发,转公交到光谷广场坐地铁2号线到循礼门转1号线到五环大道口下,然后步行至建设局。
我驾轻就熟地将扫描仪搬出来摆放好,连接上电脑之后,转好驱动和客户端程序,完成调试,录制了操作视频,以给这边地项目经理做指导视频。
扫描仪布置完毕,杨总也赶了过来跟我弹合作。杨总是K经K综总介绍知道了我,想要跟我合作几个学校的档案项目。
谈了一个多小时不到,杨年龄比我还小,性子比较直,说话很直接,问我对于项目的想法,我简单地说了一下,最后我说项目可以做,但是我也只能利用周末的时间来帮忙。
周日这一天还算顺利,于是坐车去金融港剪了个头。
剪完头骑着ofo回到住处,已是晚上9点多钟。
周一下午小雷突然给我发来微信,说程序奔溃了,根本就用不了了。
我的本质工作是个程序员,周一往往是最忙的时候,手头的研发任务也颇为棘手,听到远在XY市的小雷报告我是心急如焚,但也只得微信会过去,“知道了”。
没过多久K总电话也打了过来,程序奔溃问题得尽快解决,不然10来个人就得闲在项目上,成本太高。我也知道这一点,但是我却在犹豫要不要请假,此前请了很多次假了,我的研发主管多我意见很大了,心情异常复杂。
只得尝试着远程指导小雷去定位程序问题,我也思考是什么原因影响力程序运行效率。
1、网络,网路延迟导致数据传输过慢。
2、数据库并发数目限制,数据库平时并发访问阻塞了我们程序对数据库的访问。
3、缓存,程序运行过程中产生了大量缓存,导致程序臃肿,进而影响程序运行效率。
4、数据库语句查询耗时,表单展示分为两个过程:查询数据、展示数据。而通过sql查询的数据可能非常耗时。
我给小雷打了电话,指导她清理了缓存,结果清理完程序无法运行了。
电话指导很是费劲,我电话也打了很长时间,该回到岗位上了。于是跟小雷说晚上下班之后再作指导吧。
K总又来了电话,我把我的安排告知给了K总,晚上我回去再远程指导小雷,如果还是不能解决,那我第二天再请假过去XY市现场看看。K总听到这样说心里缓和了许多。
晚上7点回到住处,通过视频,指导小雷操作程序,倒腾了两个小时,最后程序还是启动不了。
于是硬着头皮给研发主管打了个电话请假,研发主管没说什么就同意了,但是我心里还是有点忐忑。
紧接着给K总去了电话,准备明天过去看看,让K总给我定一下车票。
把计划排好之后看了一个小时娱乐节目,老婆又打来了电话,跟我诉说她跟我老妈相处的苦楚,老婆很是懂事,老妈却总是误解她,而我又不好直接说我妈,反而会加剧老婆老妈之间的矛盾。
于是与老婆聊了一个多小时电话,聊完看了下时间已是凌晨1点多,上了床却睡不着,想着老婆老妈之间的各种小的摩擦,心里一团乱麻。
又想到要去XY,能不能解决问都还是个问题,弄不好就要在那里呆两天,这样又得跟我的研发主管请假。周六与杨总会面之后还没有进一步谈具体的合作方式以及利益分成。各种挑战性的问题有待解决。
于是索性不想了,开始看最近热播的《欢乐颂2》,直到凌晨3点倦意才袭来。
睡了两个小时,5点起床,赶7:50点火车。
到XY市办公市已经是中午11点,与许久不见的L科长打了招呼马上便投入到程序奔溃问题定位工作中来。
我现实排除了缓存的问题,清理掉所有缓存之后再启动程序,程序的查询效率依旧在10秒左右。
然后又检查了oracle的访问链接,发现不存在多并发阻塞我们程序查询数据库的问题。
至于网络,在客户端不断ping服务器的IP,无论是程序停止,还是程序查询数据库过程中,ping服务器的响应时间均在1ms左右,那也就排除了网络问题。
只剩下最后一个问题,SQL语句查询效率问题,但是捣鼓了半天都找不出SQL语句执行的日志文件。
于是升级了研发平台,切换成DEBUG模式之间重启程序便能够读取SQL查询的日志记录。
定位出在目录中两意思SQL语句执行时间分别是2693ms和2386ms,这大大超出了预期,SQL查询低于1m才是正常情况。
于是着手优化程序代码内的SQL,总结一下在两方面做了优化:
1、select * from table改写成select field1,field 2... from table由差表全部字段改为查具体用到的字段。
2、将where后面过滤的语句中的"='value' "换成"like 'value' ",不知道原理是什么,但测试结果是前后查询效率变快了。
3、在下发SQL时将过滤语句组装,而不是查处全量数据再在程序里过滤。
已是优化工作做完,原先的程序表单查询由原来的10s降低到1s,彼时已经是下午5点,悬着的一颗心才放了下来。
问题解决完立马向K总汇报了成果,让K总给我定了下午7点回汉的动车,而此时当我快要完稿此篇文章时,我已经到了光谷广场,22:30,等着回去的公交车。
算了一下周末两天加上周一和今天这四天一共才休息了17个小时不到。
网友评论