我正在创建用于在CentOS 7中测量单个消息处理时间的性能框架工具。我使用 isolcpus 内核选项为此任务预留了一个CPU,并使用 taskset 。
好的,现在问题了。我试图测量几个消息中的最大处理时间。处理时间<= 1000ns,但是当我运行多次迭代时,我得到非常高的结果(> 10000ns)。
在这里,我创建了一些简单的代码,它没有任何有趣的功能但显示了问题。根据迭代次数,我可以得到如下结果:
max: 84 min: 23 -> for 1000 iterations
max: 68540 min: 11 -> for 100000000 iterations
我试图了解这种差异来自哪里?我尝试使用具有最高优先级的实时调度来运行此操作。有没有办法防止这种情况?
#include <iostream>
#include <limits>
#include <time.h>
const unsigned long long SEC = 1000L*1000L*1000L;
inline int64_t time_difference( const timespec &start,
const timespec &stop ) {
return ( (stop.tv_sec * SEC - start.tv_sec * SEC) +
(stop.tv_nsec - start.tv_nsec));
}
int main()
{
timespec start, stop;
int64_t max = 0, min = std::numeric_limits<int64_t>::max();
for(int i = 0; i < 100000000; ++i){
clock_gettime(CLOCK_REALTIME, &start);
clock_gettime(CLOCK_REALTIME, &stop);
int64_t time = time_difference(start, stop);
max = std::max(max, time);
min = std::min(min, time);
}
std::cout << "max: " << max << " min: " << min << std::endl;
}
答案 0 :(得分:2)
即使使用isolcpus
,您也无法将抖动降低到零,因为您仍然至少拥有以下内容:
1)中断传送到你的CPU(你可能能够减少我对irq affinity的麻烦 - 但可能不会为零。)
2)仍然为您的进程安排时钟计时器中断,并且可能在内核端执行可变数量的工作。
3)CPU本身可能暂时暂停P状态或C状态转换,或其他原因(例如,在打开AVX电路后让电压电平稳定等)。
答案 1 :(得分:1)
让我们查看文档......
隔离将对用户空间进程产生影响 - 内核线程仍可能在isolcpus隔离的CPU上进行调度。
所以似乎不能保证完全隔离,至少不是来自内核。