Чи Nginx мертвий? Чи Traefik v3 на 20% швидший, ніж Traefik v2?

pic

Фото на doc.traefik.io

Подивление на те, як веб-додатки стають більш складними і інтенсивними з точки зору трафіку, вибір високопродуктивного сервера оберненої проксі-напрямної дії є критичним для надання швидкого та надійного контенту користувачам. Traefik v3 та Nginx - це два широко використовувані сервери оберненої проксі, що пропонують потужні можливості роботи з HTTP. Однак їх підходи до обробки HTTP-запитів та відповідей можуть значно відрізнятися, що призводить до різниці в пропускній здатності, часі відповіді та використанні ресурсів.

У цій статті я порівняю HTTP-продуктивність Traefik v3 та Nginx, зосереджуючись на метриках, таких як швидкість запиту, час відповіді та використання ресурсів. Я також розгляну фактори, які можуть впливати на продуктивність кожного інструменту, такі як параметри конфігурації, алгоритми балансування навантаження та механізми кешування. До кінця цієї статті ви повинні мати краще розуміння сильних та слабких сторін Traefik v3 та Nginx з точки зору HTTP-продуктивності і зможете визначити, який інструмент найкраще підходить для вашого конкретного випадку використання.

Мета

Метою цієї статті є порівняння HTTP-продуктивності Traefik v3 та Nginx, двох популярних серверів оберненої проксі, що використовуються в сучасних хмарних середовищах. Хоча Traefik v3 все ще знаходиться в бета-версії, команда Traefik твердить, що він забезпечує на 20% кращу HTTP-продуктивність, ніж його попередник Traefik v2. Я маю намір перевірити цей ствердження та надати об'єктивне порівняння HTTP-продуктивності Traefik v3 з Nginx. Проведенням власних тестів продуктивності та діленням результатів ми сподіваємося допомогти розробникам та командам DevOps у прийнятті обґрунтованих рішень при виборі сервера оберненої проксі для своїх додатків.

[

Traefik Proxy 3.0: Scope and Beta Program | Traefik Labs

Великі новини для всіх наших користувачів Traefik Proxy, Traefik Proxy 3.0 майже тут! Між хакаєтоном, великою кількістю…

traefik.io

](https://traefik.

Випробувальні випадки

Для порівняння продуктивності HTTP Traefik v3, Nginx, Traefik v2 та пурамі whoami я провів серію тестів за допомогою інструменту для тестування wrk. Я використовував віртуальну машину з 16 віртуальними ядрами, 32 ГБ ОЗУ, операційною системою Fedora та Docker v23.0.2. На віртуальній машині запущено зразок додатку API (whoami/go), який має простий REST API, що повертає JSON відповідь(1).

Спочатку я випробував максимальну швидкість запитів, яку кожен інструмент може обробити, утримуючи стабільний час відповіді. Для Traefik v3 я використав налаштування за замовчуванням з алгоритмом обрання RoundRobin і без кешування. Для Nginx я використовував налаштування за замовчуванням з алгоритмом обрання та без кешування. Я записав досягнуту швидкість запитів та середній час відповіді.

version: "3.9"

services:
traefik-v3.0:
image: "traefik:v3.0"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:8000"
- "--serverstransport.maxidleconnsperhost=100000"
ports:
- "8000:8000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"

traefik-v2.9:
image: "traefik:v2.9"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:8002"
- "--serverstransport.maxidleconnsperhost=100000"
ports:
- "8002:8002"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"

nginx:
image: nginx:alpine
ports:
- "8001:8001"
volumes:
- "./nginx.conf:/etc/nginx/nginx.conf:ro"
- "./whoami.conf:/etc/nginx/conf.d/whoami.conf:ro"

whoami-1:
image: "containous/whoami"
ports:
- "8003:80"
labels:
- "traefik.

enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

whoami-2:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

whoami-3:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

whoami-4:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

user nginx;
workerprocesses auto;
worker
rlimit_nofile 200000;
pid /var/run/nginx.pid;

events {
workerconnections 10000;
use epoll;
multi
accept on;
}

http {
sendfile on;
tcpnopush on;
tcp
nodelay on;
keepalivetimeout 300;
keepalive
requests 10000;
typeshashmax_size 2048;

openfilecache max=200000 inactive=300s;
openfilecachevalid 300s;
open
filecacheminuses 2;
open
filecacheerrors on;

servertokens off;
dav
methods off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

accesslog /var/log/nginx/access.log combined;
error
log /var/log/nginx/error.log warn;

gzip off;
gzip_vary off;

include /etc/nginx/conf.d/.conf;
include /etc/nginx/sites-enabled/
.conf;
}

upstream whoami {
server whoami-1:80;
server whoami-2:80;
server whoami-3:80;
server whoami-4:80;
keepalive 300;
}

server {
listen 8001;
server_name benchmark.

Переклад

nginx
enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

whoami-2:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

whoami-3:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

whoami-4:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(benchmark.whoami)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"

nginx
user nginx;
workerprocesses auto;
worker
rlimit_nofile 200000;
pid /var/run/nginx.pid;

events {
workerconnections 10000;
use epoll;
multi
accept on;
}

http {
sendfile on;
tcpnopush on;
tcp
nodelay on;
keepalivetimeout 300;
keepalive
requests 10000;
typeshashmax_size 2048;

openfilecache max=200000 inactive=300s;
openfilecachevalid 300s;
open
filecacheminuses 2;
open
filecacheerrors on;

servertokens off;
dav
methods off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

accesslog /var/log/nginx/access.log combined;
error
log /var/log/nginx/error.log warn;

gzip off;
gzip_vary off;

include /etc/nginx/conf.d/.conf;
include /etc/nginx/sites-enabled/
.conf;
}

nginx
upstream whoami {
server whoami-1:80;
server whoami-2:80;
server whoami-3:80;
server whoami-4:80;
keepalive 300;
}

server {
listen 8001;
server_name benchmark.

Переклад

nginx
Прослуховувач подій (Event Listener):
server whoami-1:80;
server whoami-2:80;
server whoami-3:80;
server whoami-4:80;
keepalive 300;
}

server {
listen 8001;
server_name benchmark.

whoami;
access_log вимкнено;
error_log /dev/null crit;

location / {
proxy_pass http://whoami;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 80;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $server_addr;
proxy_set_header X-Real-IP $remote_addr;
}
}

sysctl -w fs.file-max="9999999"
sysctl -w fs.nr_open="9999999"
sysctl -w net.core.netdev_max_backlog="4096"
sysctl -w net.core.rmem_max="16777216"
sysctl -w net.core.somaxconn="65535"
sysctl -w net.core.wmem_max="16777216"
sysctl -w net.ipv4.ip_local_port_range="1025 65535"
sysctl -w net.ipv4.tcp_fin_timeout="30"
sysctl -w net.ipv4.tcp_keepalive_time="30"
sysctl -w net.ipv4.tcp_max_syn_backlog="20480"
sysctl -w net.ipv4.tcp_max_tw_buckets="400000"
sysctl -w net.ipv4.tcp_no_metrics_save="1"
sysctl -w net.ipv4.tcp_syn_retries="2"
sysctl -w net.ipv4.tcp_synack_retries="2"
sysctl -w net.ipv4.tcp_tw_reuse="1"
sysctl -w vm.min_free_kbytes="65536"
sysctl -w vm.overcommit_memory="1"
ulimit -n 9999999

[

GitHub - thecaliskan/traefik-nginx-benchmark

You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or…

github.com
](https://github.com/thecaliskan/traefik-nginx-benchmark?source=post_page-----f28ffb7eed3e--------------------------------)

Результат

pic

Запитів на сек

pic

Трансфер за сек (МБ)

pic

Затримка / Розподіл (мс)

Використання ЦП

![image](https://miro.medium.

markdown

Використання ЦП (Traefik v3.0.0-beta2)

pic

Використання ЦП (Nginx v1.23.4)

pic

Використання ЦП (Traefik v2.9.9)

pic

Використання ЦП (Чистий Whoami)

RAW Результат

Traefik v3.0.0-beta2

wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8000/bench
Виконання тесту протягом 1 хвилини @ http://127.0.0.1:8000/bench
20 потоків та 1000 з'єднань
Середнє Середнє Квадратичне Відхилення Макс +/- Відхилення
Затримка 13.68мс 7.08мс 93.26мс 72.09%
Запитів/сек 3.72тис. 312.65 10.22тис. 78.63%
Розподіл Затримки
50% 12.56мс
75% 17.31мс
90% 22.93мс
99% 35.96мс
4448396 запитів за 1.00 хв, 432.72МБ завантажено
Запитів/сек: 74019.30
Передача/сек: 7.20МБ

Nginx v1.23.4

wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8001/bench
Виконання тесту протягом 1 хвилини @ http://127.0.0.1:8001/bench
20 потоків та 1000 з'єднань
Середнє Середнє Квадратичне Відхилення Макс +/- Відхилення
Затримка 10.10мс 5.46мс 64.40мс 73.77%
Запитів/сек 5.06тис. 383.06 13.97тис. 73.18%
Розподіл Затримки
50% 9.18мс
75% 12.73мс
90% 17.02мс
99% 28.29мс
6047306 запитів за 1.00 хв, 813.17МБ завантажено
Запитів/сек: 100622.14
Передача/сек: 13.53МБ

Traefik v2.9.9

wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8002/bench
Виконання тесту протягом 1 хвилини @ http://127.0.0.1:8002/bench
20 потоків та 1000 з'єднань
Середнє Середнє Квадратичне Відхилення Макс +/- Відхилення
Затримка 13.70мс 7.04мс 91.19мс 72.17%
Запитів/сек 3.71тис. 273.76 14.31тис. 75.23%
Розподіл Затримки
50% 12.59мс
75% 17.30мс
90% 22.89мс
99% 35.87мс
4438613 запитів за 1.00 хв, 431.77МБ завантажено
Запитів/сек: 73853.32
Передача/сек: 7.

18MB

Чистий Whoami (без проксі)

wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8003/bench
Виконання тесту протягом 1 хвилини @ http://127.0.0.1:8003/bench
20 потоків та 1000 з'єднань
Статистика потоків Сер. Ст. Велике +/- Ст.
Затримка 5.47мс 3.18мс 40.75мс 78.18%
Зап/сек 9.21тис. 746.51 29.25тис. 74.50%
Розподіл затримок
50% 4.95мс
75% 6.61мс
90% 9.02мс
99% 17.43мс
11014279 запитів за 1.00 хв, 1.29ГБ прочитано
Запитів/сек: 183259.27
Передача/сек: 22.02MB

Висновок

Тестування продуктивності, порівнюючи Nginx та Traefik v3 для обробки HTTP-запитів, показали цікаві результати. Nginx зміг досягти вищої швидкодії, ніж Traefik v3, з продуктивністю 100622 запити на секунду (rps) у порівнянні з 73960 rps у Traefik v3. Traefik v3 продемонстрував високу продуктивність затримки, з середнім часом відповіді 13.39мс порівняно з 10.10мс Nginx. Щодо швидкості передачі, Nginx був здатний обробляти велику кількість даних за секунду, зі швидкістю передачі 13.53МБ/с порівняно з 7.19МБ/с Traefik v3.

Загалом, висновок із тестування, порівнюючи Traefik v3 та Nginx для обробки HTTP-запитів, показав, що Traefik v3 не поставляє 20% покращення продуктивності HTTP над своїм попередником, Traefik v2, як стверджувала команда Traefik. Фактично результати показали, що Nginx перевершує Traefik v3 за кількістю оброблених запитів і затримкою. Хоча Traefik v3 все ще знаходиться в бета-версії і може бути покращений, тести підказують, що він може не бути найкращим вибором для додатків з великим обсягом трафіку та вимогливих до продуктивності.

В цілому, вибір між Nginx та Traefik v3 для обробки HTTP-запитів залежить від конкретних вимог вашого веб-додатка. Якщо основною проблемою є обсяг оброблених запитів та мінімальна затримка, то Nginx може бути кращим варіантом.

Traefik v3’s динамічна конфігурація та автоматичне виявлення сервісів робить його більш гнучким та простіше інтегрованим з сучасними контейнерними середовищами. Крім того, інші фактори, такі як легкість використання, гнучкість та підтримка спільноти, також слід враховувати при виборі зворотного проксі-сервера. У кінцевому підсумку, рекомендую провести власні тести продуктивності та розглянути всі відповідні фактори перед ухваленням остаточного рішення.

Перекладено з: Is Nginx dead? Is Traefik v3 20% faster than Traefik v2?

Leave a Reply

Your email address will not be published. Required fields are marked *