gpt4 book ai didi

amazon-ec2 - gettimeofday() 不使用 vDSO?

转载 作者:行者123 更新时间:2023-12-02 13:23:01 29 4
gpt4 key购买 nike

我跟踪了一个 java 进程,该进程触发了大量内核时间来查看正在使用哪些系统调用,并且惊讶地发现 gettimeofday()clock_gettime()占主导地位(我怀疑这是由于日志记录),考虑到 man vdso ,这很奇怪状态:

使用strace(1) 跟踪系统调用时,vDSO 导出的符号(系统调用)不会出现在跟踪输出中。

为什么会发生这些系统调用?有办法避免它们吗?

该计算机正在 EC2 上运行 Ubuntu 16.04.1。

为了让事情变得更简单,我用 C 创建了一个最小的测试程序 ( testgtod.c ):

#include <stdlib.h>
#include <sys/time.h>

void main(void)
{
struct timeval tv;
for(int i = 0; i < 1000; i++) {
/* glibc wrapped, shouldn't actually syscall */
gettimeofday(&tv, NULL);
}
}

然后我在 strace 下编译并运行该程序:gcc testgtod.c -o testgtod && sudo strace ./testgtod

与我的预期不同,输出包括一千次对 gettimeofday() 的调用。

我测试过的东西以确保我没有看到东西:

  1. 使用 file 确保二进制文件是 64 位 elf

  2. ldd ./testgtod确保 vDSO 处于事件状态:

    linux-vdso.so.1 => (0x00007ffcee25d000)libc.so.6 =>/lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f6e161000)/lib64/ld-linux-x86-64.so.2 (0x0000559ed71f3000)

  3. getauxval(AT_SYSINFO_EHDR) != NULL

  4. 已替换gettimeofday(&tv, NULL)调用 syscall(SYS_gettimeofday, &tv, NULL) ,调用数量增加到 1000 万,运行在 time 之下。 - 两种情况下的运行时行为相同:./testgtod 0.16s user 0.83s system 99% cpu 0.998 total .

最佳答案

该问题与 Xen 上运行的虚拟机有关,具体来说,Xen 时钟源尚不允许 vDSO 访问时钟:

ubuntu@machine:~% cat /sys/devices/system/clocksource/*/current_clocksource
xen

然后,我将时钟源更改为 tsc :

ubuntu@machine:~% sudo sh -c "echo tsc >/sys/devices/system/clocksource/clocksource0/current_clocksource"

注意:不建议移至 tsc生产机器上的时钟源,因为它可能会导致时钟向后漂移。

参见https://blog.packagecloud.io/eng/2017/03/08/system-calls-are-much-slower-on-ec2/有关 vDSO 和时钟源之间交互的详细文章。

注2:看起来tsc Xen 中的支持在版本 4.0 中得到了改进,并且 Sandy Bridge+ 平台中的 CPU 支持得到了改进。现代 EC2 机器应该可以使用 tsc 。使用 dmesg | grep "Xen version" 检查 Xen 版本。亚马逊推荐tsc时钟源已在 re:Invent 2015 中 ( https://www.slideshare.net/AmazonWebServices/cmp402-amazon-ec2-instances-deep-dive )。我还没有将其投入生产,但情况似乎并不像 packagecloud 所暗示的那么糟糕。

补充阅读:
Why rdtsc interacts poorly with VMs
Xen's 4.0 rdtsc changes
Linux kernel timekeeping documentation, discussing the pitfalls of the TSC

关于amazon-ec2 - gettimeofday() 不使用 vDSO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42622427/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com