1. 1
  2. 2
  3. 3
  4. 4

# конспект · шаг 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 «лучшее из трёх» дважды дало противоположный вывод, картина сложилась только на семи;
  • каталог кеша перед прогоном чистят - иначе сравниваешь не то, что думаешь.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.