2016-12-02 186 views
0

我的应用程序等待更长的时间,然后我在超时规定:epoll_wait块超时在<code>epoll_wait</code>

22578 09:33:46.959791 epoll_wait(5, <unfinished ...> 
22578 09:33:50.010794 <... epoll_wait resumed> [], 128, 1498) = 0 
... 
22034 09:35:07.686896 epoll_wait(5, <unfinished ...> 
22034 09:35:09.482526 <... epoll_wait resumed> [{EPOLLIN, {u32=151458248, u64=151458248}}], 128, 362) = 1 
... 
22036 09:35:41.433241 epoll_wait(5, <unfinished ...> 
22036 09:35:43.176881 <... epoll_wait resumed> [], 128, 97) = 0 

我请求超时值,但是时机表明,它等待的时间间隔更长的时间。

从日志的时间是可靠的 - 我是从strace输出。 我能做些什么,使超时在epoll更细粒度的? 为什么epoll_wait如此多的不正确呢?

回答

1

documentation说:

注意,超时间隔将被舍入到系统时钟 粒度,和内核调度延迟意味着阻断 间隔可以由少量溢出。

换言之,超时是一个最小值。

但是,当设备处于闲置状态这么大的延迟不会发生。 如果您有实时限制,请确保您的代码可以真正运行,即设置适当的调度策略,防止它被换出等。

+0

我在其他线程中跳过了很多中间处理处理。从其他线程的处理中,我得出结论,我不处于资源匮乏的状态。你能给出更具体的想法如何进一步调查?我唯一的想法是调查调度程序的操作。从执行记录开始并... ...? – user1641854

+0

尝试在单独的线程中运行的1毫秒定时器(用'epoll_wait',或timerfd),并检查其抖动。 –

+0

我能够稳定地重现问题,实际上根本原因是调度程序。 – user1641854