From f7df44a07882a266518ff7bfe009384528366484 Mon Sep 17 00:00:00 2001 From: "Ben Sheldon [he/him]" Date: Wed, 23 Jun 2021 15:13:22 -0700 Subject: [PATCH] Add example benchmark for job throughput (#275) --- .rubocop.yml | 1 + Gemfile | 1 + Gemfile.lock | 6 +++ good_job.gemspec | 1 + scripts/benchmark_job_throughput.rb | 51 +++++++++++++++++++ ...duler.rb => benchmark_scheduler_memory.rb} | 0 6 files changed, 60 insertions(+) create mode 100644 scripts/benchmark_job_throughput.rb rename scripts/{benchmark_scheduler.rb => benchmark_scheduler_memory.rb} (100%) diff --git a/.rubocop.yml b/.rubocop.yml index a02e0d143..6427d3f5f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -20,6 +20,7 @@ AllCops: - pkg/**/* - spec/test_app/**/* - vendor/**/* + - scripts/**/* NewCops: enable Layout/EmptyLineAfterMagicComment: diff --git a/Gemfile b/Gemfile index 5256cebeb..7d7029d6f 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ gem 'pg', platforms: [:mri, :mingw, :x64_mingw] gem 'rails' platforms :ruby do + gem "activerecord-explain-analyze" gem "memory_profiler" gem "pry-byebug" gem "rbtrace" diff --git a/Gemfile.lock b/Gemfile.lock index aa08fc44e..cdbaf1d07 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -68,6 +68,9 @@ GEM activerecord (6.1.3.2) activemodel (= 6.1.3.2) activesupport (= 6.1.3.2) + activerecord-explain-analyze (0.1.0) + activerecord (>= 4) + pg activerecord-jdbc-adapter (61.0-java) activerecord (~> 6.1.0) activerecord-jdbcpostgresql-adapter (61.0-java) @@ -107,6 +110,7 @@ GEM async (~> 1.14) async-pool (0.3.6) async (~> 1.25) + benchmark-ips (2.8.4) better_html (1.0.16) actionview (>= 4.0) activesupport (>= 4.0) @@ -373,8 +377,10 @@ PLATFORMS universal-java-11 DEPENDENCIES + activerecord-explain-analyze activerecord-jdbcpostgresql-adapter appraisal! + benchmark-ips (= 2.8.4) capybara database_cleaner dotenv diff --git a/good_job.gemspec b/good_job.gemspec index 3e14429d3..e9cca79b6 100644 --- a/good_job.gemspec +++ b/good_job.gemspec @@ -54,6 +54,7 @@ Gem::Specification.new do |spec| spec.add_dependency "thor", ">= 0.14.1" spec.add_dependency "zeitwerk", ">= 2.0" + spec.add_development_dependency "benchmark-ips", "2.8.4" # https://github.com/evanphx/benchmark-ips/pull/115 spec.add_development_dependency "capybara" spec.add_development_dependency "database_cleaner" spec.add_development_dependency "dotenv" diff --git a/scripts/benchmark_job_throughput.rb b/scripts/benchmark_job_throughput.rb new file mode 100644 index 000000000..345cfd0d7 --- /dev/null +++ b/scripts/benchmark_job_throughput.rb @@ -0,0 +1,51 @@ +# To run: +# bundle exec ruby scripts/benchmark_example.rb +# + +ENV['GOOD_JOB_EXECUTION_MODE'] = 'external' + +require_relative '../spec/test_app/config/environment' +require_relative '../lib/good_job' +require 'benchmark/ips' +require 'pry' + +booleans = [true, false] +priorities = (1..10).to_a +scheduled_minutes = (-60..60).to_a + +GoodJob::Job.delete_all +puts "Seeding database" +jobs_data = Array.new(10_000) do |i| + puts "Initializing seed record ##{i}" if (i % 1_000).zero? + { + queue_name: 'default', + priority: priorities.sample, + scheduled_at: booleans.sample ? scheduled_minutes.sample.minutes.ago : nil, + created_at: 90.minutes.ago, + updated_at: 90.minutes.ago, + finished_at: booleans.sample ? scheduled_minutes.sample.minutes.ago : nil, + serialized_params: {}, + } +end +puts "Inserting seed records into the database...\n" +GoodJob::Job.insert_all(jobs_data) + +# ActiveRecord::Base.connection.execute('SET enable_seqscan = OFF') +# puts GoodJob::Job.unfinished.priority_ordered.only_scheduled(use_coalesce: true).limit(1).advisory_lock.explain(analyze: true) +# exit! + +Benchmark.ips do |x| + x.report("with priority") do + GoodJob::Job.unfinished.priority_ordered.only_scheduled(use_coalesce: true).limit(1).with_advisory_lock do |good_jobs| + # good_jobs.first&.destroy! + end + end + + x.report("without priority") do + GoodJob::Job.unfinished.only_scheduled(use_coalesce: true).limit(1).with_advisory_lock do |good_jobs| + # good_jobs.first&.destroy! + end + end + + x.compare! +end diff --git a/scripts/benchmark_scheduler.rb b/scripts/benchmark_scheduler_memory.rb similarity index 100% rename from scripts/benchmark_scheduler.rb rename to scripts/benchmark_scheduler_memory.rb