我正在使用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
附近更快地获取其数据。
对于某些人来说,半毫秒可能听起来很荒谬,但速度是我应用程序中最重要的事情,并对我产生了巨大的影响。
如果有人能帮助我理解为什么我在上面的例子之间会有很大的不同,那就太棒了。任何关于快速执行此操作的想法都将非常受欢迎。
功能
#1 我尝试使用time_nanosleep
将睡眠时间减少到纳秒而不是微秒,而Reader仍在使用~1-2ms
。
#2 我在Python中遇到了同样的问题,除了在PHP中需要~1ms
而不是ctypes module
。我尝试使用clock_nanosleep
和~300μs
并且我能够达到约{{1}}这不是太糟糕但我正在寻找更快的东西。
答案 0 :(得分:1)
您应该尝试zeromq
答案 1 :(得分:0)
如果您的软件仅限于一个类UNIX操作系统,也可以使用POSIX消息队列。请在此处查看概述:https://linux.die.net/man/7/mq_overview