Возможны сбои записи в системный журнал при нехватке памяти: невозможно узнать это для каждой платформы, не посмотрев на источник соответствующих функций. Например, им может потребоваться динамическая память для форматирования передаваемых строк.
Однако задолго до того, как у вас не хватит памяти, вы начнете разбирать содержимое на диск. И когда это произойдет, вы можете забыть о преимуществах производительности при кэшировании.
Итак, что происходит со сложным управлением памятью в Squid, так это то, что он вступает в борьбу со сложным управлением памятью в ядре ...
Squid создает HTTP-объект в оперативной памяти, и он быстро используется после создания. Затем, через некоторое время, больше нет попаданий, и ядро замечает это. Затем кто-то пытается получить память от ядра для чего-то, и ядро решает вытолкнуть эти неиспользуемые страницы памяти, чтобы освободить пространство и более разумно использовать (кэш-память) для некоторых данных, которые фактически используются программой. Это, однако, делается без ведома Squid об этом. Squid по-прежнему считает, что эти http-объекты находятся в оперативной памяти, и они будут, как только он попытается получить к ним доступ, но до тех пор оперативная память используется для чего-то продуктивного. ...
Через некоторое время Squid также заметит, что эти объекты не используются, и решит переместить их на диск, чтобы оперативная память могла использоваться для более загруженных данных. Итак, Squid выходит, создает файл и затем записывает в него объекты http.
Здесь мы переключаемся на высокоскоростную камеру: Squid вызывает write (2), адрес, который он дает, является «виртуальным адресом», и ядро помечает его как «не дома». ...
Ядро пытается найти свободную страницу, если ее нет, она возьмет немного использованную страницу откуда-то, вероятно, другой малоиспользуемый объект Squid, запишет ее в пространство подкачки ... на диске ("swap" area "), когда эта запись завершится, он будет считывать из другого места в пейджинговом пуле данные, которые он" выгружал "на неиспользуемую в настоящее время страницу ОЗУ, исправлять таблицы пейджинга и повторять неудачную инструкцию. ...
Так что теперь Squid имеет объект на странице в ОЗУ и записывает на диск два места: одну копию в пространстве подкачки операционной системы и одну копию в файловой системе. ...
Вот как это делает Varnish:
Varnish выделяет некоторую виртуальную память, он сообщает операционной системе, чтобы она резервировала эту память с помощью места на диске. Когда ему нужно отправить объект клиенту, он просто ссылается на этот фрагмент виртуальной памяти, а остальное оставляет ядру.
Если / когда ядро решит, что ему нужно использовать ОЗУ для чего-то другого, страница будет записана в файл резервной копии, а страница ОЗУ будет повторно использована в другом месте.
Когда Varnish в следующий раз ссылается на виртуальную память, операционная система найдет страницу ОЗУ, возможно, освобождая ее, и прочитает содержимое из файла резервной копии.
И это все. Varnish на самом деле не пытается контролировать то, что кешируется в ОЗУ, а что нет, ядро имеет поддержку кода и аппаратного обеспечения для хорошей работы в этом, и это делает хорошую работу.
Вам вообще может не понадобиться писать код для кэширования.