Railway部署Celery遇SIGKILL错误,Worker进程启动失败求助
问题分析与解决方案
从日志来看,Celery Worker的多个ForkPoolWorker进程被系统以signal 9 (SIGKILL)终止,最终触发WorkerLostError,核心原因是内存资源耗尽——系统为了避免整体崩溃,主动杀掉了占用过多内存的worker进程。
日志中显示Celery的并发数设置为32 (prefork),这个数值远超Railway普通实例的内存承载能力(比如默认starter实例通常只有512MB-1GB内存),32个worker进程同时启动会瞬间占满内存,触发系统OOM(内存不足)杀进程机制。
解决步骤
降低Celery并发数:启动Celery worker时显式指定更小的并发数,根据Railway实例内存调整,比如设置为4:
celery -A Instagram worker --concurrency=4 --loglevel=info可先从2-4开始测试,逐步调整到实例能稳定承载的数值。
调整Railway实例资源配置:如果业务需要更多worker,升级Railway实例规格,提升内存配额,确保有足够资源支撑所需并发数。
优化任务内存占用:检查
users.tasks.update_instagram_stats任务逻辑,排查是否存在内存泄漏(如未关闭的文件/连接、大量数据长期驻留内存),优化任务内存使用效率,减少单个worker的内存消耗。启用自动缩放:使用Celery的
--autoscale参数让worker根据系统负载自动调整数量,比如设置最大8个、最小2个:celery -A Instagram worker --autoscale=8,2 --loglevel=info
相关日志
User information: uid=0 euid=0 gid=0 egid=0 warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format( \-------------- celery@railway v5.2.7 (dawn-chorus) \--- ***** ----- \-- ******* ---- Linux-4.19.0-22-cloud-amd64-x86_64-with-glibc2.2.5 2023-04-17 08:23:15 - *** --- * --- - ** ---------- [config] - ** ---------- .> app: Instagram:0x7f543f2c43d0 - ** ---------- .> transport: amqps://cxcarasm:**@armadillo.rmq.cloudamqp.com:5671/cxcarasm - ** ---------- .> results: disabled:// - *** --- * --- .> concurrency: 32 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . users.tasks.update_instagram_stats [2023-04-17 08:23:28,093: INFO/MainProcess] Connected to amqps://cxcarasm:**@armadillo.rmq.cloudamqp.com:5671/cxcarasm [2023-04-17 08:23:29,212: INFO/MainProcess] mingle: searching for neighbors [2023-04-17 08:23:32,781: INFO/MainProcess] mingle: all alone [2023-04-17 08:23:35,175: INFO/MainProcess] celery@railway ready. [2023-04-17 08:23:35,176: ERROR/MainProcess] Process 'ForkPoolWorker-30' pid:42 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,186: ERROR/MainProcess] Process 'ForkPoolWorker-29' pid:41 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,197: ERROR/MainProcess] Process 'ForkPoolWorker-28' pid:40 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,207: ERROR/MainProcess] Process 'ForkPoolWorker-27' pid:39 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,218: ERROR/MainProcess] Process 'ForkPoolWorker-26' pid:38 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,228: ERROR/MainProcess] Process 'ForkPoolWorker-25' pid:37 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,239: ERROR/MainProcess] Process 'ForkPoolWorker-24' pid:36 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,249: ERROR/MainProcess] Process 'ForkPoolWorker-23' pid:35 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,260: ERROR/MainProcess] Process 'ForkPoolWorker-22' pid:34 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,270: ERROR/MainProcess] Process 'ForkPoolWorker-21' pid:33 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,281: ERROR/MainProcess] Process 'ForkPoolWorker-20' pid:32 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,291: ERROR/MainProcess] Process 'ForkPoolWorker-19' pid:31 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,301: ERROR/MainProcess] Process 'ForkPoolWorker-18' pid:30 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,312: ERROR/MainProcess] Process 'ForkPoolWorker-17' pid:29 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,322: ERROR/MainProcess] Process 'ForkPoolWorker-16' pid:28 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,333: ERROR/MainProcess] Process 'ForkPoolWorker-15' pid:27 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,343: ERROR/MainProcess] Process 'ForkPoolWorker-13' pid:25 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,354: ERROR/MainProcess] Process 'ForkPoolWorker-12' pid:24 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,364: ERROR/MainProcess] Process 'ForkPoolWorker-2' pid:14 exited with 'signal 9 (SIGKILL)' [2023-04-17 08:23:35,571: CRITICAL/MainProcess] Unrecoverable error: WorkerLostError('Could not start worker processes') Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/celery/worker/worker.py", line 203, in start self.blueprint.start(self) File "/usr/local/lib/python3.8/site-packages/celery/bootsteps.py", line 116, in start step.start(parent) File "/usr/local/lib/python3.8/site-packages/celery/bootsteps.py", line 365, in start return self.obj.start() File "/usr/local/lib/python3.8/site-packages/celery/worker/consumer/consumer.py", line 332, in start blueprint.start(self) File "/usr/local/lib/python3.8/site-packages/celery/bootsteps.py", line 116, in start step.start(parent) File "/usr/local/lib/python3.8/site-packages/celery/worker/consumer/consumer.py", line 628, in start c.loop(*c.loop_args()) File "/usr/local/lib/python3.8/site-packages/celery/worker/loops.py", line 71, in asynloop raise WorkerLostError('Could not start worker processes') billiard.exceptions.WorkerLostError: Could not start worker processes celery beat v5.2.7 (dawn-chorus) is starting. fffffffffffffffffff __ - ... __ - _ LocalTime -> 2023-04-17 08:23:42 Configuration -> . broker -> amqps://cxcarasm:**@armadillo.rmq.cloudamqp.com:5671/cxcarasm . loader -> celery.loaders.app.AppLoader . scheduler -> celery.beat.PersistentScheduler . db -> celerybeat-schedule . logfile -> [stderr]@%INFO . maxinterval -> 5.00 minutes (300s) [2023-04-17 08:23:42,480: INFO/MainProcess] beat: Starting... [2023-04-17 08:23:43,404: INFO/MainProcess] Scheduler: Sending due task update_instagram_stats (users.tasks.update_instagram_stats) [2023-04-17 08:26:42,702: INFO/MainProcess] Scheduler: Sending due task update_instagram_stats (users.tasks.update_instagram_stats)
内容的提问来源于stack exchange,提问作者ulfet Bayramlı
相关产品推荐
相关产品推荐

