更新 1

更新 1

当我们使用程序访问 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 

问题:

  1. 为什么 geth 进程突然能够使用远远超过其软限制和硬限制的内容(无论如何,根据 lsof,proc limits 显示“正确”的值,但它仍然中断)

  2. 有什么想法可以解决这种情况(即阻止 geth 因打开过多文件错误而失败)?

GETH 版本 = 1.8.10-statble

更新 1

我刚刚尝试将限制设置为 32000 (LimitNofile=32000)。它仍然失败,cat /proc/sys/fs/file-nr 仍然给出 2200 左右的数字,lsof 仍然给出 28,000 左右的数字。

相关内容