Потрібно збільшити пропускну здатність nginx до розширення unix socket - налаштування ядра Linux?


28

Я запускаю сервер nginx, який виконує функцію проксі-сервера для висхідного unix-сокета, наприклад:

upstream app_server {
        server unix:/tmp/app.sock fail_timeout=0;
}

server {
        listen ###.###.###.###;
        server_name whatever.server;
        root /web/root;

        try_files $uri @app;
        location @app {
                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;
        }
}

Деякі процеси сервера додатків, у свою чергу, знімають запити, /tmp/app.sockколи вони стають доступними. Конкретний сервер додатків тут використовується Unicorn, але я не думаю, що це стосується цього питання.

Проблема полягає в тому, що, здається, що після певної кількості завантаження nginx не може отримати запити через сокет досить швидко. Не має значення, скільки процесів на сервері додатків я налаштував.

Я отримую затоплення цих повідомлень у журналі помилок nginx:

connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream

Багато запитів призводять до коду статусу 502 і тих, які не потребують тривалого часу. Статична черга запису nginx коливається біля 1000.

У будь-якому випадку, я відчуваю, що тут я пропускаю щось очевидне, тому що саме ця конфігурація nginx та сервера додатків є досить поширеною, особливо з Unicorn (насправді це рекомендований метод). Чи є параметри ядра Linux, які потрібно встановити, або щось у nginx? Будь-які ідеї про те, як збільшити пропускну здатність до висхідної сокети? Щось, що я явно роблю не так?

Додаткова інформація про навколишнє середовище:

$ uname -a
Linux servername 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

$ unicorn -v
unicorn v4.3.1

$ nginx -V
nginx version: nginx/1.2.1
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled

Поточні зміни ядра:

net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
net.netfilter.nf_conntrack_max = 524288

Обмежте налаштування для користувача nginx:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Ви перевіряли вихід ulimit, зокрема кількість відкритих файлів?
Халед

@Khaled, ulimit -nкаже 65535.
Бен Лі

Відповіді:


16

Здається, що вузьким місцем є додаток, що живить сокет, а не сам Nginx. Це ми багато бачимо з PHP, коли використовується з сокетами проти TCP / IP-з'єднання. У нашому випадку, вузькі місця PHP набагато раніше, ніж коли-небудь, ніж Nginx.

Чи перевірили ви обмеження відстеження з'єднання sysctl.conf, обмеження відставання сокета

  • net.core.somaxconn
  • net.core.netdev_max_backlog

2
Я зрозумів проблему. Дивіться відповідь, яку я опублікував. Насправді це було вузьке програмне забезпечення, а не розетка, як ви позичаєте. Я виключав це раніше через неправильну діагностику, але виявляється, що проблема була в пропускній спроможності до іншого сервера. Зрозумів це лише пару годин тому. Я збираюся нагородити вас винагородою, оскільки ви досить сильно прибив джерело проблеми, навіть незважаючи на неправильний діагноз, який я поставив у питанні; однак, я буду давати галочку на свою відповідь, оскільки моя відповідь описує точні обставини, тому може допомогти комусь у майбутньому у подібному питанні.
Бен Лі

Отриманий новий сервер перемістився в місце, щоб забезпечити адекватну пропускну спроможність, повністю відновив систему, і все ще виникає така ж проблема. Тож виявляється, що моя проблема врешті-решт не вирішена ... = (я все ще думаю, що це специфічно для додатків, але нічого не можу придумати. Цей новий сервер налаштований точно як інший сервер, де він працює добре. Так, somaxconn і netdev_max_backlog складаються правильно.
Бен Лі

Ваша проблема не nginx, вона більш ніж спроможна - але це не означає, що у вас не може бути налаштування негідника. Розетки особливо чутливі при великому навантаженні, коли межі неправильно налаштовані. Чи можете ви спробувати ваш додаток із tcp / ip замість цього?
Бен Лессані - Сонассі

така ж проблема з ще гіршою величиною за допомогою tcp / ip (черга запису піднімається ще швидше). У мене nginx / unicorn / kernel все налаштовано точно так само (наскільки я можу сказати) на іншій машині, і ця інша машина не проявляє цієї проблеми. (Я можу переключити dns між двома машинами, щоб пройти тестування навантаження та мати dns на 60-секундному ttl)
Бен Лі

Пропускна здатність між кожною машиною та db-машиною зараз однакова, а затримка між новою машиною та db-машиною приблизно на 30% більше, ніж між старою машиною та db. Але на 30% більше, ніж десята частина мілісекунди - це не проблема.
Бен Лі

2

Ви можете спробувати подивитися unix_dgram_qlen, перегляньте документи прок . Хоча це може ускладнити проблему, вказавши більше у черзі? Вам доведеться подивитися (netstat -x ...)


Будь-який прогрес у цьому?
jmw

1
Дякую за ідею, але, схоже, це не мало значення.
Бен Лі

0

Я вирішив, збільшивши кількість відстаючих у config / unicorn.rb ... У мене було відставання 64.

 listen "/path/tmp/sockets/manager_rails.sock", backlog: 64

і я отримував цю помилку:

 2014/11/11 15:24:09 [error] 12113#0: *400 connect() to unix:/path/tmp/sockets/manager_rails.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 192.168.101.39, server: , request: "GET /welcome HTTP/1.0", upstream: "http://unix:/path/tmp/sockets/manager_rails.sock:/welcome", host: "192.168.101.93:3000"

Тепер я збільшився до 1024, і я не отримую помилки:

 listen "/path/tmp/sockets/manager_rails.sock", backlog: 1024

0

тл; д-р

  1. Переконайтесь, що відставання Unicorn є великим (використовуйте розетку, швидше, ніж TCP) listen("/var/www/unicorn.sock", backlog: 1024)
  2. Оптимізуйте , наприклад, параметри продуктивності NGINXworker_connections 10000;

Обговорення

У нас була така ж проблема - додаток Rails, що обслуговується Unicorn за реверсним проксі-сервером NGINX.

Ми отримували такі рядки в журналі помилок Nginx:

2019/01/29 15:54:37 [error] 3999#3999: *846 connect() to unix:/../unicorn.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: xx.xx.xx.xx, request: "GET / HTTP/1.1"

Читаючи інші відповіді, ми також зрозуміли, що, можливо, Єдиноріг винен, тому ми збільшили його відставання, але це не вирішило проблему. Під час моніторингу серверних процесів було очевидно, що Unicorn не отримує запитів працювати, тому NGINX виявився вузьким місцем.

Пошук налаштувань NGINX для налаштування в nginx.confцій статті про налаштування продуктивності вказав на кілька параметрів, які можуть впливати на кількість паралельних запитів, які може обробити NGINX, особливо:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 400000; # important

events {    
  worker_connections 10000; # important
  use epoll; # important
  multi_accept on; # important
}

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  keepalive_requests 100000; # important
  server_names_hash_bucket_size 256;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.