当我们使用程序访问 geth RPC api 来获取账户余额时,就会发生这种情况。
首先,当 geth 打开的文件数量达到 1024 个(软限制)时,它会失败。在服务文件中,此限制增加到 4096 个:
[Service]
LimitNOFILE=4096
ExecStart=/usr/bin/geth --syncmode "fast"
--cache=4096 --rpc --ws --wsorigins '*' --wsapi "web3,eth,net,rpc" --datadir "/mnt/eth_volume" 2>/var/log/geth.log Restart=on-failure
现在,当我看到 geth 有多少个打开的文件时,它高达 30k!这应该是不可能的。
# cat /proc/2833/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 128437 128437 processes
Max open files 4096 4096 files
Max locked memory 16777216 16777216 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 128437 128437 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
还:
# cat /proc/sys/fs/file-max
3280354
和
# lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
277664 2833
228 1076
148 946
129 1119
120 1088
117 948
114 1
94 1028
92 699
84 932
和
ps -ef | grep geth
root 2833 1 19 13:10 ? 00:02:44 /usr/bin/geth --syncmode fast --cache=4096 --rpc --ws --wsorigins * --wsapi web3,eth,net,rpc --datadir /mnt/eth_volume 2>/var/log/geth.log
和
# cat /proc/sys/fs/file-nr
2176 0 3280354
# cat /proc/2833/limits | grep files
Max open files 4096 4096 files
问题:
为什么 geth 进程突然能够使用远远超过其软限制和硬限制的内容(无论如何,根据 lsof,proc limits 显示“正确”的值,但它仍然中断)
有什么想法可以解决这种情况(即阻止 geth 因打开过多文件错误而失败)?
GETH 版本 = 1.8.10-statble
更新 1
我刚刚尝试将限制设置为 32000 (LimitNofile=32000)。它仍然失败,cat /proc/sys/fs/file-nr 仍然给出 2200 左右的数字,lsof 仍然给出 28,000 左右的数字。