Hey, ich bin seit 2004 bei phpBB und übertrage derzeit ein Forum von beachtlicher Größe. Aktuell bin ich seit zwei Tagen dabei: 303139/2167314 (14 %), also 446 pro Minute. Wie kann ich das beschleunigen? Ich bin bei DigitalOcean und nutze nur 4 % der CPU. Redis liefert bei mir ständig Timeouts. Anhänge sind deaktiviert.
Ein paar nützliche Details würden helfen, das Problem einzugrenzen:
- Droplet-Größe: RAM, Anzahl der vCPUs, Datenträgertyp/-größe
- Der genaue Import-Befehl, den Sie ausführen
- Ihre
app.yml-Einstellungen für Ressourcen, mit entfernten Geheimnissen, insbesondere:UNICORN_WORKERSdb_shared_buffersdb_work_mem
- Ob der Import im Standard-Discourse-Docker-Container ausgeführt wird
- Eventuelle Redis-Timeout-Meldungen oder Protokollauszüge
- Ob die Datenbank lokal im selben Container oder extern liegt
Ein wichtiger Hinweis: UNICORN_WORKERS wird den Import wahrscheinlich nicht wesentlich beschleunigen, da der phpBB-Importer nicht primär über die Web-Worker bedient wird. Eine Erhöhung kann lediglich mehr RAM verbrauchen. Viel wichtiger sind die PostgreSQL-Speichereinstellungen und die Festplatten-I/O.
Da die CPU-Auslastung nur bei etwa 4 % liegt, könnte das Problem an der I/O, der Datenbank oder an Redis liegen, nicht an einem Mangel an CPU-Leistung. Redis-Timeouts sollten separat untersucht werden.

Mein aktualisiertes Protokoll
script/import_scripts/phpbb3.rb:15:in ‘’
302570 / 2167314 ( 14,0 %) [448 Einträge/Min] Fehler beim Erstellen des Beitrags 304683. Überspringen.
Wartezeit 1,0 Sekunden
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection/buffered_io.rb:214:in ‘block in RedisClient::RubyConnection::BufferedIO#fill_buffer’
internal:kernel:168:in ‘Kernel#loop’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection/buffered_io.rb:197:in ‘RedisClient::RubyConnection::BufferedIO#fill_buffer’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection/buffered_io.rb:187:in ‘RedisClient::RubyConnection::BufferedIO#ensure_remaining’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection/buffered_io.rb:152:in ‘RedisClient::RubyConnection::BufferedIO#getbyte’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection/resp3.rb:113:in ‘RedisClient::RESP3.parse’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection/resp3.rb:50:in ‘RedisClient::RESP3.load’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/ruby_connection.rb:97:in ‘RedisClient::RubyConnection#read’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/connection_mixin.rb:37:in ‘RedisClient::ConnectionMixin#call’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client.rb:374:in ‘block (2 levels) in RedisClient#call_v’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client/middlewares.rb:16:in ‘RedisClient::BasicMiddleware#call’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client.rb:373:in ‘block in RedisClient#call_v’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client.rb:781:in ‘RedisClient#ensure_connected’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-client-0.28.0/lib/redis_client.rb:372:in ‘RedisClient#call_v’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis/client.rb:90:in ‘Redis::Client#call_v’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:90:in ‘block in Redis::Client#profile_method’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis.rb:152:in ‘block in Redis#send_command’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis.rb:151:in ‘Monitor#synchronize’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis.rb:151:in ‘Redis#send_command’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis/commands/scripting.rb:110:in ‘Redis::Commands::Scripting#_eval’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis/commands/scripting.rb:97:in ‘Redis::Commands::Scripting#evalsha’
/var/www/discourse/lib/discourse_redis.rb:38:in ‘Kernel#public_send’
/var/www/discourse/lib/discourse_redis.rb:38:in ‘block in DiscourseRedis#method_missing’
/var/www/discourse/lib/discourse_redis.rb:29:in ‘DiscourseRedis.ignore_readonly’
/var/www/discourse/lib/discourse_redis.rb:38:in ‘DiscourseRedis#method_missing’
/var/www/discourse/lib/discourse_redis.rb:270:in ‘DiscourseRedis::EvalHelper#eval’
/var/www/discourse/lib/distributed_mutex.rb:82:in ‘DistributedMutex#get_lock’
/var/www/discourse/lib/distributed_mutex.rb:50:in ‘block in DistributedMutex#synchronize’
/var/www/discourse/lib/distributed_mutex.rb:49:in ‘Thread::Mutex#synchronize’
/var/www/discourse/lib/distributed_mutex.rb:49:in ‘DistributedMutex#synchronize’
/var/www/discourse/lib/distributed_mutex.rb:34:in ‘DistributedMutex.synchronize’
/var/www/discourse/lib/post_creator.rb:410:in ‘PostCreator#transaction’
/var/www/discourse/lib/post_creator.rb:200:in ‘PostCreator#create’
/var/www/discourse/script/import_scripts/base.rb:611:in ‘ImportScripts::Base#create_post’
/var/www/discourse/script/import_scripts/base.rb:555:in ‘block in ImportScripts::Base#create_posts’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rack-mini-profiler-4.0.1/lib/patches/db/mysql2/alias_method.rb:8:in ‘Mysql2::Result#each’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rack-mini-profiler-4.0.1/lib/patches/db/mysql2/alias_method.rb:8:in ‘Mysql2::Result#each’
/var/www/discourse/script/import_scripts/base.rb:542:in ‘ImportScripts::Base#create_posts’
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:212:in ‘block in ImportScripts::PhpBB3::Importer#import_posts’
/var/www/discourse/script/import_scripts/base.rb:943:in ‘block in ImportScripts::Base#batches’
internal:kernel:168:in ‘Kernel#loop’
/var/www/discourse/script/import_scripts/base.rb:942:in ‘ImportScripts::Base#batches’
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:293:in ‘ImportScripts::PhpBB3::Importer#batches’
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:208:in ‘ImportScripts::PhpBB3::Importer#import_posts’
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:38:in ‘ImportScripts::PhpBB3::Importer#execute’
/var/www/discourse/script/import_scripts/base.rb:47:in ‘ImportScripts::Base#perform’
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in ‘ImportScripts::PhpBB3::Importer#perform’
script/import_scripts/phpbb3.rb:35:in ‘module:PhpBB3’
script/import_scripts/phpbb3.rb:16:in ‘module:ImportScripts’
script/import_scripts/phpbb3.rb:15:in ‘’
333919 / 2167314 ( 15,4 %) [441 Einträge/Min]
Scheint trotzdem zu funktionieren, keine Beschwerden.
bisher
Unicorn gestoppt
Anhänge und Avatare deaktiviert
Diese Droplet-Größe erscheint für diese Art von Import angemessen robust, daher würde ich nicht erwarten, dass UNICORN_WORKERS hier der Hauptbegrenzungsfaktor ist.
Ein paar Beobachtungen:
- Das Stoppen von Unicorn ist für einen reinen Import-/Staging-Container wahrscheinlich in Ordnung, wird den Import selbst jedoch wahrscheinlich nicht erheblich beschleunigen.
- Da Anhänge und Avatare deaktiviert sind, entfallen zwei der langsameren Teile. Wenn Sie dennoch nur etwa 440 Beiträge pro Minute erhalten, könnte die Engpassstelle bei der Datenbank-E/A, der phpBB-MySQL-Abfrageseite der Quelle oder bei Redis/PostgreSQL-Wartezeiten liegen.
- Die folgende Logzeile sollte sorgfältig beobachtet werden:
Exception while creating post 304683. Skipping.
Auch wenn der Import weiterläuft, bedeutet dies, dass mindestens dieser Beitrag übersprungen wurde. Wenn dies wiederholt vorkommt, fehlen in der endgültigen Migration möglicherweise Beiträge.
Der Redis-Teil deutet auf ein Redis-Client-Timeout von 1 Sekunde während des verteilten Mutex-Locks von Discourse hin, während PostCreator einen Beitrag erstellt. Ich würde prüfen, ob Redis tatsächlich überlastet ist oder ob das Timeout während eines langen Imports einfach zu aggressiv eingestellt ist.
Nützliche nächste Checks wären:
free -h
df -h
iostat -xz 1
vmstat 1
redis-cli INFO memory
redis-cli INFO stats
redis-cli SLOWLOG GET 20
Ist die phpBB-MySQL-Datenbank lokal auf derselben Droplet oder wird sie über das Netzwerk gelesen? Da der Stack-Trace durch mysql2 iteriert, kann eine langsame Quelldatenbank oder langsame Festplatte die CPU-Auslastung niedrig halten, während der Importeur wartet.
Bei der aktuellen Rate von 333.919 / 2.167.314 bei etwa 441 Einträgen pro Minute bleiben Ihnen noch ungefähr 69 Stunden, sodass der Import möglicherweise abgeschlossen wird. Meine Hauptsorge ist jedoch, ob diese Redis-Timeout-Ausnahmen dazu führen, dass Beiträge übersprungen werden.
Ich würde nicht empfehlen, UNICORN_WORKERS zu erhöhen. Bei einem reinen Importlauf ist Unicorn weitgehend irrelevant. Wichtig ist, dass der Import zwar weiterläuft, aber Beiträge überspringt – das ist der Punkt, den ich hervorheben würde.