web3 - 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 也这样做了,而不是破坏套接字并关闭连接。我怎样才能防止这种情况?
解决方案
推荐阅读
- c# - Selenium WebDriverWait 抛出异常
- php - IONIC 4- 如何在 ng-model 中使用 MySQL 和 PHP 中的文件
- javascript - 从 Spring 控制器返回正确的响应,但控制转到 Ajax 错误 406:不可接受
- python - Python过滤音频
- java - 广播接收器或接口在 2 个活动之间进行通信?
- javascript - ES6 函数绑定未定义(this.state 捕获值)
- c - 旋转函数,使用 C 中的递归,将数组和整数作为输入
- c# - dotnet run --project 问题与 https
- javascript - 通过javascript使用多个H1标题
- java - 字符串第二个值数组的 String.Split() 未保存到新变量