【发布时间】:2011-08-09 15:17:47
【问题描述】:
我正在使用System V Shared Memory 在我的两个 PHP 应用程序之间进行通信。一个应用程序是只写的 (Writer),另一个是只读的 (Reader) 在单个 Shared Memory Segment 上(数据大约是 900-1000 bytes)。
两个应用程序都使用1μs 睡眠的无限循环运行,以防止 100% 的 CPU 使用(请参阅下面的代码示例)
while(true) {
shm_get_var($shm, 1);
usleep(1);
}
Reader需要~1ms从Shared Memory Segment获取Writer写入的数据。有趣的是,如果我仅从 Writer 中删除 usleep,Reader 会在 500μs 附近获取其数据。如果我只从阅读器中删除usleep,阅读器会在200μs 附近获取其数据。删除usleep 的问题是100% 的核心使用率。
我尝试将每个应用程序分配给同一个核心(使用taskset),两个应用程序在同一个核心上使用usleep,阅读器在300-400μs附近获取数据(有时在900μs附近达到峰值) .如果我从阅读器中删除 usleep 并且两个应用程序都在同一个核心上,阅读器将不会更快地获取其数据,大约是 300-390μs。
半毫秒对某些人来说可能听起来很荒谬,但速度是我的应用程序中最重要的事情,对我来说意义重大。
如果有人可以帮助我理解为什么我在上面的示例之间会有如此大的差异,那就太好了。任何关于更快执行此操作的想法将不胜感激。
规格
- 内存: 12GB DDR3 (6x2GB) 以 1066 MHz 运行
- CPU: 双 Intel Xeon E5620 @ 2.40GHz(四核,超线程关闭)
更新
#1我尝试使用time_nanosleep 将睡眠时间减少到纳秒而不是微秒,而阅读器仍在使用~1ms。
#2 我在 Python 中也有同样的问题,只是它需要 ~1-2ms 而不是像 PHP 中的 ~1ms。我尝试使用ctypes module 和clock_nanosleep,我能够降低到大约~300μs,这还不错,但我正在寻找更快的东西。
【问题讨论】:
标签: optimization ipc shared-memory latency