该 Droplet 的规格对于此类导入任务来说看起来相当充足,因此我不认为 UNICORN_WORKERS 会是主要的瓶颈。
几点观察:
- 对于仅用于导入或预演的容器来说,停止 Unicorn 可能没问题,但这不太可能显著提升导入器本身的速度。
- 禁用附件和头像应该会移除两个较慢的环节,因此如果导入速度仍仅为每分钟约 440 条帖子,瓶颈可能在于数据库 I/O、源端 phpBB 的 MySQL 查询侧,或是 Redis/PostgreSQL 的等待时间。
- 需要仔细关注以下日志行:
Exception while creating post 304683. Skipping.
尽管导入仍在继续,但这意味着至少该条帖子被跳过了。如果这种情况反复发生,最终迁移结果可能会缺失部分帖子。
Redis 部分看起来是在 Discourse 的分布式互斥锁期间,PostCreator 创建帖子时发生了 1 秒的 Redis 客户端超时。建议检查 Redis 是否真的过载,或者在长时间导入过程中超时设置是否过于激进。
接下来有用的检查包括:
free -h
df -h
iostat -xz 1
vmstat 1
redis-cli INFO memory
redis-cli INFO stats
redis-cli SLOWLOG GET 20
另外,phpBB 的 MySQL 数据库是位于同一台 Droplet 上的本地数据库,还是通过网络读取?由于堆栈跟踪显示正在遍历 mysql2,源数据库缓慢或磁盘性能差可能导致 CPU 使用率偏低,而导入器却在等待。
按当前速度,从 333919 / 2167314 以每分钟约 441 项的速度计算,您大约还有 69 小时,因此导入可能会完成,但我主要担心的是这些 Redis 超时异常是否导致了帖子被跳过。
我不建议提高 UNICORN_WORKERS 的数量。在仅用于导入的运行中,Unicorn 基本无关紧要。关键问题在于导入虽然在继续,但正在跳过帖子,这才是需要重点关注的地方。