It's the 'timing', not exactly the number of 'devices'.
For a single R909 it has to send work around once every 4-5ms.
If it gets delays from thread switching, those delays wont normally be as low as 1ms on OSX.
You can see and compare the number in the estats output.
Check [Sleep... e.g. below
[STATS] => 1
[ID] => GSF0
[Elapsed] => 13417
[FreqComp] => 499.995331
[MaxTaskWait] => 4260
[WaitFactor0] => 0.500000
[GHGHs] => 1951.648580
[JobDataAge] => 0.004327
[JobsAvgms] => 4.27/4.27/4.27/4.27/4.27
[JobsMinMaxms] => 4.01:4.56/4.01:5.40/4.01:5.50/4.01:5.44/4.01:8.59
[Dups] => 17
[DupsReset] => 17
[Chips] => 6
[SleepN] => 16416669
[SleepAvgReq] => 1000.063289
[SleepAvgRes] => 1.074009
[SleepN1_1] => 32839824
[SleepAvgReq1_1] => 222.902610
[SleepAvgRes1_1] => 1.335763
[SleepN1_5] => 240071
[SleepAvgReq1_5] => 216.000991
[SleepAvgRes1_5] => 1.660623
[SleepInv] => 1
That's on an RPi4 doing 1.95TH/s on 1 of the 4 miners connected to it.
(2xR909, 1xCompacF, 1xNewPac)
It's calculated [FreqComp] => 499.995331 MHz is getting [GHGHs] => 1951.648580 GH/s (over the last 5 minutes)
It wants work [MaxTaskWait] => 4260 i.e. 4.2ms
Over the last 5 minutes it's averaging very well [JobsAvgms] => 4.27/4.27/4.27/4.27/4.27
Of course not every job is perfect, [JobsMinMaxms] => 4.01:4.56/4.01:5.40/4.01:5.50/4.01:5.44/4.01:8.59
JobsMinMaxms says what the min and max ms have been over the last 5 minutes
Sleep times:
Note there are normally 2 sleeps per job sent.
16416669 with an average of 1000.063289 microseconds averaged 107.4009% of the requested delay (for all that averaged less than 110% delay)
32839824 with an avg of 222.902610us avg 133.5763% of the requested delay (for all between 110 and 150%)
240071 with an avg of 216.000991us avg 166.0623% (for that were over 150%)
I'd expect your OSX numbers to be a lot worse and get progressively worse with more miners.
This all boils down to CPU and OS sleep time accuracy of usleep() on that OS
Surprisingly it is hard for all OS to sleep a thread 1ms and wake it up 1ms after the call.
The order of accuracy is Linux > Windows > OSX
Thus:
API Usage
As before there's a global wait factor override to adjust the rate that work is sent to the miner.
The default should be fine which is 0.5 for Linux, 0.4 for Windows and 0.3 for Mac
As explained on
https://kano.is/gekko.php#apuIf you have CPU spare you can try lowering the wait factor.
What it means is it will
try to send work faster than the R909 needs.
Which means if it is sending it slower than it needs, it will make the averages better.