Hola, llevo con phpBB desde 2004, así que estoy migrando un foro de tamaño considerable. Actualmente llevo dos días y he procesado 303.139 de 2.167.314 elementos (14%), a un ritmo de 446 por minuto. ¿Cómo puedo acelerar el proceso? Estoy en Digital Ocean y solo estoy utilizando el 4% de la CPU. Redis sigue agotando el tiempo de espera. Tengo las adjuntos desactivados.
Algunos detalles útiles ayudarían a reducir el problema:
- Tamaño del Droplet: RAM, cantidad de vCPU, tipo/tamaño del disco
- El comando de importación exacto que estás ejecutando
- La configuración relacionada con recursos de tu
app.yml, sin secretos, especialmente:UNICORN_WORKERSdb_shared_buffersdb_work_mem
- Si la importación se está ejecutando dentro del contenedor Docker estándar de Discourse
- Cualquier mensaje de tiempo de espera de Redis o fragmentos de registro
- Si la base de datos es local (en el mismo contenedor) o externa
Un punto a tener en cuenta: UNICORN_WORKERS probablemente no acelerará mucho la importación, ya que el importador de phpBB no se atiende principalmente a través de los workers web. Aumentarlo solo podría consumir más RAM. Es más probable que las configuraciones de memoria de PostgreSQL y la E/S del disco sean lo que realmente importa.
Dado que el uso de CPU es de solo alrededor del 4%, es posible que el cuello de botella sea la E/S, la base de datos o la espera de Redis, y no la falta de CPU. Vale la pena investigar por separado los tiempos de espera de Redis.

Mi registro actualizado
script/import_scripts/phpbb3.rb:15:in ‘’
302570 / 2167314 ( 14.0%) [448 elementos/min] Excepción al crear el post 304683. Omitiendo.
Esperado 1.0 segundo
/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 ‘bloque en 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 ‘bloque (2 niveles) en 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 ‘bloque en 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 ‘bloque en Redis::Client#profile_method’
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/redis-5.4.0/lib/redis.rb:152:in ‘bloque en 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 ‘bloque en 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 ‘bloque en 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 ‘bloque en 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 ‘bloque en ImportScripts::PhpBB3::Importer#import_posts’
/var/www/discourse/script/import_scripts/base.rb:943:in ‘bloque en 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 elementos/min]
Parece que funciona, no hay quejas.
hasta ahora
se detuvo unicorn
se desactivaron los archivos adjuntos y los avatares
El tamaño de esa gota parece razonablemente sólido para este tipo de importación, por lo que no esperaría que UNICORN_WORKERS sea el principal limitante aquí.
Un par de observaciones:
- Detener Unicorn probablemente esté bien para un contenedor de solo importación/entorno de pruebas, pero es poco probable que acelere significativamente al propio importador.
- Al desactivar los adjuntos y los avatares se eliminan dos de las partes más lentas; por lo tanto, si aún solo obtienes ~440 publicaciones/min, el cuello de botella podría ser la E/S de la base de datos, el lado de la consulta MySQL de phpBB de origen, o las esperas de Redis/PostgreSQL.
- Vale la pena observar con atención la siguiente línea del registro:
Exception while creating post 304683. Skipping.
Aunque la importación continúa, esto significa que al menos esa publicación fue omitida. Si esto ocurre repetidamente, la migración final podría carecer de publicaciones.
La parte de Redis parece ser un tiempo de espera del cliente de Redis de 1 segundo durante el bloqueo de mutex distribuido de Discourse mientras PostCreator crea una publicación. Te recomendaría verificar si Redis está realmente sobrecargado o si el tiempo de espera es simplemente demasiado agresivo durante una importación prolongada.
Los siguientes controles útiles serían:
free -h
df -h
iostat -xz 1
vmstat 1
redis-cli INFO memory
redis-cli INFO stats
redis-cli SLOWLOG GET 20
Además, ¿la base de datos MySQL de phpBB está local en la misma gota o se lee a través de la red? Dado que el seguimiento de la pila itera a través de mysql2, una base de datos de origen lenta o un disco lento pueden mantener el uso de la CPU bajo mientras el importador espera.
Con la velocidad actual, de 333919 / 2167314 a aproximadamente 441 elementos/min, aún te quedan unas 69 horas, por lo que podría terminar, pero me preocuparía principalmente si esas excepciones de tiempo de espera de Redis están causando que se omitan publicaciones.
No te recomendaría aumentar UNICORN_WORKERS. En una ejecución de solo importación, Unicorn es mayormente irrelevante. Lo importante es que su importación continúa pero omite publicaciones, y eso es lo que señalaría.