今天在服务器巡检的时候,发现一个服务大量抛出异常
异常信息为:
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()
首先推断,是程序打开文件(端口或者管道)太多导致的超过系统最大限制
使用 ulimit -n 查看最大限制 发现 系统最大限制为65535 为正常值
使用 lsof | wc -l 查看当前打开文件数 发现执行非常缓慢,执行结果显示系统当前打开文件数500w++。。。。。
继而查看dotnet程序打开文件数,发现为400w++
lsof>>/tmp/lsof.log 把当前打开文件列表保存 以供问题判断。
文件导出后,发现 dotnet 程序有大量状态为 CLOSE_WAIT 的socket连接 目的地址为程序访问的HTTP服务器的80端口
延伸阅读
学习是年轻人改变自己的最好方式