RFR: 8253478: (se) epoll Selector should use eventfd for wakeup instead of pipe

Alan Bateman alanb at openjdk.java.net
Mon Jan 18 09:07:39 UTC 2021


On Fri, 15 Jan 2021 23:10:51 GMT, Brian Burkhalter <bpb at openjdk.org> wrote:

>> 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 confidence intervals of the pipe wakeup results mostly do not overlap those of the corresponding eventfd wakeup results which tends to suggest 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%

Are you going to include the micro benchmark in the patch? The presentation of the summary in the comments is hard to read but a 3% is okay. It was inconclusive when I tried a long time ago.

The updated patch looks better. IOUtil.write(fd, long) begs the question as to whether the 8 bytes for the long are written in big or little endian. I realise it doesn't matter for EventFD but we will need to get this right. I would be tempted to call evetnfd with the flags set to 0 and then use IOUtil.configureBlocking when we need it non-blocking.

-------------

PR: https://git.openjdk.java.net/jdk/pull/2082


More information about the nio-dev mailing list