Назад | Перейти на главную страницу

AWS Elastic Beanstalk - сбой сокета на сервере Puma при наличии более 300 подключений одновременно.

Я столкнулся с, возможно, странной проблемой в среде AWS Elastic Beanstalk. Я получаю следующую ошибку nginx, когда на одном экземпляре одновременно установлено более 300 подключений:

2018/03/23 20:56:53 [ошибка] 5431 # 0: * 4121 connect () to unix: ///var/run/puma/my_app.sock не удалось (11: ресурс временно недоступен) при подключении к восходящему потоку, клиент: 🐙, сервер: _, запрос: "GET / api / v1 / podcasts / HTTP / 1.1", восходящий поток: "http: // unix: ///var/run/puma/my_app.sock: / api / v1 / podcasts /", хост: 🐙

В моей конфигурации Puma есть

bind "unix:///var/run/puma/my_app.sock"

И в конфигурации nginx на экземпляре EC2, похоже, правильно настроен сокет (конфигурация nginx по умолчанию, предоставленная EBS).

Так что да, я понятия не имею, чем это вызвано. Любые идеи? Спасибо!

Хорошо разбираясь в проблеме и конфигурациях, сбой связан с превышением лимита ресурсов. Возможно два ресурса ОС:

  • дескрипторы открытых файлов
  • процессы, доступные одному пользователю. Просто чтобы устранить ограничение процесса, держите значение nproc в экземпляре EC2 на очень высоком или неограниченном уровне.

    sudo vi /etc/security/limits.conf

Обратитесь эта ссылка для краткого представления. Итак, поскольку у вас не может быть worker_rlimit_nofile больше, чем ulimit, установленный на сервере, первым подходом будет вычисление параметров nginx и настройка в соответствии с требованиями:

Мы можем служить worker_processes * worker_connections / ( keepalive_timout * 2 ) users per second.

Это руководство по масштабированию может помочь вам в количественной оценке значений, которые вам следует увеличить и определить. После того, как вы закончите определение значений для своего веб-сервера, вам нужно будет обновить пределы, установив более высокие или равные значения. Проверьте, до какой степени параллелизма пользователей работает сервер, чтобы помочь вам выполнить масштабирование.