每个人。我在运行AWS sagemaker终端节点时遇到了gunicorn问题(在flask应用程序中)。到现在为止,整个过程需要60秒钟以上才能正常运行。我查找了超时错误,并放置了以下行:
proxy_connect_timeout 75s;
proxy_read_timeout 1200s;
proxy_send_timeout 1200s;
进入nginx.conf。并且还会增加在gunicorn中的超时。现在没有超时错误,但是在观看AWS CloudWatch中的日志时,我仍然可以看到该过程在恰好1分钟后重新启动。 nginx.conf和gunicorn设置文件取自AWS sagemaker教程,除了时间外,我什么都没改变。
nginx.conf:
worker_processes 1;
daemon off;
pid /tmp/nginx.pid;
error_log /var/log/nginx/error.log;
events {
# defaults
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log combined;
upstream gunicorn {
server unix:/tmp/gunicorn.sock;
}
server {
listen 8080 deferred;
client_max_body_size 5m;
keepalive_timeout 5;
location ~ ^/(ping|invocations) {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://gunicorn;
proxy_connect_timeout 1200s;
proxy_read_timeout 1200s;
proxy_send_timeout 1200s;
}
location / {
return 404 "{}";
}
}
}
服务器gunicorn文件:
#!/usr/bin/env python3
import multiprocessing
import os
import signal
import subprocess
import sys
cpu_count = multiprocessing.cpu_count()
model_server_timeout = os.environ.get('MODEL_SERVER_TIMEOUT', 1200)
model_server_workers = int(os.environ.get('MODEL_SERVER_WORKERS', cpu_count))
def sigterm_handler(nginx_pid, gunicorn_pid):
try:
os.kill(nginx_pid, signal.SIGQUIT)
except OSError:
pass
try:
os.kill(gunicorn_pid, signal.SIGTERM)
except OSError:
pass
sys.exit(0)
def start_server():
print('Starting the inference server with {} workers.'.format(model_server_workers))
subprocess.check_call(['ln', '-sf', '/dev/stdout', '/var/log/nginx/access.log'])
subprocess.check_call(['ln', '-sf', '/dev/stderr', '/var/log/nginx/error.log'])
nginx = subprocess.Popen(['nginx', '-c', '/opt/program/server/nginx.conf'])
print(model_server_timeout)
gunicorn = subprocess.Popen(['gunicorn',
'--timeout', str(model_server_timeout),
'-k', 'gevent',
'-b', 'unix:/tmp/gunicorn.sock',
'-w', str(model_server_workers),
'server.wsgi:app'])
signal.signal(signal.SIGTERM, lambda a, b: sigterm_handler(nginx.pid, gunicorn.pid))
# If either subprocess exits, so do we.
pids = set([nginx.pid, gunicorn.pid])
while True:
pid, _ = os.wait()
if pid in pids:
break
sigterm_handler(nginx.pid, gunicorn.pid)
print('Inference server exiting')
if __name__ == '__main__':
start_server()
有什么办法可以解决这个问题?我可能不知道是不是鼠尾草制造商超时了?我不知道还有什么可能导致这种情况。服务器部分与教程基本没有变化,我没有在项目中的任何地方放置任何其他内容。
UPD ::我试图在本地进行设置,没有超时问题。因此,我想它以某种方式连接到AWS服务,而关于sagemaker文档的问题则毫无意义。
UPD2 ::因此,使用1个工作线程已解决了该问题。我在这些方面不是很好,但是在AWS sagemaker上的实例有4个CPU,因此有4个工人,并且由于某种原因每个工人都忙于相同的请求-第一个工人开始工作了一分钟,然后第二个工人工人,第三和第四位开始并完成了工作。然后,我想第三位工人继续并完成了工作,依此类推。
那么,新问题是,为什么会这样?