【发布时间】:2013-05-29 03:07:19
【问题描述】:
我遇到了 select() 的延迟问题。 其实我不确定这是否是 select() 的问题。
故事如下。
- 我正在使用 select() 来检测套接字 fd 事件。
- select() 唤醒后,我执行 recv() 从套接字缓冲区获取数据流。
- 这个没问题,效果很好。
但是...存在延迟问题... 我有 NIC tcpdump 时间戳,应用程序的 select() 唤醒时间戳。 这些时间戳有很大的不同,超过“15us”。
在我的应用程序中没有大逻辑,只需在 select() 唤醒后立即执行 select() socket fd 并使用 gettimeofday() 函数获取时间戳。 我不知道,为什么唤醒 select() 需要这么长时间。
我进行了测试以确保 select() 是否是问题所在。 1.没有选择,只是循环到recv()套接字fd,直到我得到第一个数据。 2.网卡得到一个数据流,我得到tcpdump timestmap 3. recv() 获取第一个数据流。 4. 我在第一次 recv() 成功后得到时间戳。
这个测试表明 NIC 时间戳和 recv() 第一个时间戳之间存在很大差异。
总结... 网卡获取数据流后。 1. select() 检测到socket fd,我认为它占用了15us。 2. 没有 select() 检测到套接字 fd,只有 recv() 循环直到我得到第一个数据, 它也需要超过 15us。
请有人帮助我...这个数字可以接受吗? (我的意思是超过15us。)或者有一个我不知道的检查点??
服务器 HP,操作系统 redhat 6.2 内核 2.6
【问题讨论】:
-
没有人说你的进程或你的线程会被立即安排。还有其他进程、其他线程、其他优先级、时间片……除非您在实时操作系统中运行,否则您无法期望实时响应。
标签: linux select latency tcpdump recv