web网站打开反应慢无法显示实时数据的排查与解决
这个问题已经有几年了,这个web也是在17年搭建的,运行了有3年了,平台主要是对废水排放进行监测的。客户那边老是反应说平台反应慢,平台可以正常的打开,但是里面的实时数据有时候要等半个小时才能反应过来。
小编也是新换的岗位,上班才几个月就遇见了这个好几年存在的问题了,但是小编相信技能将会战胜一切,最后成功的将他拿下,解决了问题
-
问题发生的场景
-
多平台共用一个数据库
-
平台运行时间较长
-
后端数据库操作卡顿
-
问题发生比较随机,随心所欲
-
问题的原因
-
数据库连接问题
-
数据库里面的数据过于庞大
-
数据库运行时间超过3个月(针对sql_server数据库)
废话少说,不服就干
先看问题现象
第一、打开web界面,展示实时数据较慢或者不展示
第二,重启一下平台接收端就恢复一会,过一会问题还会复现
接收端:就是接收上传过来的数据,并负责写进数据库里面
第四,查看状态为500的,到底是卡在了什么地方
好吧,小编承认,这个没怎么看懂,但是里面有个send的字符,这个凭多年的经验,40%是和数据库要挂边了
找实时数据反应慢的原因
查看平台到后端取提取数据所花费的时间
可以很清楚的看见是30秒请求没成功,就进行下一次请求,一般平台都有这个api机制的,超过30秒没请求下来就重新发送请求
现在已经是60%与数据库有关系了
长时间观察这个请求的情况
发现规律了吧,就是平均每4到5分钟才能请求到一次数据,这个也就是客户所说的,半个小时才能显示实时数据,现在已经是70%与数据库相关了
查看数据库,状况
通过上面可以看到,数据库服务器的内存使用率已经达到了81%l了,而且数据库服务器操作还非常的卡,基本上80%可以断定与数据库有关系了
注意:到这里了,大家可能以为,既然服务器内存都已经达到了81%了,那就查看占用内存大的进程,并想法解决内存问题,恢复服务器稳定运行呢
如果大家这样想的话,那就与小编当时的想法是一样的,第一,让服务器内存降下来,确保服务器操作起来不卡顿,第二,测试数据库,然后在对数据库进行一系列的优化。
但是,我想告诉大家的是,如果这样想的话,那就错了,而且会越来越糟
继续,查找占用内存较大的服务
一看就是sql server占用的内存最大了,好了,知道了占用内存最大的是sql_server,达到了13G,总共内存才16G,于是对sql_server最大使用内存做了限制。限制为5G.(之前限制为10G,方法请百度,特别简单),但是小编要告诉大家的是,这样是解决不了问题的
查看问题是否解决
答案是没有,问题依旧,而且更严重了。全是请求500,2个小时过去了都是500,有这个数据库还不如没有这个数据库。当时就有人支招了,到数据库吧,换个数据库,可能服务器有问题了,但是老铁,服务器卡成这样怎么到数据库呀,动都没法动,而且,还不一定能解决问题
引发的其他问题
- 接收端服务无故报错,连接不上数据库
- 共用数据库的另一个平台的web无故也不显示数据了
- 接收端日志里面出现大量的未入库数据
- navicat远程连接数据库已经连接不上
恢复sql_server当初的内存限制及原因分析
恢复了之前的sql_server10G的内存限制,数据库可以正常连接了,未入库数据也在逐渐的减少,其他平台都也恢复了
看来不是说sql_server占用的内存大了,才导致的问题的发生,而是给sql_server的内存太少了,导致sql_server“忙不过来”
问题解决,web界面打开贼流,实时数据显示可以说是毫秒级
第一、加大sql_server内存限制,提高到了12G,服务器总共才16G
第二、增加了4G的虚拟内存,数据库服务器操作也流畅了起来
第三、由于网站查询操作较多,写入的操作较少,给查询最小内存增加到了2G
第四、提交工单,购买内存条
结语
简单的介绍一下sql_server这个数据库,这个数据库是一直在不断的吃内存的,而且是只吃不吐的那种,时间越长吃的越多,最后lock所有内存,所以有了内存限制这一说,当时自己的想法就是把服务器的内存降下来,服务器流畅了,那数据库也应该就好了,但是这样的想法是错的,为什么呢,sql_server在没有足够的内存工作的时候,他就会放弃工作,没错,你没有听错,如果你不行的话,你可以把内存限制小一点,你会发现sql_server这个服务都不起来,这个也就是自己每想到的地方,还有就是sql_server限制的内存不是sql_server占用的总内存,sql_server在服务器里面占用的内存要比你设置的内存现在要高一点,但不会高太多。
有什么不懂得,我们一起交流把