我正在 EC2 服务器上运行带有 gunicorn 的 flask 应用程序。我使用 supervisord 来监视和重新启动应用程序服务器。昨天,服务器没有响应 http 请求。我们使用 supervisorctl 查看状态,它显示为正在运行。我们查看了主管日志,看到了以下错误:

CRIT uncaptured python exception, closing channel <POutputDispatcher at 34738328
for <Subprocess at 34314576 with name flask in state RUNNING> (stdout)>
(<type 'exceptions.OSError'>:[Errno 2] No such file or directory

[/usr/local/lib/python2.7/dist-packages/supervisor/supervisord.py|runforever|233]
[/usr/local/lib/python2.7/dist-packages/supervisor/dispatchers.py|handle_read_event|231]
[/usr/local/lib/python2.7/dist-packages/supervisor/dispatchers.py|record_output|165]
[/usr/local/lib/python2.7/dist-packages/supervisor/dispatchers.py|_log|141]
[/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|info|273]
[/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|log|291]
[/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|emit|186]
[/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|doRollover|220])

重新启动 supervisord 为我们解决了这个问题。以下是我们的主管配置的相关部分:
[supervisord]
childlogdir = /var/log/supervisord/
logfile = /var/log/supervisord/supervisord.log
logfile_maxbytes = 50MB
logfile_backups = 10
loglevel = info
pidfile = /var/log/supervisord/supervisord.pid
umask = 022
nodaemon = false
nocleanup = false

[program:flask]
directory=%(here)s
environment=PATH="/home/ubuntu/.virtualenvs/flask/bin"
command=newrelic-admin run-program gunicorn app:app -c gunicorn_conf.py
autostart=true
autorestart=true
redirect_stderr=true

奇怪的是,我们有 2 个服务器在 ELB 后面运行,并且它们彼此相距 10 分钟都有相同的问题。我猜测两者的日志大约在同一时间达到了限制(这是可能的,因为他们看到的流量大致相同)并且翻转失败。关于为什么会发生这种情况的任何想法?

最佳答案

AFAIK supervisor 使用自己的日志记录实现,而不是 Python stdlib 中的实现 - 尽管类和方法名称非常相似。

在翻转期间删除文件时存在潜在的竞争条件 - 您需要检查特定 supervisor 版本的源代码,并将其与最新的 supervisor 版本(如果不同)进行比较。这是我系统上 supervisor 代码的摘录(在 doRollover() 方法中):

try:
    os.remove(dfn)
except OSError, why:
    # catch race condition (already deleted)
    if why[0] != errno.ENOENT:
        raise

如果您的翻转代码不这样做,您可能需要升级您的 supervisor 版本。

更新: 如果重命名时发生错误,则可能是尚未捕获的竞争条件。考虑询问 the supervisor mailing list

关于python - 日志翻转时的主管异常导致应用服务器卡住?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22118996/

10-11 08:56