Browse Source

Performance: Use all cores to reindex models in elasticsearch.

Co-authored-by: Florian Liebe <fl@zammad.com>
Co-authored-by: Martin Edenhofer <me@zammad.com>
Rolf Schmidt 1 year ago
parent
commit
59ea918174

+ 1 - 0
Gemfile

@@ -18,6 +18,7 @@ gem 'activerecord-session_store'
 gem 'bootsnap', require: false
 gem 'composite_primary_keys'
 gem 'json'
+gem 'parallel'
 
 # core - application servers
 gem 'puma', group: :puma

+ 1 - 0
Gemfile.lock

@@ -762,6 +762,7 @@ DEPENDENCIES
   omniauth-weibo-oauth2!
   openssl
   overcommit
+  parallel
   pg (~> 1.2.0)
   pry-rails
   pry-remote

+ 8 - 5
app/models/concerns/has_search_index_backend.rb

@@ -176,15 +176,18 @@ reload search index with full data
 
 =end
 
-    def search_index_reload(silent: false)
+    def search_index_reload(silent: false, worker: 0)
       tolerance       = 10
       tolerance_count = 0
       query           = reorder(created_at: :desc)
       total           = query.count
       record_count    = 0
-      batch_size      = 100
-      query.as_batches(size: batch_size) do |record|
-        if !record.ignore_search_indexing?(:destroy)
+      batch_size      = 200
+
+      query.in_batches(of: batch_size) do |records|
+        Parallel.map(records, { in_processes: worker }) do |record|
+          next if record.ignore_search_indexing?(:destroy)
+
           begin
             record.search_index_update_backend
           rescue => e
@@ -197,7 +200,7 @@ reload search index with full data
 
         next if silent
 
-        record_count += 1
+        record_count += records.count
         if (record_count % batch_size).zero? || record_count == total
           print "\r    #{record_count}/#{total}" # rubocop:disable Rails/Output
         end

+ 4 - 4
lib/tasks/zammad/search_index_es.rake

@@ -34,12 +34,12 @@ namespace :zammad do
     end
 
     desc 'Reload all indexable data'
-    task reload: %i[zammad:searchindex:version_supported] do
+    task :reload, [:worker] => %i[zammad:searchindex:version_supported] do |_task, args|
       puts 'Reloading data... '
       Models.indexable.each do |model_class|
         puts "  - #{model_class}... "
         time_spent = Benchmark.realtime do
-          model_class.search_index_reload
+          model_class.search_index_reload(worker: args[:worker].to_i)
         end
         # Add whitespace at the end to overwrite text from progress indicator line.
         puts "\r    done in #{time_spent.to_i} seconds.#{' ' * 20}"
@@ -54,10 +54,10 @@ namespace :zammad do
     end
 
     desc 'Full re-creation of all search indexes and re-indexing of all data'
-    task rebuild: %i[zammad:searchindex:version_supported] do
+    task :rebuild, [:worker] => %i[zammad:searchindex:version_supported] do |_task, args|
       Rake::Task['zammad:searchindex:drop'].execute
       Rake::Task['zammad:searchindex:create'].execute
-      Rake::Task['zammad:searchindex:reload'].execute
+      Rake::Task['zammad:searchindex:reload'].execute(args)
     end
 
     task version_supported: %i[zammad:searchindex:configured] do