2017年1月20日
今天算是一个令人激动的日子了,为什么这么说呢?唉,一把鼻涕一把泪啊~总算把服务器的一个巨大Bug给解决了!
事情的起源是这样的。由于我们公司里面是有两个服务器,一个是Web 服务器,一个是数据库服务器,由于之前的业务原因,需要将两个服务器合并到一起,所以就决定把数据库服务器关闭,将数据迁移到网站服务器,在一天晚上,一切都进行顺利。就这样过了差不多一周的时间后。我们系统的后台网站时不时会出现 如下问题:
无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,
请检查 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersAllowRemoteConnection 的值,确保服务器接受远程请求。
如果服务器位于本地计算机上,并且上面提到的注册表值不存在或者设置为 0,则状态服务器连接字符串必须使用“localhost”或“127.0.0.1”作为服务器名称。
我相信有很多人遇到过这样的问题,但是这样的问题对我来说很简单,只需要开启服务器的 ASP.NET 状态服务 就可以了,轻松解决。但是你知道有什么诡异的事情发生了吗,我检查服务器这一切都是正常的,但是还是有这样的问题出现,并且这个问题它不是一直出现,而是时不时的会出现这个问题,特别恼火,不管我怎么在网上查资料,怎么修改配置,一切都无济于事, why??? 以前这个问题都是很轻松解决的,为什么这次就不行了呢?这种问题也没有办法可以在本地调试的,所以问题肯定是处在服务器这边的,但是所有的配置都没有动过,为什么还是不行呢?我甚至想到了重启服务器,但是每次重启之后,过不了几个小时,又会出现这个问题,我就无语了,我不可能有问题就重启服务器啊,这肯定不行啊!我期间还怀疑是数据库迁移的问题,但是我想想这能有什么关系吗,也不可能啊,跟数据库肯定没关系的,还是另寻他路吧。
我还想到过更新服务器的补丁,但是更新过还是不行!怎么办啊!我都开始怀疑人生了,这个问题一直困扰我差不多三天了,期间还出现过服务器CPU达到100%,我去,这怎么办啊!后来,我发现用我们系统去下订单,出现了一个以前没有遇到的新问题,
1 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作......
看到这个问题,我顿时兴奋了,我明白了,肯定是这个问题导致的,并不是上一个ASP.NET 状态服务 的问题导致的,我感觉终于有救了。我开始上网找这个问题的解决方案,但是找到的方案让我心灰意冷,什么虚拟内存不够,什么磁盘空间问题,什么修改注册表的值,什么访问量太大,端口不够的问题等等,经过分析,我都觉得不会是这些问题导致的,我们访问量一天也不多,几百个就不错了,怎么可能是这些问题呢...感觉心里又失落了,唉怎么办,但是我知道一定是这个问题导致的,必须从这个问题入手才行,
所以我坚持继续根据这个问题查资料,根据我慢慢分析后,开始觉得应该是程序问题,有什么死循环,或者内存泄漏,连接没有释放的相关问题,我后来看到有一个资料说是,在任务管理器查看一下进程的句柄数,然后我去查看了一下,我发现出问题的那个网站的句柄数特别多,差不多和操作系统内核一样多了,接近2000个,然后内存暂用差不多高2个G,这十分的反常,我确定了就是这个系统的问题。
然后我重启了这个进程之后,我去网站正常下单操作,这次没有问题出现了。但是我观察发现这个进程的内存和句柄数量增长特别快,我想我不可能随时重新进程吧,还是要找到根本问题!之后我去网上查找句柄一直增长的原因,推测出可能程序中有资源一直在占用,然后未释放,端口一直增加,导致服务器问题。 最后我恍然大悟,我想起我们系统中会使用到 websocket, 并且我们服务器的websocket 服务端并没有开启, 奥~我知道了,就是这个原因,因为程序中的 websocket 一直找不到服务器,所以会一直连接,不断重连,不断开启端口,所以出现了以前描述的问题。
啊啊啊~终于明白了,然后我启动了服务器的websocket 服务端,问题就解决了!!!
为什么没有开启websocket 服务端呢,是因为之前程序有过改动,并不会在此服务器上使用 websocket了,但是代码中并没有取消 websocket 的请求的功能,所以现在还不能关闭websocket 服务端,后续慢慢再去改吧!!!
唉~心累啊!通过此次的经历,主要是记录下来,遇到这样无解问题的时候,需要怎样的思路去解决问题,以此为戒!