【问题标题】:select watches socket fd wakes up too slow选择手表套接字 fd 唤醒太慢
【发布时间】:2013-05-29 03:07:19
【问题描述】:

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

故事如下。

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

但是...存在延迟问题... 我有 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


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我了解,并且知道 select() 的响应时间不像迅雷那么快。我想知道为什么只是 select() 需要这么多时间。在这个服务器中,在我获得套接字流之后,我还有许多其他的业务逻辑,它们总共需要大约 20us 的平均时间。我期望的是平均 5us 下的 select() 响应时间。这可能是内核调整问题吗??
  • @user2313523:与select无关。这只是调度延迟。您可以通过关闭 CPU 电源管理来减少它。
  • 可能是线程上下文切换。调用 select 会使您的线程进入睡眠状态,并且它的寄存器和其他 CPU 相关状态会备份到内存中。一旦再次激活,即当您对 select 的调用即将结束时,因为有要读取的内容,调度程序需要执行所有操作,然后恢复您的寄存器和其他 CPU 状态。
  • 而且有很多线程,例如跨大量进程的 Linux 或 FreeBSD 系统,所有进程都在争夺 CPU 时间。处理您的线程必须在通常的争吵中再次变得活跃的原因是需要半个计算机周,在您的系统上 15us 甚至更多时间才能完成这项工作。
  • 在大多数情况下,真正低延迟是通过在极其缓慢和简单的机器上运行极其简单的实时操作系统和极其低级的代码来实现的,运行速度接近 20 MHz,但不涉及任何开销。有时,应用程序的延迟关键部分只是在这样的机器和操作系统上执行?
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2022-06-21
相关资源
最近更新 更多