服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...
一個(gè) asp.net core 站點(diǎn),之前運(yùn)行在Linux 服務(wù)器上,運(yùn)行一段時(shí)間后有時(shí)站點(diǎn)會(huì)掛掉,在日志中記錄很多“EMFILE too many open files”的錯(cuò)誤:
Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMFILE too many open files
后來(lái)將這個(gè) asp.net 站點(diǎn)部署到 Windows 服務(wù)器的 IIS 上。運(yùn)行一段時(shí)間后,發(fā)現(xiàn)其中一臺(tái)服務(wù)器出現(xiàn)503錯(cuò)誤,登上服務(wù)器一看,該站點(diǎn)的進(jìn)程占用的內(nèi)存竟然有1.2G,而同一負(fù)載均衡中另外一臺(tái)正常的服務(wù)器內(nèi)存占用只有40多M。然后看了一下進(jìn)程中的線程數(shù),驚呆了——竟然有8000多個(gè)線程!而另外一臺(tái)正常的服務(wù)器只有20多個(gè)線程。
將這臺(tái)服務(wù)器從負(fù)載均衡上摘下來(lái)之后,出現(xiàn)了更加讓人驚呆的現(xiàn)象——在沒有請(qǐng)求的情況下,這個(gè) asp.net core 站點(diǎn)進(jìn)程的內(nèi)存占用與線程數(shù)一直在增長(zhǎng)。就像在代碼中寫了一個(gè)死循環(huán),在循環(huán)中不停地創(chuàng)建線程。
再后來(lái)內(nèi)存增長(zhǎng)到1.8G左右,線程數(shù)增長(zhǎng)到1.3萬(wàn)左右,而且還在持續(xù)增長(zhǎng)。
不僅內(nèi)存與線程數(shù)在增長(zhǎng),而且CPU也一直在波動(dòng),這可是在沒有任何請(qǐng)求的情況下,誰(shuí)在偷偷地干活?
強(qiáng)制結(jié)束進(jìn)程后恢復(fù)正常,但運(yùn)行一段時(shí)間(通常是1天時(shí)間)后又會(huì)出現(xiàn)同樣的問(wèn)題。非常奇怪!
從目前分析的情況看,罪魁禍?zhǔn)卓赡苁?EnyimMemcachedCore?(支持.net core的memcached客戶端,是我們從 EnyimMemcached 移植過(guò)來(lái)的),EnyimMemcachedCore 用到了 Socket 池,問(wèn)題可能出在 Socket 池部分,源代碼在 github 上(EnyimMemcachedCore源代碼)。
windbg分析進(jìn)程dump文件顯示的線程情況:
0:000> .load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.0.1\sos.dll
0:000> !threads
ThreadCount: 8014
UnstartedThread: 0
BackgroundThread: 8013
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
發(fā)現(xiàn)大量線程中存在?coreclr!Thread::DoAppropriateWaitWorker 這個(gè)操作:
!uniqstack
# Child-SP RetAddr Call Site
00 00000056`ed5ad118 00007ffa`080e13ed ntdll!NtWaitForMultipleObjects+0xa
01 00000056`ed5ad120 00007ff9`f1dc885e KERNELBASE!WaitForMultipleObjectsEx+0xed
02 00000056`ed5ad400 00007ff9`f1dc8a0d coreclr!Thread::DoAppropriateWaitWorker+0xfe
03 00000056`ed5ad4b0 00007ff9`f1dca52f coreclr!Thread::DoAppropriateWait+0x7d
04 00000056`ed5ad530 00007ff9`f1e3b726 coreclr!CLREventBase::WaitEx+0x7f
05 00000056`ed5ad580 00007ff9`f1e3b636 coreclr!AwareLock::EnterEpilogHelper+0xca
06 00000056`ed5ad640 00007ff9`f1f92b18 coreclr!AwareLock::EnterEpilog+0x62
07 00000056`ed5ad6a0 00007ff9`f1f92131 coreclr!AwareLock::Contention+0x258
08 00000056`ed5ad760 00007ff9`92388e2b coreclr!JITutil_MonContention+0xb1
該問(wèn)題還在進(jìn)一步排查中。。。
原文:http://www.cnblogs.com/dudu/p/6127374.html
總結(jié)
以上是生活随笔為你收集整理的服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ftp服务器客户端修改密码,如何在客户端
- 下一篇: 服务器硬盘如何验收,系列服务器及存储测试