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

Posted

技术标签:

【中文标题】如何更快地访问 System V 共享内存?【英文标题】:How to access System V Shared Memory faster? 【发布时间】: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需要~1msShared 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 moduleclock_nanosleep,我能够降低到大约~300μs,这还不错,但我正在寻找更快的东西。

【问题讨论】:

【参考方案1】:

你应该试试zeromq

【讨论】:

有趣,我会试一试。一旦我有一些结果,我会回帖。谢谢! 我还没有时间尝试,但一旦我尝试并且它确实有帮助,我会批准答案:)【参考方案2】:

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

【讨论】:

以上是关于如何更快地访问 System V 共享内存?的主要内容,如果未能解决你的问题,请参考以下文章

System V 共享内存

Linux--System V共享内存

五十进程间通信——System V IPC 之共享内存

System V 共享内存区

linux进程间通信之System V共享内存详解及代码示例

RE:Posix 和 System V IPC