当有大量文件句柄可用时,程序会用完文件句柄

时间:2017-10-28 21:47:39

标签: file ubuntu go consul

我有一个连接到其他服务(和当地的咨询代理)的golang程序,当与领事代理商交谈时,它失败并出现以下错误:

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这个consul代理,创建文件和一切,但golang程序继续失败。

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

2 个答案:

答案 0 :(得分:4)

  

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

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

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

答案 1 :(得分:0)

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