我注意到当调用下面给出的简单代码时
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
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
我的疑问是
epoll_wait
系统调用。当 epoll_wait
系统调用不存在时,Glibc 将根据 epoll_wait
实现
epoll_pwait
函数。这与Linux内核中的这条注释一致:作为基本原则,功能不重复 应添加,例如当 llseek 时我们不使用 lseek 存在。新的架构应该使用这个文件 并在用户空间中实现功能较少的调用。
在 ARM64 上,mu,因为没有
epoll_wait
。在 x86_64 上,epoll_pwait
比 epoll_wait
做的工作稍微多一些,正如您可以在 Linux 内核中的定义中看到 ,但我怀疑它是否重要。
epoll_pwait
,然后自己编译它,但我认为这样做没有任何好处。