Fernus
@Fernus
Техник - Механик :)

NGINX + LUA = Benchmark. У кого есть опыт?

Вопрос немного риторический...

Есть такой стек:

NGINX + LUA
В LUA используется проверка кое-чего по ключу в Redis: если он есть, то отдаём статику...иначе - 404...

Всё ништяк - всё работает :)

Вопрос вот в чём:
До "прикручивания" проверки на LUA в NGINX'е с помощью теста нагрузки через WRK он показывал около 370 запросов/сек и трафик около 10.5Мб/сек...
После "прикручивания" проверки - показывает примерно столько же: 360 запросов/сек и 10.3Мб/сек...

Т.е. мой скрипт на LUA особо ничего не поменял в плане производительности...
Размер отдаваемого статического файла на котором запускался тест около ~30кб...
Моя скорость инета по замеру speedtest.net около 90Мбит/сек...

Сервер в Германии (Hetzner). Я запускал тест со своего компа из России...в 8 потоков и 200 соединений в течение 15 сек...
wrk -t8 -c200 -d15s --latency http://example.com/file.jpg


Это нормальная отдача?
Что можно улучшить? Если учесть, что без всяких скриптов, получается, что benchmark почти такой же (можно списать на погрешность даже думаю)...

Ниже основные параметры конфига NGINX'а привожу:

nginx.conf:
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 65535;
    use epoll;
    multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;

	keepalive_timeout  30;
    keepalive_requests 100;

	client_body_timeout 10;
    client_header_timeout 15;

    reset_timedout_connection on;

    send_timeout 2;
	types_hash_max_size 4096;
	server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

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

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	#access_log /var/log/nginx/access.log;
	#error_log /var/log/nginx/error.log;

    access_log off;
    error_log /var/log/nginx/error.log crit;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

	##
	# Virtual Host Configs
	##

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


Вот часть "хоста" с LUA скриптом:
#.. тут стандартная "петушня"...

location ~* ^ХАЛИ_ГАЛИ_ТЫРЫМ_ПЫРЫМ$ {
    #set $images_dir "PATH_TO_FOLDER";
    # $4 - берётя из location...    

    # Выносим весь Lua код в отдельный файл
    content_by_lua_file /etc/nginx/lua/img_data.lua;
    #lua_code_cache off; #dev

}

# Этот "локатион" вызывается из LUA в случае "успеха", иначе сразу - 404 прям из LUA с помощью - ngx.exit(ngx.HTTP_NOT_FOUND)
location @imagedata {

    try_files /$images_dir/$4 =404;

}

#...далее тоже ничего значительного...


Железо:
Intel Xeon E3-1275v5
2x HDD SATA (RAID 1)
4x RAM 16384 МБ DDR4 ECC
ОС:
Debian 9

Мне кажется, что можно лучше... :)

UPD:
Взял щас к примеру вот такую картинку с сервера Яндекса (маркет):
https://avatars.mds.yandex.net/get-mpic/1883514/im...

Запустил аналогичный тест и получил около 200 запросов в секунду...и тот же трафик около 10Мб/сек при весе этой картинки 35кб...

Походу с производительностью всё норм получается...если посчитать Яндекс за эталон (но это не точно:) )...
Либо я тупо упираюсь в канал передачи данных...
  • Вопрос задан
  • 347 просмотров
Решения вопроса 3
Fernus
@Fernus Автор вопроса
Техник - Механик :)
Удалось увеличить производительность примерно на 5% (слёзы конечно, но может и нереально больше выжать из текущего стека)...

В nginx.conf добавляем в секцию events:
accept_mutex off;

В "хостах":
aio threads;

При этом nginx должен быть собран с опцией:
--with-file-aio

Подробнее тут:
https://habr.com/ru/post/260669/

Но это не во всех случаях будет приемлемо...читаем - гуглим - вникаем...
Я после каждого изменения конфига прогонял тест несколько раз...

НО, всё равно, жду людей кто так же экспериментировал - буду благодарен, если ещё чего подскажите...

UPD:
По сравнению с предыдущими тестами щас стабильно держит на 100 запросов больше в сумме за 15 сек и на 15-20 за 1 сек...
Прирост отдачи "трафика" больше на ~1мб...

UPD2:
Текстовый файл содержащий "hello" отдаётся со скоростью ~2800 запросов в сек...

Вообщем, как и написали, дальше дело в сети...для реальных тестов её надо исключать...
Ответ написан
Комментировать
@rPman
Увеличивай количество потоков тестирования, очевидно же что основные тормоза у тебя из-за сетевой латенси
Локальный nginx на совсем убитой машине дает гигабайты на hello world статике и тысячи запросов в секунду.

В доказательство, попробуй запустить тесты локально на сервере.
Ответ написан
yellow79
@yellow79
Senior Software Engineer
Вы тестируете не производительность кода, а производительность сети от вашего компа до сервера в Германии. Если хотите реальные тесты производительности, то нужно убирать сеть. Описаный вами стек, без учёта сети, должен быть чуть хуже, чем производительность Nginx, и скорее всего это будут десятки, а то и сотни тысяч запросов в секунду
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы