如何更快地访问System V共享内存?

时间:2011-08-09 15:17:47

标签: optimization ipc shared-memory latency

我正在使用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左右获取其数据。如果我仅从Reader中删除usleep,则Reader会在200μs左右获取其数据。删除usleep的问题是100%核心使用率。

我尝试将每个应用程序分配到同一个核心(使用taskset),同时使用usleep在同一个核心上使用300-400μs,阅读器在900μs左右获取数据usleep附近的峰值。如果我从Reader中删除了300-390μs并且两个应用程序都在同一个核心上,则读者将无法在~1ms附近更快地获取其数据。

对于某些人来说,半毫秒可能听起来很荒谬,但速度是我应用程序中最重要的事情,并对我产生了巨大的影响。

如果有人能帮助我理解为什么我在上面的例子之间会有很大的不同,那就太棒了。任何关于快速执行此操作的想法都将非常受欢迎。

功能

  • 内存: 12GB DDR3(6x2GB)以1066 MHz运行
  • CPU:双Intel Xeon E5620 @ 2.40GHz(四核,HyperThreading off)

更新

#1 我尝试使用time_nanosleep将睡眠时间减少到纳秒而不是微秒,而Reader仍在使用~1-2ms

#2 我在Python中遇到了同样的问题,除了在PHP中需要~1ms而不是ctypes module。我尝试使用clock_nanosleep~300μs并且我能够达到约{{1}}这不是太糟糕但我正在寻找更快的东西。

2 个答案:

答案 0 :(得分:1)

您应该尝试zeromq

答案 1 :(得分:0)

如果您的软件仅限于一个类UNIX操作系统,也可以使用POSIX消息队列。请在此处查看概述:https://linux.die.net/man/7/mq_overview