# конспект · шаг 4 из 4
Конспект: большие файлы и замеры
Как файл уезжает клиенту и что настраивают, когда файлы большие.
Базовый набор
sendfile on; # ядро отправляет файл напрямую, не таща его через процесс
tcp_nopush on; # заголовки и начало файла уходят одним пакетом
sendfile on в официальном образе уже стоит - проверь nginx -T | grep
sendfile, прежде чем добавлять его как оптимизацию.
Когда sendfile мешает
location /video/ {
aio threads; # чтение с диска - в пул потоков
directio 16m; # файлы больше 16 МБ - мимо кеша страниц
output_buffers 2 1m;
}
Это настройки под конкретную нагрузку: файлы, которые не помещаются в память
целиком (видео, образы, архивы). На сайте с картинками и CSS они не дадут ничего,
а directio даже навредит - отключит кеш там, где он работал.
Ограничение полосы
limit_rate_after 10m; # первые 10 МБ на полной скорости
limit_rate 2m; # дальше 2 МБ/с
limit_conn perip 2; # не больше двух параллельных скачиваний с адреса
Смысл пары: короткие файлы отдаются мгновенно, а длинная выгрузка не забирает канал целиком.
Как мерить, а не угадывать
$ команда
curl -o /dev/null -s -w 'ttfb=%{time_starttransfer} total=%{time_total} speed=%{speed_download}\n' https://shop.local/big.iso
ttfb большой - проблема до начала отдачи (бэкенд, диск); total большой при
маленьком ttfb - узкий канал или лимит.
Ловушки джокера
- Ставить
aio/directio«на всякий случай» - без большой раздачи это ухудшение, а не оптимизация. limit_rateбезlimit_rate_afterзамедляет и мелкие файлы, включая страницы.- Мерить скорость браузером - там своя очередь и кеш; для замеров есть
curlс-w.
Что показал стенд
| опыт | результат |
|---|---|
| файл 2 МБ без ограничений | 0,003 с |
limit_rate 512k |
3,01 с |
limit_rate 512k плюс limit_rate_after 1m |
1,00 с |
nginx -V официального образа |
--with-file-aio --with-threads - aio threads доступен |
limit_rate без limit_rate_after режет и обычные страницы, а не только
закачки: вешать его надо на location с файлами.
Как мерить, чтобы не соврать
- один параметр за раз, прогретый кеш, повторный прогон;
- ограничение канала ставят на ту сторону, где идут данные;
- при большом разбросе трёх прогонов мало: на замере h2/h3 «лучшее из трёх» дважды дало противоположный вывод, картина сложилась только на семи;
- каталог кеша перед прогоном чистят - иначе сравниваешь не то, что думаешь.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий