Почему Gunicorn перезапускается без ошибок?

Каждый. У меня проблема с gunicorn (в приложении с колбами), который используется для запуска конечной точки AWS sagemaker. Он работал нормально до сих пор, когда процесс занимает более 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 "{}";
    }
  }
}

файл оружейного сервера:

#!/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 ЦП, следовательно, 4 рабочих, и по какой-то причине каждый сотрудник был занят одним и тем же запросом: первый работал, работал в течение минуты, затем второй рабочий, третий и четвертый начали и закончили работу. Затем, я полагаю, третий рабочий продолжил и закончил, и так далее.

Итак, новый вопрос, почему это происходит?

0 ответов

Другие вопросы по тегам