2017-10-28 92 views
0

我有一个golang程序连接到其他服务(和本地consul代理程序),并且在与consul代理进行交谈时失败,出现以下错误:当有大量文件句柄可用时,执行程序用尽文件句柄

Put http://localhost:9501/v1/kv/health_checks/item: dial tcp: lookup localhost: too many open files 

这很好,我可以检查系统和程序有多少打开的文件,对不对?

ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 7871 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 16384 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 7871 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

而且lsof

lsof | wc -l 
5343 

这仍远低于限值。系统中的其他程序都很好,我可以使用CURL服务,我可以CURL这位总领事代理,创建文件和所有内容,但golang程序仍然失败。

关于如何调试的任何想法?我应该在哪里看?

+1

只是两个想法: 答)不清楚错误发生在哪一方(可能是golang客户端是责备,但服务器发生错误), B.我不排除错误发生的可能性错误处理和真正的问题可以远离文件句柄。 嗯。不是很乐观。 祝你好运! – Ingaz

回答

4

Any ideas on how I could debug this? Where should I be looking at?

在程序运行时发送一个SIGQUIT程序。这将回溯所有正在运行的程序。你可能会在那里找到你的罪魁祸首。

我的钱会忘记关闭()身体的http.Response,因为这是我最经常做的!

0

如果您连接到不同的端点/服务(即如果您正在运行爬网程序),请考虑closing空闲连接。