Почему gzip_static лучше gzip?

· На чтение уйдёт 4 минуты · (833 слова)

В одном из комментариев у меня спросили, почему не использовать обычный gzip вместо gzip_static. Давайте попробую объяснить, за что я люблю именно gzip_static, и почему его использование - это очень хорошо.
По сути, у серверов есть четыре основных ресурса: память, процессор, жесткий диск и полоса пропускания канала.

Для тестирования возьмем синтетический достаточно большой файл в 301.26 КБайт. Сделаем мы его, объединив все файлы из каталога JQuery в WordPress. Экономией памяти при отдаче небольшого файла можно пренебречь: память все равно будет мгновенно освобождена. Лишним потреблением места на диске – думаю, тоже. Лог-файлы куда больше места занимают :). А вот на расходование ресурсов процесора и экономию канала – посмотрим ниже.

Приступим! Нам важно знать, что у gzip есть несколько степеней сжатия (от 1 до 9, чем эта цифра больше, тем лучше результат). Попробуем сжать наш файл со всеми возможными степенями сжатия:

for i in `seq 1 9`; do cat ji.js | gzip -$i > ji.js.$i.gz; done
ls -l ji.js*
-rw-r--r-- 1 baron baron 308497 Jul 12 22:52 ji.js
-rw-r--r-- 1 baron baron 109960 Jul 12 22:55 ji.js.1.gz
-rw-r--r-- 1 baron baron 106027 Jul 12 22:55 ji.js.2.gz
-rw-r--r-- 1 baron baron 102998 Jul 12 22:55 ji.js.3.gz
-rw-r--r-- 1 baron baron  96356 Jul 12 22:55 ji.js.4.gz
-rw-r--r-- 1 baron baron  93214 Jul 12 22:55 ji.js.5.gz
-rw-r--r-- 1 baron baron  92371 Jul 12 22:55 ji.js.6.gz
-rw-r--r-- 1 baron baron  92194 Jul 12 22:55 ji.js.7.gz
-rw-r--r-- 1 baron baron  92109 Jul 12 22:55 ji.js.8.gz
-rw-r--r-- 1 baron baron  92109 Jul 12 22:55 ji.js.9.gz

Из результатов видно, что для достижения хорошего результата достаточно использовать сжатие со степенью 4 или 5. Как правило, при включении динамического сжатия, используется один из этих коэффициентов. Очевидно, использование сжатия даже 1 степени, значительно экономит ресурсы канала. Но сжатие 9 степени экономит ресурсы канала эффективнее на несколько процентов. В данном случае, сжатый файл занимает от 35.64% до 29.85% от оригинала. Но посмотрим, какой ценой это достигается:

Сожмем файл 100 раз, для оценки затрат процессора. Для этого создадим скрипт такого содержания:

for i in `seq 1 100`; do cat ji.js | gzip -$1 >/dev/null; done

Выполним скрипт с каждым параметром сжатия от 1 до 9:

for i in `seq 1 9`; do time sh ji.sh $i 2>&1 ; done
sh ji.sh $i 2>&1  0.00s user 0.02s system 2% cpu 0.912 total
sh ji.sh $i 2>&1  0.01s user 0.02s system 3% cpu 0.983 total
sh ji.sh $i 2>&1  0.87s user 0.15s system 90% cpu 1.130 total
sh ji.sh $i 2>&1  0.92s user 0.10s system 82% cpu 1.232 total
sh ji.sh $i 2>&1  0.91s user 0.11s system 64% cpu 1.576 total
sh ji.sh $i 2>&1  1.01s user 0.08s system 55% cpu 1.969 total
sh ji.sh $i 2>&1  1.93s user 0.09s system 91% cpu 2.202 total
sh ji.sh $i 2>&1  1.94s user 0.08s system 75% cpu 2.669 total
sh ji.sh $i 2>&1  1.99s user 0.03s system 73% cpu 2.762 total

Опять-таки, наиболее приемлемые с точки зрения затрат процессорного времени результаты показывает сжатие со степенью 4 или 5. Такое сжатие работает в 2 раза быстрее, чем сжатие со степенью сжатия 8.

Составим небольшую таблицу.

Характеристика 100 файлов займут На 100 отдач процессора
Файл без сжатия 30849700 0
Динамическое 1 10996000 0.02
Динамическое 2 10602700 0.03
Динамическое 3 10299800 1.02
Динамическое 4 9635600 1.02
Динамическое 5 9321400 1.02
Динамическое 6 9237100 1.09
Динамическое 7 9219400 2.02
Динамическое 8 9210900 2.02
Динамическое 9 9210900 2.02
Статическое 9 9210900 0

Таким образом, статическое сжатие по эффективности равно динамическому сжатию 9. При этом ресурсы процессора не расходуются. Если же мы выбираем “стандартное” сжатие 4, то мы отдаем на 4.6% больше трафика по сравнению со статическим сжатием. Также, на 100 отдач расходуется примерно секунда процессорного времени. Вообще, “минусом” от включения gzip_static часто можно пренебречь: необходимость держать в дисковом кэше лишнюю сотню килобайт на сайт – не проблема. А еще хардлинки есть… :)

4,5% – много это или мало? Решать нужно индивидуально. Очевидно, что если сайт находится в разработке, т.е. стили и скрипты меняются по несколько раз на дню, использовать статическое сжатие – не лучшая возможность. Ведь каждый раз необходимо обновить заранее подготовленную копию файла.

Однако, бывает и наоборот – когда сайт имеет многотысячную (а то и многомиллионную аудиторию), работает на кластере серверов и все равно не справляется с задачей (например, lenta.ru неоднократно вынуждена была включать “облегченную версию”, без картинок, использующихся для оформления сайта). И в этом случае экономия даже жалких 4% канала – огромна.

Однако, администрировать новостные сайты, подобные Ленте, доводится не всем. Впрочем, вот еще другой пример. У моего знакомого, занимавшегося сателлитостроением, на одном сервере “крутилось” около 3000 сателлитов – с разной посещаемостью, часть правда совсем убитые. На этой отметке его сервер перестал справляться с нагрузкой, знакомый интересовался, смогу ли я ему настроить новый сервер. Впрочем, разрешили ситуацию к обоюдному удовлетворению: радикально снизили загрузку существующего сервера. Там правда проблема была не в процессоре, а в чрезмерной прожорливости Вордпресса.

Это я все к тому, что незначительная в масштабах одной операции выгода, может стать весьма заметной после роста системы. Разумеется, в большинстве случаев, если система не доделана, лучше сконцентрироваться сначала на доделывании, а потом уже на оптимизации.

Полезное