写入管道时出现大的非确定性延迟

时间:2016-09-28 11:23:15

标签: c++ linux pipe

当我try catch到linux下的开放式FIFO管道时,我遇到间歇性延迟,但只在两台机器中的一台上。

以下程序证明了这一点:

write

程序以10Hz的频率向管道写入200个字节,在1秒的窗口中输出写入的最小/平均/最大时间。在启动程序之前,在另一个终端中我运行#include <iostream> #include <unistd.h> #include <fcntl.h> #include <time.h> #include <stdlib.h> #include <stdint.h> uint64_t get_us() { timespec time; int ret; ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time ); if (ret!=0) { std::cerr << "Oh no, clock problem!\n"; exit(1); } return time.tv_sec * 1000000 + time.tv_nsec/1000; } int main() { const time_t delay = 100000; char test[200]; size_t len = 200; uint64_t prev_us, us, delta; int pipe_fd; uint64_t delta_sum=0; uint64_t min = 1000000; uint64_t max = 0; uint32_t count=0; std::cout << "Opening pipe....\n"; pipe_fd = open("/tmp/tmp_pipe", O_WRONLY); std::cout << "Writing to pipe every " << delay << "uS.\n"; prev_us = get_us(); while (true) { write(pipe_fd, test, len); us = get_us(); delta = us - prev_us; delta_sum+=delta; count+=1; if (delta < min) min=delta; if (delta > max) max=delta; if (count==1000000/delay) { std::cout << " ~second stats: " << min << " : " << delta_sum/count << " : " << max << "\n"; delta_sum=0; count=0; min=1000000; max=0; } usleep(delay); prev_us = get_us(); } }

我希望时间有所不同,但偶尔我会看到呼叫需要大约100毫秒。我无法想象这样的延迟是由调度程序决定的,我只在两台计算机中的一台(英特尔,Linux 4.4.0)上看到这些峰值。

典型输出:

mkfifo /tmp/tmp_pipe; cat /tmp/tmp_pipe > /dev/null

这种行为是正常的吗?什么可能导致这种延迟?

0 个答案:

没有答案