Увеличение количества запросов заканчивается сообщением «Ошибка: зависание сокета» - PullRequest
0 голосов
/ 05 октября 2018

Backend service / nginx proxy начинает отвечать на сообщение «Ошибка: сокет зависает» при увеличении количества запросов.Настройка выглядит следующим образом.

ОС: CentOS 6

Служба экспресс-доставки JS -> прокси-сервер nginx -> приложение фляги, запущенное Gunicorn

Приложение JS отправляет несколько запросов нав то же время другой сервис, когда количество запросов превышает ~ 100, начинает возвращать сообщения об ошибках.Если число меньше, все работает нормально.

Я следовал примеру конфигурации nginx, которая есть в документации Gunicorn + увеличение лимита времени ожидания + увеличение лимита открытых файлов nginx.Я также попробовал опцию keepalive, но проблема все еще остается.Gunicorn не показывает никаких ошибок.

Фрагмент конфигурации nginx:

upstream app_server {
    server 127.0.0.1:8000 fail_timeout=0;
    keepalive 100;
}

server {
    listen 5001;
    client_max_body_size 4G;

    keepalive_timeout 300;

    root /path/to/app/current/public; # static files

    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
        # Timeouts
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        send_timeout 300;

        proxy_http_version 1.1;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server;
    }
}

Ответ об ошибке, полученный от прокси:

{ RequestError: Error: socket hang up
    at new RequestError (/home/pm2deploy/apps/app-backend/source/node_modules/request-promise-core/lib/errors.js:14:15)
    at Request.plumbing.callback (/home/pm2deploy/apps/app-backend/source/node_modules/request-promise-core/lib/plumbing.js:87:29)
    at Request.RP$callback [as _callback] (/home/pm2deploy/apps/app-backend/source/node_modules/request-promise-core/lib/plumbing.js:46:31)
    at self.callback (/home/pm2deploy/apps/app-backend/source/node_modules/request/request.js:185:22)
    at Request.emit (events.js:160:13)
    at Request.onRequestError (/home/pm2deploy/apps/app-backend/source/node_modules/request/request.js:881:8)
    at ClientRequest.emit (events.js:160:13)
    at Socket.socketOnEnd (_http_client.js:423:9)
    at Socket.emit (events.js:165:20)
    at endReadableNT (_stream_readable.js:1101:12)
    at process._tickCallback (internal/process/next_tick.js:152:19)
  name: 'RequestError',
  message: 'Error: socket hang up',
  cause: { Error: socket hang up
    at createHangUpError (_http_client.js:330:15)
    at Socket.socketOnEnd (_http_client.js:423:23)
    at Socket.emit (events.js:165:20)
    at endReadableNT (_stream_readable.js:1101:12)
    at process._tickCallback (internal/process/next_tick.js:152:19) code: 'ECONNRESET' },
  error: { Error: socket hang up
    at createHangUpError (_http_client.js:330:15)
    at Socket.socketOnEnd (_http_client.js:423:23)
    at Socket.emit (events.js:165:20)
    at endReadableNT (_stream_readable.js:1101:12)
    at process._tickCallback (internal/process/next_tick.js:152:19) code: 'ECONNRESET' },
  options:
   { method: 'PUT',
     uri: 'http://localhost:5001/transformers/segmentAvg',
     qs:
      { stdMultiplier: 2,
        segmentLeft: 1509366682333,
        segmentRight: 1509367401685 },
     body: { index: [Array], values: [Array] },
     headers: {},
     json: true,
     callback: [Function: RP$callback],
     transform: undefined,
     simple: true,
     resolveWithFullResponse: false,
     transform2xxOnly: false },
  response: undefined }

ДОБАВЛЕНО:

В журнале ОС была зафиксирована следующая запись:

possible SYN flooding on port X. Sending cookies.

1 Ответ

0 голосов
/ 13 декабря 2018

Задержка сокета ядра достигла предела и отбросила следующие запросы.

Причина: сбрасывание TCP-соединений ядром из-за переполнения буфера сокетов LISTEN в Red Hat Enterprise Linux

Увеличение предела ожидания сокета ядра

Проверьте текущее значение:

# sysctl net.core.somaxconn
net.core.somaxconn = 128

Увеличьте значение:

# sysctl -w net.core.somaxconn=2048
net.core.somaxconn = 2048

Подтвердите изменение, просмотрев снова:

# sysctl net.core.somaxconn
net.core.somaxconn = 2048

Сохраните изменение:

echo "net.core.somaxconn = 2048" >> /etc/sysctl.conf

Увеличение журнала ожидания прослушивания сокета приложения

Параметр конфигурации uWSGI

listen=1024

Это решение взято из https://access.redhat.com/solutions/30453

...