Как получить доступ к общей памяти System V быстрее? - PullRequest
1 голос
/ 09 августа 2011

Я использую System V Shared Memory для связи между моими двумя PHP-приложениями. Одно приложение доступно только для записи ( Writer ), а другое - только для чтения ( Reader ) для одного Shared Memory Segment (данные о 900-1000 bytes).

Оба приложения работают с использованием бесконечного цикла с 1μs sleep, чтобы предотвратить 100% загрузку ЦП (см. Пример кода ниже)

while(true) {
    shm_get_var($shm, 1);
    usleep(1);
}

Читателю требуется ~1ms, чтобы получить данные, записанные Writer от Shared Memory Segment. Интересно, что если я удалю usleep только из Writer, Reader получит данные примерно в 500μs. Если я удаляю usleep только из Reader, Reader получит данные примерно в 200μs. Проблема с удалением usleep - это 100% использование ядра.

Я пытался назначить каждому приложению одно и то же ядро ​​(используя taskset), причем оба приложения использовали usleep на одном и том же ядре, Reader получал данные примерно в 300-400μs (иногда пики около 900μs) , Если я удалю usleep из Reader и оба приложения будут на одном ядре, Reader не получит свои данные намного быстрее, около 300-390μs.

Половина миллисекунды может показаться смешным для некоторых, но скорость - это самая важная вещь в моем приложении, которая имеет для меня огромное значение.

Если бы кто-то мог помочь мне понять, почему я получаю так много различий между моими примерами выше, это было бы здорово. Любая идея о том, как выполнить это быстрее, будет чрезвычайно цениться.

Характеристики

  • Память: 12 ГБ DDR3 (6x2 ГБ), работающая на частоте 1066 МГц
  • Процессор: Двойной Intel Xeon E5620 @ 2,40 ГГц (четырехъядерный процессор, HyperThreading off)

Обновление

# 1 Я пытался использовать time_nanosleep, чтобы сократить время ожидания до наносекунд вместо микросекунд, и Reader все еще принимает ~1ms.

# 2 У меня такая же проблема в Python, за исключением того, что она принимает ~1-2ms вместо ~1ms, как в PHP. Я попытался использовать ctypes module и clock_nanosleep, и мне удалось снизить значение до ~300μs, что не так уж плохо, но я ищу что-то еще быстрее.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Вы должны попробовать zeromq

0 голосов
/ 06 октября 2016

Если ваше программное обеспечение ограничено одной UNIX-подобной ОС, также могут использоваться очереди сообщений POSIX.Пожалуйста, найдите обзор здесь: https://linux.die.net/man/7/mq_overview

...