一个 asp.net core 站点,之前运行在 linux 服务器上,运行一段时间后有时站点会挂掉,有一次的症状是 asp.net core站点在高并发下出现的“EMFILE too many open files”问题 。
昨天将该站点升级至 .net core 1.1(之前用的是 .net core 1.1 preview1)并部署到 windows 服务器的 IIS 上,在同一个负载均衡下部署了2台服务器。
今天早上发现其中一台服务器出现503错误,登上服务器一看,该站点的进程内存占用竟然有1.2G,而同一负载均衡中另外一台正常的服务器内存占用只有40多M。然后看了一下进程中的线程数,惊呆了——竟然有8000多个线程!而另外一台正常的服务器只有20多个线程。
接着将这台服务器从负载均衡上摘下来,这时出现了更加让人惊呆的现象——在没有请求的情况下,这个 asp.net core 站点进程的内存占用与线程数一直在增长。就像在代码中写了一个死循环,在循环中不停地创建线程。
9:30左右是1.2G内存8000多个线程,到了11:09左右内存增长到1.8G,线程数增长到1.3万,而且还在持续增长。
不仅内存与线程数在增长,而且CPU也一直在波动,这可是在没有任何请求的情况下,谁在偷偷地干活?
从目前分析的情况看,罪魁祸首可能是 EnyimMemcachedCore (支持.net core的memcached客户端,是我们从 EnyimMemcached 移植过来的),EnyimMemcachedCore 用到了 Socket 池,问题可能出在 Socket 池部分,源代码在 github 上(EnyimMemcachedCore源代码)。
目前不知道从何处下手排查这个问题,很期待您的高见。