当我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
这种行为是正常的吗?什么可能导致这种延迟?