使用Gevent线程运行Celery Worker时频繁出现OS error: load averages unobtainable
解决「OS error: load averages unobtainable」错误(Celery + Gevent + Python2.7)
我之前在和你完全一致的技术栈(Python 2.7、Celery 4.0.2、Ubuntu 14.04搭配Gevent Worker)下也碰到过这个烦人的问题——首次触发后就频繁发作,折腾了好一阵才找到几个靠谱的解决办法,分享给你:
1. 直接禁用Celery的负载平均值收集
这个错误本质是Celery Worker尝试获取系统负载时失败导致的,最简单的办法就是直接关掉这个功能。你可以在Celery配置文件里加一行:
# Celery 4.x 采用小写配置键 worker_load_average = None
或者启动Worker时直接通过命令行参数指定:
celery worker -A your_app --concurrency=10 -P gevent --load-average=None
2. 升级Gevent版本
老版本的Gevent在做Monkey Patch系统调用时,可能会干扰os.getloadavg()的正常执行。Python 2.7兼容的最后一个稳定Gevent版本是1.5.0,你可以用pip升级试试:
pip install gevent==1.5.0
升级完重启Worker,大概率能解决问题。
3. 验证系统负载文件的可读性
Celery是通过读取/proc/loadavg文件获取系统负载的,你可以先确认Worker运行的用户有没有读取这个文件的权限,手动执行以下命令测试:
cat /proc/loadavg
如果能正常输出类似0.12 0.08 0.05 1/123 4567的内容,说明权限没问题;如果报错,再调整文件读取权限(不过默认情况下普通用户都能读取)。
4. 修改Celery源码(最后兜底手段)
如果上面的方法都不管用,你可以直接修改Celery处理负载的代码,添加异常捕获。找到Celery安装目录下的celery/utils/system.py文件,找到load_average()函数,修改成这样:
def load_average(): try: return os.getloadavg() except OSError: # 捕获负载获取失败的异常,返回默认值避免报错 return (0.0, 0.0, 0.0)
改完重启Worker,就能彻底阻止这个错误抛出了。
内容的提问来源于stack exchange,提问作者Japneet Singh Chawla
相关产品推荐
相关产品推荐

