nodejs什么时候使用epoll_pwait以及什么时候使用epoll_wait

问题描述 投票:0回答:1

我注意到当调用下面给出的简单代码时

strace node -e 'setTimeout(()=>{console.log("hola")},10000)'

在带有节点 v18.12.1 的 Arm 实例(graviton c7g.2xlarge 和 Ubuntu 20.04.3 LTS)上,它使用 epoll_pwait 来等待

user@laptop:~$ strace -e epoll_pwait,epoll_wait -c node -e 'setTimeout(()=>{console.log("hola")},10000)' 
hola
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0        10           epoll_pwait
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    10           total


而在 AMD c6a.2xlarge 和 Ubuntu 20.04.5 LTS 上,节点 v18.12.1 相同的命令使用 epoll_wait 等待

user@laptop:~$ strace -e epoll_pwait,epoll_wait -c node -e 'setTimeout(()=>{console.log("hola")},10000)' 
hola
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000012           1        10           epoll_wait
------ ----------- ----------- --------- --------- ----------------
100.00    0.000012                    10           total

我的疑问是

  1. 为什么arm上的nodejs使用epoll_pwait vs x86架构上的epoll_wait
  2. 使用 epoll_pwait 之间是否有任何性能影响 和 epoll_wait
  3. 可以使用某些配置使这种行为统一,还是我在分析中遗漏了一些东西。
node.js system-calls epoll
1个回答
0
投票
  1. Linux 在 ARM64 上没有
    epoll_wait
    系统调用。当
    epoll_wait
    系统调用不存在时,Glibc 将根据
    epoll_wait
     实现 
    epoll_pwait
    函数。这与Linux内核中的这条注释一致:

作为基本原则,功能不重复 应添加,例如当 llseek 时我们不使用 lseek 存在。新的架构应该使用这个文件 并在用户空间中实现功能较少的调用。

  1. 在 ARM64 上,mu,因为没有

    epoll_wait
    。在 x86_64 上,
    epoll_pwait
    epoll_wait
    做的工作稍微多一些,正如您可以在 Linux 内核中的定义中看到 ,但我怀疑它是否重要。

  2. 如果你真的想要,你可以修改nodejs的源代码以在任何地方使用

    epoll_pwait

    ,然后自己编译它,但我认为这样做没有任何好处。

© www.soinside.com 2019 - 2024. All rights reserved.