From 33c1b14ada4872492adfb74c8cebf0fc75d8438a Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Thu, 10 Jun 2021 11:18:59 +0200 Subject: [PATCH] #6379: requeue at the tail to reduce contention + use a simpler concurrent queue implementation Signed-off-by: Ludovic Orban --- .../org/eclipse/jetty/io/ByteBufferPool.java | 8 +-- .../util/ArrayByteBufferPoolBenchmark.java | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 tests/jetty-jmh/src/main/java/org/eclipse/jetty/util/ArrayByteBufferPoolBenchmark.java diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java index e752453475e..2c67e29fdc6 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java @@ -15,9 +15,9 @@ package org.eclipse.jetty.io; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Deque; import java.util.List; -import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; @@ -149,7 +149,7 @@ public interface ByteBufferPool public static class Bucket { - private final Deque _queue = new ConcurrentLinkedDeque<>(); + private final Queue _queue = new ConcurrentLinkedQueue<>(); private final int _capacity; private final int _maxSize; private final AtomicInteger _size; @@ -209,7 +209,7 @@ public interface ByteBufferPool private void queueOffer(ByteBuffer buffer) { - _queue.offerFirst(buffer); + _queue.offer(buffer); } private ByteBuffer queuePoll() diff --git a/tests/jetty-jmh/src/main/java/org/eclipse/jetty/util/ArrayByteBufferPoolBenchmark.java b/tests/jetty-jmh/src/main/java/org/eclipse/jetty/util/ArrayByteBufferPoolBenchmark.java new file mode 100644 index 00000000000..098e50f8a4d --- /dev/null +++ b/tests/jetty-jmh/src/main/java/org/eclipse/jetty/util/ArrayByteBufferPoolBenchmark.java @@ -0,0 +1,67 @@ +// +// ======================================================================== +// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.util; + +import java.nio.ByteBuffer; + +import org.eclipse.jetty.io.ArrayByteBufferPool; +import org.eclipse.jetty.io.ByteBufferPool; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@State(Scope.Benchmark) +public class ArrayByteBufferPoolBenchmark +{ + private ByteBufferPool pool; + + @Setup + public void setUp() throws Exception + { + pool = new ArrayByteBufferPool(); + } + + @TearDown + public void tearDown() + { + pool = null; + } + + @Benchmark + public void testAcquireRelease() + { + ByteBuffer buffer = pool.acquire(2048, true); + pool.release(buffer); + } + + public static void main(String[] args) throws RunnerException + { + Options opt = new OptionsBuilder() + .include(ArrayByteBufferPoolBenchmark.class.getSimpleName()) + .warmupIterations(3) + .measurementIterations(3) + .forks(1) + .threads(8) + // .addProfiler(GCProfiler.class) + .build(); + + new Runner(opt).run(); + } +}