-1

我遇到了 select() 的延迟问题。实际上我不确定这是否是 select() 的问题。

故事如下。

  1. 我正在使用 select() 来检测套接字 fd 事件。
  2. select() 唤醒后,我执行 recv() 从套接字缓冲区获取数据流。
  3. 这没问题,而且效果很好。

但是...存在延迟问题...我有 NIC tcpdump 时间戳,应用程序的 select() 唤醒时间戳。这些时间戳有很大的不同,超过“15us”。

我的应用程序中没有大逻辑,只需在 select() 唤醒后立即执行 select() socket fd 并使用 gettimeofday() 函数获取时间戳。我不知道,为什么唤醒 select() 需要这么长时间。

我进行了测试以确保 select() 是否是问题所在。1.没有选择,只是循环到recv()套接字fd,直到我得到第一个数据。2. NIC 得到一个数据流,我得到 tcpdump 时间图 3. recv() 得到第一个数据流。4. 我在第一次 recv() 成功后得到时间戳。

该测试显示 NIC 时间戳和 recv() 第一个时间戳之间存在很大差异。

摘要... 网卡获取数据流后。1. select() 检测到socket fd,我认为它占用了15us。2.没有select()检测socket fd,只有recv()循环直到我得到第一个数据,它也需要15us。

请有人帮助我...这是可以接受的数字吗?(我的意思是超过15us。)或者有一个我不知道的检查点??

服务器 HP,操作系统 redhat 6.2 内核 2.6

4

1 回答 1

1

这是通用操作系统中的调度延迟。您唯一的选择可能是切换到实时操作系统。

于 2013-06-03T01:16:41.867 回答