You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/01/20 08:54:05 UTC

ignite git commit: Added benchmark.

Repository: ignite
Updated Branches:
  refs/heads/ignite-3477 670011b3d -> c47d0316b


Added benchmark.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/c47d0316
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/c47d0316
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/c47d0316

Branch: refs/heads/ignite-3477
Commit: c47d0316b581583009fde97ffdf7f8310a936ba5
Parents: 670011b
Author: sboikov <sb...@gridgain.com>
Authored: Fri Jan 20 11:54:09 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Jan 20 11:54:09 2017 +0300

----------------------------------------------------------------------
 .../benchmarks/jmh/tree/BPlusTreeBenchmark.java | 333 +++++++++++++++++++
 1 file changed, 333 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/c47d0316/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
new file mode 100644
index 0000000..d1bca73
--- /dev/null
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
@@ -0,0 +1,333 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.benchmarks.jmh.tree;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.benchmarks.jmh.JmhAbstractBenchmark;
+import org.apache.ignite.internal.benchmarks.jmh.runner.JmhIdeBenchmarkRunner;
+import org.apache.ignite.internal.mem.unsafe.UnsafeMemoryProvider;
+import org.apache.ignite.internal.pagemem.FullPageId;
+import org.apache.ignite.internal.pagemem.PageIdAllocator;
+import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.pagemem.PageUtils;
+import org.apache.ignite.internal.pagemem.impl.PageMemoryNoStoreImpl;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusInnerIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusLeafIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
+import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
+import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseBag;
+import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList;
+import org.apache.ignite.logger.java.JavaLogger;
+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;
+
+/**
+ *
+ */
+@State(Scope.Benchmark)
+public class BPlusTreeBenchmark extends JmhAbstractBenchmark {
+    /** */
+    private static final short LONG_INNER_IO = 30000;
+
+    /** */
+    private static final short LONG_LEAF_IO = 30001;
+
+    /** */
+    private static final int PAGE_SIZE = 256;
+
+    /** */
+    private static final long MB = 1024 * 1024;
+
+    /** */
+    private static final int CPUS = Runtime.getRuntime().availableProcessors();
+
+    /** */
+    static int MAX_PER_PAGE = 0;
+
+    /** */
+    private static final int CACHE_ID = 100500;
+
+    /** */
+    private static final int KEYS = 1_000_000;
+
+    /** */
+    private TestTree tree;
+
+    /** */
+    private PageMemory pageMem;
+
+    /**
+     * Fake reuse list.
+     */
+    private static class FakeReuseList implements ReuseList {
+        /** */
+        private final ConcurrentLinkedDeque<Long> deque = new ConcurrentLinkedDeque<>();
+
+        /** {@inheritDoc} */
+        @Override public void addForRecycle(ReuseBag bag) throws IgniteCheckedException {
+            long pageId;
+
+            while ((pageId = bag.pollFreePage()) != 0L)
+                deque.addFirst(pageId);
+        }
+
+        /** {@inheritDoc} */
+        @Override public long takeRecycledPage() throws IgniteCheckedException {
+            Long pageId = deque.pollFirst();
+
+            return pageId == null ? 0L : pageId;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long recycledPagesCount() throws IgniteCheckedException {
+            return deque.size();
+        }
+    }
+
+    /**
+     * @return Allocated meta page ID.
+     * @throws IgniteCheckedException If failed.
+     */
+    private FullPageId allocateMetaPage() throws IgniteCheckedException {
+        return new FullPageId(pageMem.allocatePage(CACHE_ID, PageIdAllocator.INDEX_PARTITION, PageIdAllocator.FLAG_IDX), CACHE_ID);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Setup
+    public void setup() throws Exception {
+        pageMem = createPageMemory();
+
+        tree = new TestTree(new FakeReuseList(), CACHE_ID, pageMem, allocateMetaPage().pageId());
+
+        for (long l = 0; l < KEYS; l++)
+            tree.put(l);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @TearDown
+    public void tearDown() throws Exception {
+        tree.destroy();
+
+        pageMem.stop();
+    }
+
+    /**
+     * @throws Exception If failed.
+     * @return Value.
+     */
+    @Benchmark
+    public Long get() throws Exception {
+        Long key = ThreadLocalRandom.current().nextLong(KEYS);
+
+        return tree.findOne(key);
+    }
+
+    /**
+     * @throws Exception If failed.
+     * @return Value.
+     */
+    @Benchmark
+    public Long put() throws Exception {
+        Long key = ThreadLocalRandom.current().nextLong(KEYS);
+
+        return tree.put(key);
+    }
+
+    /**
+     * Test tree.
+     */
+    protected static class TestTree extends BPlusTree<Long, Long> {
+        /**
+         * @param reuseList Reuse list.
+         * @param cacheId Cache ID.
+         * @param pageMem Page memory.
+         * @param metaPageId Meta page ID.
+         * @throws IgniteCheckedException If failed.
+         */
+        TestTree(ReuseList reuseList, int cacheId, PageMemory pageMem, long metaPageId)
+            throws IgniteCheckedException {
+            super("test", cacheId, pageMem, null, new AtomicLong(), metaPageId, reuseList,
+                new IOVersions<>(new LongInnerIO()), new IOVersions<>(new LongLeafIO()));
+
+            PageIO.registerTest(latestInnerIO(), latestLeafIO());
+
+            initTree(true);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected int compare(BPlusIO<Long> io, long pageAddr, int idx, Long n2)
+            throws IgniteCheckedException {
+            Long n1 = io.getLookupRow(this, pageAddr, idx);
+
+            return Long.compare(n1, n2);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected Long getRow(BPlusIO<Long> io, long pageAddr, int idx) throws IgniteCheckedException {
+            assert io.canGetRow() : io;
+
+            return io.getLookupRow(this, pageAddr, idx);
+        }
+    }
+
+    /**
+     * @return Page memory.
+     * @throws Exception If failed.
+     */
+    private PageMemory createPageMemory() throws Exception {
+        long[] sizes = new long[CPUS];
+
+        for (int i = 0; i < sizes.length; i++)
+            sizes[i] = 1024 * MB / CPUS;
+
+        PageMemory pageMem = new PageMemoryNoStoreImpl(new JavaLogger(),
+            new UnsafeMemoryProvider(sizes),
+            null,
+            PAGE_SIZE,
+            false);
+
+        pageMem.start();
+
+        return pageMem;
+    }
+
+    /**
+     * Run benchmarks.
+     *
+     * @param args Arguments.
+     * @throws Exception If failed.
+     */
+    public static void main(String[] args) throws Exception {
+        run(8);
+    }
+
+    /**
+     * Run benchmark.
+     *
+     * @param threads Amount of threads.
+     * @throws Exception If failed.
+     */
+    private static void run(int threads) throws Exception {
+        JmhIdeBenchmarkRunner.create()
+            .forks(1)
+            .threads(threads)
+            .warmupIterations(10)
+            .measurementIterations(10)
+            .benchmarks(BPlusTreeBenchmark.class.getSimpleName())
+            .jvmArguments("-Xms4g", "-Xmx4g")
+            .run();
+    }
+
+    /**
+     * Long inner.
+     */
+    private static final class LongInnerIO extends BPlusInnerIO<Long> {
+        /**
+         */
+        LongInnerIO() {
+            super(LONG_INNER_IO, 1, true, 8);
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getMaxCount(long buf, int pageSize) {
+            if (MAX_PER_PAGE != 0)
+                return MAX_PER_PAGE;
+
+            return super.getMaxCount(buf, pageSize);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void store(long dst, int dstIdx, BPlusIO<Long> srcIo, long src, int srcIdx)
+            throws IgniteCheckedException {
+            Long row = srcIo.getLookupRow(null, src, srcIdx);
+
+            store(dst, dstIdx, row, null);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void storeByOffset(ByteBuffer buf, int off, Long row) throws IgniteCheckedException {
+            throw new UnsupportedOperationException();
+        }
+
+        /** {@inheritDoc} */
+        @Override public void storeByOffset(long pageAddr, int off, Long row) {
+            PageUtils.putLong(pageAddr, off, row);
+        }
+
+        /** {@inheritDoc} */
+        @Override public Long getLookupRow(BPlusTree<Long,?> tree, long pageAddr, int idx)
+            throws IgniteCheckedException {
+            return PageUtils.getLong(pageAddr, offset(idx));
+        }
+    }
+
+    /**
+     * Long leaf.
+     */
+    private static final class LongLeafIO extends BPlusLeafIO<Long> {
+        /**
+         */
+        LongLeafIO() {
+            super(LONG_LEAF_IO, 1, 8);
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getMaxCount(long pageAddr, int pageSize) {
+            if (MAX_PER_PAGE != 0)
+                return MAX_PER_PAGE;
+
+            return super.getMaxCount(pageAddr, pageSize);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void storeByOffset(ByteBuffer buf, int off, Long row) throws IgniteCheckedException {
+            throw new UnsupportedOperationException();
+        }
+
+        /** {@inheritDoc} */
+        @Override public void storeByOffset(long pageAddr, int off, Long row) {
+            PageUtils.putLong(pageAddr, off, row);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void store(long dst, int dstIdx, BPlusIO<Long> srcIo, long src, int srcIdx) {
+            assert srcIo == this;
+
+            PageUtils.putLong(dst, offset(dstIdx), PageUtils.getLong(src, offset(srcIdx)));
+        }
+
+        /** {@inheritDoc} */
+        @Override public Long getLookupRow(BPlusTree<Long,?> tree, long pageAddr, int idx)
+            throws IgniteCheckedException {
+            return PageUtils.getLong(pageAddr, offset(idx));
+        }
+    }
+}