LINUX.ORG.RU
ФорумAdmin

Nginx: не получается выжать 1M RPS

 


3

8

Начну сразу с вопроса: реально ли это в моём случае? Имеется два блейда с Xeon E5-2620 и 10G канал между ними. Один двухголовый и на нем крутится Nginx, второй лишь с одним CPU и я запускаю на нем wrk (12 потоков, 1000 соединений), конфиг стандартный, но для теста производительности nginx всегда возвращает код 200. У меня получилось выжать где-то 205K RPS, что совсем не вяжется с заявлениями, что nginx с лёгкостью может и миллион. Я так понимаю, узкое место - это wrk?

★★★★★

Последнее исправление: Meyer (всего исправлений: 2)
Ответ на: комментарий от turtle_bazon

Вот и я озадачен, что за хрень.

Meyer ★★★★★
() автор топика
Ответ на: комментарий от Vlad-76

Памяти свободной дофига и больше, процессор он вроде до предела не нагружает. Как уже говорил, на одной машине я запускаю wrk, а nginx всегда отдаёт response 200. В случае с hello-world HTML страничкой тоже ничего не меняется.

Meyer ★★★★★
() автор топика
Ответ на: комментарий от Vlad-76

На все (workers_processes auto создаёт 24 потока), нагружены примерно на 80%.

Meyer ★★★★★
() автор топика
Ответ на: комментарий от Vlad-76

Прерывания от сетевухи раскидал по всем ядрам скриптом из ixgbe драйвера.

Meyer ★★★★★
() автор топика
worker_processes     24;
worker_rlimit_nofile 262144;

daemon off;

events {
  use epoll;
  worker_connections 16384;
}

error_log error.log;
pid nginx.pid;


http {
  access_log off;
  sendfile   on;
  tcp_nopush on;

  keepalive_requests 100;
  open_file_cache max=100;

  server {
    listen [::]:8080 ipv6only=off reuseport backlog=16384;

    location / {
      root   html;
      index  index.html;
    }
  }
}


и вот

./wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
Running 30s test @ http://127.0.0.1:8080/index.html
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   592.47us    3.19ms 126.50ms   97.55%
    Req/Sec   104.25k     5.42k  139.93k    86.36%
  37427950 requests in 30.10s, 29.59GB read
Requests/sec: 1243449.23
Transfer/sec:      0.98GB

st4l1k ★★
()

У меня на двуядерной виртуалке где рядом еще другие толкались пару лет назад сабж выдавал на wrk + return 200 (как у тебя 1 в 1) 500к в секунду без проблем. Так что на 24 ядрах зависимость должна быть линейная.

Включи REUSEPORT, он сильно ускоряет. https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/

blind_oracle ★★★★★
()
Последнее исправление: blind_oracle (всего исправлений: 1)
Ответ на: комментарий от blind_oracle

Включил, раскидал прерывания от сетевухи по всем ядрам (на машине с wrk), стало где-то 550K.

Meyer ★★★★★
() автор топика
Ответ на: комментарий от blind_oracle

Запас по цпу на сервере с nginx то есть?

Да, судя по всему он не особо напрягается. Когда пытаюсь запускать wrk больше чем в 12 потоков (количество ядер на той машине вместе с HT), то RPS резко падает.

Meyer ★★★★★
() автор топика

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

Dred ★★★★★
()
Ответ на: комментарий от Meyer

Треды не трогай. Коннектов больше сделай, не 400 а там пару тысяч.

У тебя среднее ртт 0.5мс, в реальности повыше. В итоге 400 коннектов в 1 секунду могут сделать не более 400 * 1000мс / rtt запросов.

Это и есть твой лимит.

blind_oracle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.