Я использую 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
, что не так уж плохо, но я ищу что-то еще быстрее.