我有一个连接到其他服务(和当地的咨询代理)的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程序继续失败。
关于如何调试此问题的任何想法?我应该在哪里看?
答案 0 :(得分:4)
关于如何调试此问题的任何想法?我应该在哪里看?
在程序运行时发送程序SIGQUIT。这将使所有正在运行的例程回溯。你可能会在那里找到你的罪魁祸首。
我的钱会忘记关闭()http.Response的身体,因为这是我最常做的事情!
答案 1 :(得分:0)
如果要连接到不同的端点/服务(例如,如果您正在运行爬虫),请考虑closing空闲连接。