首页 > 解决方案 > web3 sendTransaction 在 ubuntu 上导致高 cpu 负载,而不是在 windows 上

问题描述

我有这个函数,我在一分钟左右调用一次(我让它更具可读性):

async function mySend() {   

    let httpOptions = {
      keepAlive: false,    
      timeout: 40000, // ms
    }
    
    let web3T1 = await new Web3(new Web3HttpProvider(myHttpUrl, httpOptions))

    try {

      let confirmedOrReverted = false  

      web3T1.eth.sendTransaction(txData)
                .once('transactionHash', function(hash){logger.info(`recieved transaction hash: ${hash}`)})  
                .once('receipt', function(receipt){
                    logger.info(`Tx receipt => ${receipt.status === true? 'success' : 'failed'}!`)                                                                                 
                    confirmedOrReverted = true
                })      
                .once('confirmation', async function(confirmationNumber, receipt){ 
                    logger.info(`recieved confirmation #${confirmationNumber}`); 
                })
                .once('error', async function(error){ 
                    if (error.message.includes('Transaction has been reverted by the EVM')) {
                      logger.info(`Transaction has been reverted by the EVM.`) 
                    } else {
                      logger.error(`TX exception: ${error.message} `)   
                    }          
                    confirmedOrReverted = true 
                }) 
                              
      while (!confirmedOrReverted) { await sleep(100) }     
                            
    } catch(err) {
        logger.error(`error: ${err}`)
    } 
    
    if (web3T1 != null) {
        //https://stackoverflow.com/questions/50632114/web3-websocket-connection-prevents-node-process-from-exiting        
        web3T1 = null
        logger.debug(`provider closed.`)
    }
}

在 Windows 10 上,这可以完美运行。

在 Ubuntu 20.x(2 个不同的安装,不同的 nodejs 版本)上半小时左右后,我看到我的 nodejs 进程的 CPU 峰值高达 100%。我必须终止进程。

与 Windows 的唯一区别:我在 ubuntu 机器上使用 pm2 来启动进程。

我将所有内容都归结为 web3.eth.sendTransaction 部分。即使当我将 web3 对象设置为 null 时,nodejs 似乎也让一些东西保持活动状态,不断进行轮询。我分析了应用程序,我唯一看到的是 C++ epoll_pwait 占用了 87% 的 CPU 时间。我猜这是正常的,因为我在函数调用之间等待?

无论如何,任何提示都值得赞赏。也许我没有很好地处理 sendTransaction 调用,Windows 也不在乎?

编辑:在 Windows 上,我不时记录此异常:

TX 异常:无法检查交易收据:{}

我没有在 Ubuntu 上看到这一行。这可能是罪魁祸首吗?不知何故,Windows 上的事件发射器抛出了这个错误,但在 Ubuntu 上却没有,它一直在轮询?

EDIT2:使用 sockstat 我可以看到,当 CPU 使用率非常高时,我也有很多具有相同本地端口号的打开套接字:

袜子统计

但是,当 CPU 使用率下降时,此列表会在几秒钟后消失。

为什么同一个本地端口上有这么多连接?当我将连接对象设置为空时,这怎么可能?似乎服务器保持了 ESTABLISHED 连接,并且内部 unix 也这样做了,而不是破坏套接字并关闭连接。我怎样才能防止这种情况?

标签: web3web3js

解决方案


推荐阅读