RFR: 8253478: (se) epoll Selector should use eventfd for wakeup instead of pipe
Brian Burkhalter
bpb at openjdk.java.net
Fri Jan 15 23:14:02 UTC 2021
On Fri, 15 Jan 2021 23:05:43 GMT, Brian Burkhalter <bpb at openjdk.org> wrote:
>> I did experiments with eventfd(2) a few years ago but didn't see any difference at the time. I think it would be useful to include the PR the results from the JMH runs so that there is at least some record of the results.
>>
>> As regards the patch, I would have expected the only native code is be the method that creates the eventfd instance. The set/reset methods can be implemented with IOUtil.write1/drain1. Also I think the EventFD constructor needs a flag so decide the blocking mode, alternative we ignore it and using the existing IOUtil.configureBlocking.
>
> Benchmark output for commit 3:
>
> 1 fork, 5 10s warmup iterations, 10 10s measurement iterations, 1 thread
> pipe wakeup
>
> Result "org.sample.EventFDBench.test":
> 674120.350 ±(99.9%) 2246.122 ops/s [Average]
> (min, avg, max) = (671278.574, 674120.350, 676866.600), stdev = 1485.671
> CI (99.9%): [671874.229, 676366.472] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 676831.218 ±(99.9%) 2353.488 ops/s [Average]
> (min, avg, max) = (673745.955, 676831.218, 678758.514), stdev = 1556.686
> CI (99.9%): [674477.731, 679184.706] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 675830.928 ±(99.9%) 3052.319 ops/s [Average]
> (min, avg, max) = (671286.540, 675830.928, 679293.739), stdev = 2018.920
> CI (99.9%): [672778.609, 678883.246] (assumes normal distribution)
>
> eventfd wakeup
>
> Result "org.sample.EventFDBench.test":
> 698126.388 ±(99.9%) 2776.885 ops/s [Average]
> (min, avg, max) = (694253.565, 698126.388, 700086.784), stdev = 1836.738
> CI (99.9%): [695349.503, 700903.273] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 699992.095 ±(99.9%) 3653.650 ops/s [Average]
> (min, avg, max) = (695504.040, 699992.095, 702932.998), stdev = 2416.663
> CI (99.9%): [696338.445, 703645.746] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 702140.433 ±(99.9%) 3019.100 ops/s [Average]
> (min, avg, max) = (698291.810, 702140.433, 704818.744), stdev = 1996.948
> CI (99.9%): [699121.333, 705159.533] (assumes normal distribution)
>
>
> 1 fork, 5 10s warmup iterations, 10 10s measurement iterations, 6 threads
> pipe wakeup
>
> Result "org.sample.EventFDBench.test":
> 3223142.871 ±(99.9%) 94755.560 ops/s [Average]
> (min, avg, max) = (3120710.890, 3223142.871, 3283407.281), stdev = 62674.936
> CI (99.9%): [3128387.312, 3317898.431] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 3260747.260 ±(99.9%) 11514.840 ops/s [Average]
> (min, avg, max) = (3248875.268, 3260747.260, 3268729.421), stdev = 7616.354
> CI (99.9%): [3249232.419, 3272262.100] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 3243306.245 ±(99.9%) 56893.385 ops/s [Average]
> (min, avg, max) = (3160345.608, 3243306.245, 3277487.093), stdev = 37631.452
> CI (99.9%): [3186412.859, 3300199.630] (assumes normal distribution)
>
> eventfd wakeup
>
> Result "org.sample.EventFDBench.test":
> 3340323.956 ±(99.9%) 38169.834 ops/s [Average]
> (min, avg, max) = (3280464.427, 3340323.956, 3355415.702), stdev = 25246.982
> CI (99.9%): [3302154.122, 3378493.790] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 3344287.954 ±(99.9%) 46249.831 ops/s [Average]
> (min, avg, max) = (3261670.180, 3344287.954, 3363007.332), stdev = 30591.400
> CI (99.9%): [3298038.123, 3390537.786] (assumes normal distribution)
>
> Result "org.sample.EventFDBench.test":
> 3353728.294 ±(99.9%) 40760.876 ops/s [Average]
> (min, avg, max) = (3285776.202, 3353728.294, 3372002.914), stdev = 26960.796
> CI (99.9%): [3312967.418, 3394489.170] (assumes normal distribution)
Throughput improvement as measured by the benchmark looks to be a bit over 3% for eventfd wakeup with respect to pipe wakeup. The maximum upper bound of the pipe wakeup confidence intervals is smaller than the minimum lower bound of the eventfd wakeup confidence intervals which suggests some degree of reliability.
Summary of benchmark results:
1 fork, 5 10s warmup iterations, 10 10s measurement iterations, 1 thread
pipe wakeup
Mean average: 675594.1653333333
Max CI upper bound: 679184.706
eventfd wakeup
Mean average: 700086.3053333334
Min CI lower bound: 695349.503
Throughput change: +3.6%
1 fork, 5 10s warmup iterations, 10 10s measurement iterations, 6 threads
pipe wakeup
Mean average: 3242398.7919999994
Max CI upper bound: 3317898.431
eventfd wakeup
Mean average: 3346113.4013333335
Min CI lower bound: 3298038.123
Throughput change: +3.2%
-------------
PR: https://git.openjdk.java.net/jdk/pull/2082
More information about the nio-dev
mailing list