今天在服務(wù)器巡檢的時(shí)候,發(fā)現(xiàn)一個(gè)服務(wù)大量拋出異常
異常信息為:
LockStatusPushError&&Message:One or more errors occurred. (An error occurred while sending the request. Too many open files)&InnerMessageAn error occurred while sending the request. Too many open files& at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)at System.Threading.Tasks.Task.Wait()at CommonHelper.HttpHelper.HttpRequest(String Url, String Method, String ContentType, Byte[] data, Encoding encoding)at CommonHelper.HttpHelper.PostForm(String Url, Dictionary`2 para, Encoding encoding)at CommonHelper.HttpHelper.PostForm(String Url, Dictionary`2 para)at DeviceService.Program.LockStatusPushMethod()
首先推斷,是程序打開文件(端口或者管道)太多導(dǎo)致的超過系統(tǒng)最大限制
使用 ulimit -n 查看最大限制 發(fā)現(xiàn) 系統(tǒng)最大限制為65535 為正常值
使用 lsof | wc -l 查看當(dāng)前打開文件數(shù) 發(fā)現(xiàn)執(zhí)行非常緩慢,執(zhí)行結(jié)果顯示系統(tǒng)當(dāng)前打開文件數(shù)500w++。。。。。
繼而查看dotnet程序打開文件數(shù),發(fā)現(xiàn)為400w++
lsof>>/tmp/lsof.log 把當(dāng)前打開文件列表保存 以供問題判斷。
文件導(dǎo)出后,發(fā)現(xiàn) dotnet 程序有大量狀態(tài)為 CLOSE_WAIT 的socket連接 目的地址為程序訪問的HTTP服務(wù)器的80端口