UMGUM.COM 

Squid3 + память ( Особенности работы Squid3 с оперативной и дисковой памятью. )

30 ноября 2011  (обновлено 31 января 2015)

OS: Debian GNU/Linux Squeeze.

Прежде чем тонко настраивать Squid порассуждаю о особенностях его работы с памятью. Squid очень хорошо ускоряется при наличии достаточно большого количества оперативной памяти, в которой он сможет хранить часть ресурсов быстрого доступа и большой индекс ресурсов расположенных на диске. Для начала определимся, сколько у нас имеется оперативной памяти, после чего, практически "от обратного", можно будет рассчитать, насколько большой "дисковый кеш" мы сможем использовать.

Прежде всего читаем документацию:


В руководстве от разработчиков об этом сказано примерно следующее:

How much memory do I need in my Squid server?

As a rule of thumb on Squid uses approximately 10 MB of RAM per GB of the total of all cache_dirs (more on 64 bit servers such as Alpha), plus your cache_mem setting and about an additional 10-20MB. It is recommended to have at least twice this amount of physical RAM available on your Squid server. For a more detailed discussion on Squid’s memory usage see the sections above.

The recommended extra RAM besides what is used by Squid is used by the operating system to improve disk I/O performance and by other applications or services running on the server. This will be true even of a server which runs Squid as the only tcp service, since there is a minimum level of memory needed for process management, logging, and other OS level routines.

If you have a low memory server, and a large disk, then you will not necessarily be able to use all the disk space, since as the cache fills the memory available will be insufficient, forcing Squid to swap out memory and affecting performance. A very large cache_dir total and insufficient physical RAM + Swap could cause Squid to stop functioning completely. The solution for larger caches is to get more physical RAM; allocating more to Squid via cache_mem will not help.

Я понимаю это следующим образом:

На каждый Гигабайт "дискового кеша" нужно по 10 Мегабайт оперативной памяти;
Отдельно учитываем объём, выделенный под быстрый кеш.

На этом "точные науки" заканчиваются. Под дисковые и сетевые буферы, под "всё остальное" (для рассмотрения которого отсылают в весьма туманные дали) выделяем ещё столько же памяти, сколько и под то, что поддаётся пониманию.


В итоге, предположим, что мы имеем 4 (четыре) Гигабайта оперативной памяти:

Выделяем под быстрый кеш (cache_mem) 512 Мегабайт;
Делим оставшиеся 1500 Мегабайт на 10, получая 150 Гигабайт поддерживаемого дискового кеша (cache_dir).

150 Гигабайт кешированных объектов, актуальных в условиях современного "динамического интернета", в сети с количеством пользователей около одной-двух тысяч, не наберётся (при большем количестве пользователей следует распределять нагрузку между прокси-серверами, дабы не иметь единую точку отказа). Основной кешируемый трафик - CSS, Java-скрипт, мелкие картинки; его набирается не более 10-20 Гигабайт. Остальной задействованный объём - просто запас, балласт и трата вычислительных ресурсов. Реально под дисковый кеш есть смысл выделять не более 50-60 Гигабайт. Из этого следует:

На поддержку индекса "дискового кеша" в 60 Гигабайт выделяем 600 Мегабайт (можно сразу 1 Гигабайт, для "запасу") оперативной памяти;
На быстрый кеш выделяем до 1 (одного) Гигабайта оперативной памяти;
Оставшиеся 2 (два) Гигабайта будут использованы системой под разного рода буферы и свои нужды.

Грубо баланс между оперативной памятью и дисковым пространством прикинули.

Теперь более точно, применительно к нашим реалиям, прикинем расход оперативной памяти на поддержку кеша и разберёмся с конфигурационными параметрами cache_dir. Максимально возможный объём такового мы уже вычислили исходя из доступного объёма оперативной памяти, исходя "от обратного". Теперь перепроверим результат прямым расчётом и определим, сколько дисковый кеш сможет содержать в себе объектов и в какой структуре.

Why does Squid use so much memory!?

Squid uses a lot of memory for performance reasons. It takes much, much longer to read something from disk than it does to read directly from memory.

A small amount of metadata for each cached object is kept in memory. This is the StoreEntry data structure. This is 56-bytes on 32-bit architectures and 88-bytes on 64-bit architectures. In addition, there is a 16-byte cache key (MD5 checksum) associated with each StoreEntry. This means there are 72 or 104 bytes of metadata in memory for every object in your cache. A cache with 1,000,000 objects therefore requires 72MB of memory for metadata only. In practice it requires much more than that.

Предположим, что средний размер объекта хранимого в дисковом кеше составляет 12 (двенадцать) Килобайт (просто подбил реальную статистику по своему кешу). Мы выделили под дисковый кеш 60 Гигабайт (62914560 Килобайт). Значит, в него могут набиться около 5242880 (пяти миллионов) файлов. На один объект нужно 104 байта оперативной памяти из выделенной под индекс. Значит, на поддержку дискового кеша в 60 Гигабайт может быть израсходовано 0.5 Гигабайта (545,259,520 байт).

Структура дискового кеша следующая:
  L1 директорий;
  В каждой - L2 поддиректорий;
  В каждой из поддиректорий снова по L2 файлов.
Итого: L1*L2*L2 объектов.

Чтобы разместить в описанной выше структуре пять миллионов объектов, она должна иметь примерно следующие параметры:

48*320*320 (4915200 объектов)
32*448*448 (6422528 объектов)

Отсюда:

cache_dir ufs /var/spool/squid3/ordinary 61440 48 320

...или (если разбивать "кеш" на два диска):

cache_dir ufs /var/spool/squid3/ordinary 30720 48 160
cache_dir ufs /mnt/squid/spool/ordinary 30720 48 160


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )