【问题标题】:gettimeofday() not using vDSO?gettimeofday() 不使用 vDSO?
【发布时间】:2017-03-06 09:53:39
【问题描述】:

我发现了一个触发大量内核时间的 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 &amp;&amp; sudo strace ./testgtod

出乎我的意料,输出包括对 gettimeofday() 的一千次调用。

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

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

  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(&amp;tv, NULL) 调用替换为 syscall(SYS_gettimeofday, &amp;tv, NULL),调用数量增加到 1000 万,运行在 time 之下 - 两种情况下的运行时行为相同:./testgtod 0.16s user 0.83s system 99% cpu 0.998 total

【问题讨论】:

    标签: amazon-ec2 linux-kernel vdso


    【解决方案1】:

    问题与这是在 Xen 上运行的 VM 有关,具体来说,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:Xen 中的tsc 支持似乎在 4.0 版和 Sandy Bridge+ 平台中的 CPU 支持方面有所改进。现代 EC2 机器应该可以使用 tsc。使用dmesg | grep "Xen version" 检查 Xen 版本。 Amazon 在 re:Invent 2015 (https://www.slideshare.net/AmazonWebServices/cmp402-amazon-ec2-instances-deep-dive) 中推荐了 tsc 时钟源。我还没有投入生产,但情况似乎没有 packagecloud 暗示的那么糟糕。

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

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2022-07-19
      • 2016-11-01
      • 2013-11-25
      相关资源
      最近更新 更多