| /** |
| * Licensed 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.aurora.benchmark; |
| |
| import java.util.Set; |
| import java.util.concurrent.TimeUnit; |
| |
| import com.google.common.collect.Iterables; |
| |
| import org.apache.aurora.scheduler.storage.Storage; |
| import org.apache.aurora.scheduler.storage.Storage.MutateWork.NoResult; |
| import org.apache.aurora.scheduler.storage.entities.IJobUpdateDetails; |
| import org.apache.aurora.scheduler.storage.entities.IJobUpdateKey; |
| import org.apache.aurora.scheduler.storage.mem.MemStorageModule; |
| import org.apache.thrift.TException; |
| import org.openjdk.jmh.annotations.Benchmark; |
| import org.openjdk.jmh.annotations.BenchmarkMode; |
| import org.openjdk.jmh.annotations.Fork; |
| import org.openjdk.jmh.annotations.Level; |
| import org.openjdk.jmh.annotations.Measurement; |
| import org.openjdk.jmh.annotations.Mode; |
| import org.openjdk.jmh.annotations.OutputTimeUnit; |
| import org.openjdk.jmh.annotations.Param; |
| 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.annotations.Warmup; |
| |
| public class UpdateStoreBenchmarks { |
| @BenchmarkMode(Mode.Throughput) |
| @OutputTimeUnit(TimeUnit.SECONDS) |
| @Warmup(iterations = 1, time = 10, timeUnit = TimeUnit.SECONDS) |
| @Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) |
| @Fork(1) |
| @State(Scope.Thread) |
| public static class JobDetailsBenchmark { |
| private Storage storage; |
| private Set<IJobUpdateKey> keys; |
| |
| @Param({"1000", "5000", "10000"}) |
| private int instances; |
| |
| @Setup(Level.Trial) |
| public void setUp() { |
| storage = MemStorageModule.newEmptyStorage(); |
| } |
| |
| @Setup(Level.Iteration) |
| public void setUpIteration() { |
| keys = JobUpdates.saveUpdates( |
| storage, |
| new JobUpdates.Builder().setNumInstanceEvents(instances).build(1)); |
| } |
| |
| @TearDown(Level.Iteration) |
| public void tearDownIteration() { |
| storage.write((NoResult.Quiet) storeProvider -> { |
| storeProvider.getJobUpdateStore().deleteAllUpdates(); |
| }); |
| } |
| |
| @Benchmark |
| public IJobUpdateDetails run() throws TException { |
| return storage.read(store -> store.getJobUpdateStore().fetchJobUpdate( |
| Iterables.getOnlyElement(keys)).get()); |
| } |
| } |
| |
| @BenchmarkMode(Mode.Throughput) |
| @OutputTimeUnit(TimeUnit.SECONDS) |
| @Warmup(iterations = 1, time = 10, timeUnit = TimeUnit.SECONDS) |
| @Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) |
| @Fork(1) |
| @State(Scope.Thread) |
| public static class JobInstructionsBenchmark { |
| private Storage storage; |
| private Set<IJobUpdateKey> keys; |
| |
| @Param({"1", "10", "100", "1000"}) |
| private int instanceOverrides; |
| |
| @Setup(Level.Trial) |
| public void setUp() { |
| storage = MemStorageModule.newEmptyStorage(); |
| } |
| |
| @Setup(Level.Iteration) |
| public void setUpIteration() { |
| keys = JobUpdates.saveUpdates( |
| storage, |
| new JobUpdates.Builder().setNumInstanceOverrides(instanceOverrides).build(1)); |
| } |
| |
| @TearDown(Level.Iteration) |
| public void tearDownIteration() { |
| storage.write((NoResult.Quiet) storeProvider -> { |
| storeProvider.getJobUpdateStore().deleteAllUpdates(); |
| }); |
| } |
| |
| @Benchmark |
| public IJobUpdateDetails run() throws TException { |
| return storage.read(store -> store.getJobUpdateStore().fetchJobUpdate( |
| Iterables.getOnlyElement(keys)).get()); |
| } |
| } |
| |
| @BenchmarkMode(Mode.Throughput) |
| @OutputTimeUnit(TimeUnit.SECONDS) |
| @Warmup(iterations = 1, time = 10, timeUnit = TimeUnit.SECONDS) |
| @Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) |
| @Fork(1) |
| @State(Scope.Thread) |
| public static class JobUpdateMetadataBenchmark { |
| private Storage storage; |
| private Set<IJobUpdateKey> keys; |
| |
| @Param({"10", "100", "1000", "10000"}) |
| private int metadata; |
| |
| @Setup(Level.Trial) |
| public void setUp() { |
| storage = MemStorageModule.newEmptyStorage(); |
| } |
| |
| @Setup(Level.Iteration) |
| public void setUpIteration() { |
| keys = JobUpdates.saveUpdates( |
| storage, |
| new JobUpdates.Builder().setNumUpdateMetadata(metadata).build(1)); |
| } |
| |
| @TearDown(Level.Iteration) |
| public void tearDownIteration() { |
| storage.write((NoResult.Quiet) storeProvider -> { |
| storeProvider.getJobUpdateStore().deleteAllUpdates(); |
| }); |
| } |
| |
| @Benchmark |
| public IJobUpdateDetails run() throws TException { |
| return storage.read(store -> store.getJobUpdateStore().fetchJobUpdate( |
| Iterables.getOnlyElement(keys)).get()); |
| } |
| } |
| } |