gpt4 book ai didi

Linux clock_gettime()过去的尖峰?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:04 24 4
gpt4 key购买 nike

我尝试在 Linux 上获取高分辨率时间戳。使用 clock_gettime(),如下所示,我得到了几乎 26 微秒过去时看起来非常可怕的“尖峰”过去。大多数“dt”都在 30 ns 左右。我在 linux 2.6.32,Red Hat 4.4.6 上。 'lscpu' 显示 CPU MHz=2666.121。我认为这意味着每个时钟滴答需要大约 2 ns。因此,在这里要求 ns 分辨率并不显得太不合理。

程序的输出(很抱歉,没有将其列为列表无法发布它。它认为它是某种代码)

  • 1397534268,40823395 1397534268,40827950,dt=4555
  • 1397534268,41233555 1397534268,41236716,dt=3161
  • 1397534268,41389902 1397534268,41392922,dt=3020
  • 1397534268,46488430 1397534268,46491674,dt=3244
  • 1397534268,46531297 1397534268,46534279,dt=2982
  • 1397534268,46823368 1397534268,46849336,dt=25968
  • 1397534268,46915657 1397534268,46918663,dt=3006
  • 1397534268,51488643 1397534268,51491791,dt=3148
  • 1397534268,51530490 1397534268,51533496,dt=3006
  • 1397534268,51823307 1397534268,51826904,dt=3597
  • 1397534268,55823359 1397534268,55827826,dt=4467
  • 1397534268,60531184 1397534268,60534183,dt=2999
  • 1397534268,60823381 1397534268,60844866,dt=21485
  • 1397534268,60913003 1397534268,60915998,dt=2995
  • 1397534268,65823269 1397534268,65827742,dt=4473
  • 1397534268,70823376 1397534268,70835280,dt=11904
  • 1397534268,75823489 1397534268,75828872,dt=5383
  • 1397534268,80823503 1397534268,80859500,dt=35997
  • 1397534268,86823381 1397534268,86831907,dt=8526

有什么想法吗?谢谢

#include <vector>
#include <iostream>
#include <time.h>
long long elapse( const timespec& t1, const timespec& t2 )
{
return ( t2.tv_sec * 1000000000L + t2.tv_nsec ) -
t1.tv_sec * 1000000000L + t1.tv_nsec );

}
int main()
{
const unsigned n=30000;
timespec ts;
std::vector<timespec> t( n );
for( unsigned i=0; i < n; ++i )
{
clock_gettime( CLOCK_REALTIME, &ts );
t[i] = ts;
}
std::vector<long> dt( n );
for( unsigned i=1; i < n; ++i )
{
dt[i] = elapse( t[i-1], t[i] );
if( dt[i] > 1000 )
{
std::cerr <<
t[i-1].tv_sec << ","
<< t[i-1].tv_nsec << " "
<< t[i].tv_sec << ","
<< t[i].tv_nsec
<< ",dt=" << dt[i] << std::endl;
}
else
{
//normally I get dt[i] = approx 30-35 nano secs
}
}
return 0;
}

最佳答案

您引用的数字在 3 到 30 微秒范围内(3,000 到 30,000 纳秒)。这是太短的时间,无法将上下文切换到另一个线程/进程,让另一个线程运行,然后将上下文切换回您的线程。很可能您的进程运行的核心被内核用于服务外部中断(例如网卡、磁盘、定时器),然后返回运行您的进程。

您可以使用此命令查看 linux 中断计数器(每个 CPU 内核和每个源)

watch -d -n 0.2 cat /proc/interrupts

-n 0.2 将导致命令以 5Hz 发出,-d 标志将突出显示已更改的内容。

中断源也可能是 TLB 击落,这会导致 IPI (Inter-Processor Interrupt)。您可以阅读更多关于 TLB shootdowns here 的信息.

如果你想减少运行你的线程/进程的核心服务的中断数量,你需要设置中断关联。您可以了解有关 Red Hat 中断和 IRQ(中断请求)调整的更多信息 here , 和 here .

值得注意的是,您正在使用不能保证“平滑”的CLOCK_REALTIME,它可能会跳来跳去,因为系统时钟是"disciplined"。通过 NTP(网络时间协议(protocol))或 PTP(精确时间协议(protocol))等服务保持准确时间。为了您的目的,最好使用 CLOCK_MONOTONIC,您可以阅读更多关于差异的信息 here .当一个时钟被“训练”时,它可以跳“步”——这是不寻常的,当然不是你看到的许多尖峰的原因。

关于Linux clock_gettime()过去的尖峰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23074931/

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