web网站打开反应慢无法显示实时数据的排查与解决

这个问题已经有几年了,这个web也是在17年搭建的,运行了有3年了,平台主要是对废水排放进行监测的。客户那边老是反应说平台反应慢,平台可以正常的打开,但是里面的实时数据有时候要等半个小时才能反应过来。
小编也是新换的岗位,上班才几个月就遇见了这个好几年存在的问题了,但是小编相信技能将会战胜一切,最后成功的将他拿下,解决了问题

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_数据库



废话少说,不服就干

先看问题现象

第一、打开web界面,展示实时数据较慢或者不展示

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_windows service_02

第二,重启一下平台接收端就恢复一会,过一会问题还会复现
接收端:就是接收上传过来的数据,并负责写进数据库里面

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_网络优化_03

第四,查看状态为500的,到底是卡在了什么地方

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_web_04

好吧,小编承认,这个没怎么看懂,但是里面有个send的字符,这个凭多年的经验,40%是和数据库要挂边了

找实时数据反应慢的原因

查看平台到后端取提取数据所花费的时间

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_数据库_05

可以很清楚的看见是30秒请求没成功,就进行下一次请求,一般平台都有这个api机制的,超过30秒没请求下来就重新发送请求
现在已经是60%与数据库有关系了

长时间观察这个请求的情况

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_windows service_06

发现规律了吧,就是平均每4到5分钟才能请求到一次数据,这个也就是客户所说的,半个小时才能显示实时数据,现在已经是70%与数据库相关了

查看数据库,状况

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_网络优化_07

通过上面可以看到,数据库服务器的内存使用率已经达到了81%l了,而且数据库服务器操作还非常的卡,基本上80%可以断定与数据库有关系了

注意:到这里了,大家可能以为,既然服务器内存都已经达到了81%了,那就查看占用内存大的进程,并想法解决内存问题,恢复服务器稳定运行呢
如果大家这样想的话,那就与小编当时的想法是一样的,第一,让服务器内存降下来,确保服务器操作起来不卡顿,第二,测试数据库,然后在对数据库进行一系列的优化。
但是,我想告诉大家的是,如果这样想的话,那就错了,而且会越来越糟

继续,查找占用内存较大的服务

运维实战之web网站打开反应慢无法显示实时数据的排查与解决(seq_server数据库之内存踩坑记,亲测)_sqlserver_08

一看就是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在服务器里面占用的内存要比你设置的内存现在要高一点,但不会高太多。
有什么不懂得,我们一起交流把