背景
程序打开的文件/socket连接数量超过系统设定值。
用到的命令
ulimit -a
查看每个用户最大允许打开文件数量
1 |
|
其中 open files (-n) 1024 表示每个用户最大允许打开的文件数量是1024
lsof -p pid | wc -l
某一进程的打开文件数量
lsof -p pid
某一进程的打开文件/socket
TCP 状态解释
对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤, 将会使连接处于假死状态,连接本身占用的资源不 会被释放。 网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。
排错时注意端口ip定位对应服务
程序问题
主要是client问题
grpc client
数据量一大rpc并发多之前写的时候没有注意,参照官网列子用的是rpc短连接
由于没有复用connection导致每次都有频繁读去证书文件出现
1 |
|
之前只是以为是证书的关系
1 |
|
然后就转为报 grpc transport: Error while dialing dial tcp 127.0.0.1:9101: socket: too many open files
看到有人说到这个才发现要复用connection,让connection创建多个client, 让程序初始化时先调用NewConn创建connection
1 |
|
http client
因为有较多grpc连接所以改好后,以为已经解决问题,运行一段时间后看下log,又有一大堆Create error open : xxxx : too many open files
因为是上传文件的rpc接口,看报错以为是打开了文件没有关,然后打log发现文件确实关了。这就奇怪了。通过lsof -p pid
发现报错的时候出现大量TCP连接
最终发现该接口还会去调另一个HTTP api,然后http client是需要close的
1 |
|
改成
1 |
|