如何调试 gunicorn [6383] [CRITICAL] WORKER TIMEOUT?
How to debug gunicorn [6383] [CRITICAL] WORKER TIMEOUT?
在我繁忙的 Django 1.8 站点中,由于 gunicorn worker 超时,我收到大量 502 错误:
[2019-06-11 04:56:29 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6550)
[2019-06-11 04:56:31 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6439)
[2019-06-11 04:56:31 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:7210)
[2019-06-11 04:56:33 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6429)
[2019-06-11 04:56:46 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6562)
[2019-06-11 04:59:41 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6560)
gunicorn.版本19.9.0
这是我的 guniconrn.sh 配置
#!/bin/bash
NAME="myapp"
SOCKFILE=/tmp/gunicorn.sock
USER=myuser
GROUP=www-data
NUM_WORKERS=48
DJANGO_SETTINGS_MODULE=myapp.settings
DJANGO_WSGI_MODULE=myapp.wsgi
MAX_REQ=20000
REQ_TIMEOUT=10
LOG_FILE=/var/log/gunicorn/error.log
echo "Starting $NAME as `whoami`"
cd $DJANGODIR
source /home/myuser/.myappenv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
exec /home/myuser/.myappenv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=error \
--log-file $LOG_FILE \
--max-requests=$MAX_REQ \
--timeout=$REQ_TIMEOUT
--worker-class="egg:meinheld
# --worker-class=eventlet
--threads=2000`
服务器有 128GB RAM 和 24 核CPU。
错误通常发生在负载为+20
我调整了 NUM_WORKERS
、REQ_TIMEOUT
、worker-class
和 threads
的很多参数。但是 none 似乎有很大的作用。所以我 运行 没有想法,感谢你的提示。
郑重声明,我的问题不在于 gunicorn,而在于大量用于缓存数据的 redis。
由于缓存增长了数百 MB,并且 appendfsync everysec
处于活动状态,因此写入磁盘需要超过 1 秒的时间,因此阻塞了 gunicorn 进程。
因此,在注释掉并改用 appendfsync no
保存策略之后,问题就消失了。
您可能需要检查您的应用是否可以连接到其数据库(如果适用)。对我来说,我是 运行 云中的 Django REST API,必须检查数据库服务器上的安全组以允许连接,但 Django+Gunicorn 部署实际上没有任何问题。
在我繁忙的 Django 1.8 站点中,由于 gunicorn worker 超时,我收到大量 502 错误:
[2019-06-11 04:56:29 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6550)
[2019-06-11 04:56:31 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6439)
[2019-06-11 04:56:31 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:7210)
[2019-06-11 04:56:33 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6429)
[2019-06-11 04:56:46 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6562)
[2019-06-11 04:59:41 +0000] [6383] [CRITICAL] WORKER TIMEOUT (pid:6560)
gunicorn.版本19.9.0
这是我的 guniconrn.sh 配置
#!/bin/bash
NAME="myapp"
SOCKFILE=/tmp/gunicorn.sock
USER=myuser
GROUP=www-data
NUM_WORKERS=48
DJANGO_SETTINGS_MODULE=myapp.settings
DJANGO_WSGI_MODULE=myapp.wsgi
MAX_REQ=20000
REQ_TIMEOUT=10
LOG_FILE=/var/log/gunicorn/error.log
echo "Starting $NAME as `whoami`"
cd $DJANGODIR
source /home/myuser/.myappenv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
exec /home/myuser/.myappenv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=error \
--log-file $LOG_FILE \
--max-requests=$MAX_REQ \
--timeout=$REQ_TIMEOUT
--worker-class="egg:meinheld
# --worker-class=eventlet
--threads=2000`
服务器有 128GB RAM 和 24 核CPU。
错误通常发生在负载为+20
我调整了 NUM_WORKERS
、REQ_TIMEOUT
、worker-class
和 threads
的很多参数。但是 none 似乎有很大的作用。所以我 运行 没有想法,感谢你的提示。
郑重声明,我的问题不在于 gunicorn,而在于大量用于缓存数据的 redis。
由于缓存增长了数百 MB,并且 appendfsync everysec
处于活动状态,因此写入磁盘需要超过 1 秒的时间,因此阻塞了 gunicorn 进程。
因此,在注释掉并改用 appendfsync no
保存策略之后,问题就消失了。
您可能需要检查您的应用是否可以连接到其数据库(如果适用)。对我来说,我是 运行 云中的 Django REST API,必须检查数据库服务器上的安全组以允许连接,但 Django+Gunicorn 部署实际上没有任何问题。