I’m using System V Shared Memory to communicate between my two PHP applications. One application is write only (Writer) and the other one is read only (Reader) on a single Shared Memory Segment (the data is about 900-1000 bytes).
Both applications run using an infinite loop with a 1μs sleep to prevent 100% CPU usage (see code sample below)
while(true) {
shm_get_var($shm, 1);
usleep(1);
}
It takes ~1ms for the Reader to get the data written by the Writer from the Shared Memory Segment. Interestingly enough, if I remove the usleep from the Writer only, Reader get its data in around 500μs. If I remove the usleep from the Reader only, Reader get its data in around 200μs. The problem with removing the usleep is the 100% core usage.
I tried is to assign each application to the same core (using taskset) with both applications using usleep on the same core, the Reader get its data in around 300-400μs (sometimes peaks near 900μs). If I remove the usleep from the Reader and both applications are on the same core, the Reader won’t get its data much faster, around 300-390μs.
Half of a millisecond might sound ridiculous to some but speed is the most important thing in my application and makes a huge difference to me.
If someone could help me understand why I get that much of difference between my examples above that would great. Any idea about executing this faster would be tremendously appreciated.
Specs
- Memory: 12GB DDR3 (6x2GB) running at 1066 MHz
- CPU: Dual Intel Xeon E5620 @ 2.40GHz (Quad core, HyperThreading off)
Updates
#1 I tried to use time_nanosleep to reduce the sleep time to nanoseconds instead of microseconds and Reader is still taking ~1ms.
#2 I have the same problem in Python as well except that it takes ~1-2ms instead of ~1ms like in PHP. I tried to use the ctypes module and clock_nanosleep and I’m able to get down to about ~300μs which is not too bad but I’m looking for something even faster.
You should try zeromq