Назад | Перейти на главную страницу

Можно ли заставить конкретную программу использовать виртуальную память?

Скажем, у меня 1 ГБ ОЗУ Ubuntu, мне нужно запустить оба memcached и redis на той же машине

Использование memcached довольно тяжелый (например, 1 КБ чтения в секунду), а redis менее тяжелый (но все же 10 операций чтения в секунду).

Поскольку моя машина работает от SSD, я думаю, пусть memcached работать в реальной памяти и позволить redis запустить на виртуальной памяти, это возможно? (Поскольку в моем случае память составляет всего 1 ГБ, я хочу выделить больше для memcached и меньше для redis, как я думаю, на диске с питанием от SSD уже достаточно 10 операций чтения в секунду).

Есть идеи решить проблему?

Вы не знаете об этом, но на самом деле вы уже используете виртуальную память для всего этого. По сути, по умолчанию ядро ​​Linux позволяет процессам map больше памяти, чем доступно в системе. Большая часть этой памяти активно не используется, поэтому уловка заключается в использовании виртуальной памяти.

Ядро Linux делает этот замечательный трюк и позволяет процессам отображать столько памяти, сколько им нужно, даже больше, чем имеет система.

Например, когда процесс запрашивает 1 ГБ памяти, ядро ​​сообщает, что это ваш 1 ГБ адресного пространства. Процесс не использует весь этот 1 ГБ, а скорее говорит 100 МБ, поэтому ядро, зная, что используется только 100 МБ, говорит: хорошо, эти 100 МБ будут в ОЗУ; но другие 900 я буду рассматривать как возможные, используемые в будущем, и тем самым он позволяет другим процессам запрашивать больше памяти, независимо от того, у вас физически только 1 ГБ.

В какой-то момент, если процессы извлекли слишком много памяти; В ядре есть эвристика для расчета давления, если резервы памяти становятся низкими, оно пытается освободить некоторые сегменты памяти. Короче говоря, варианты заключаются в том, чтобы удалить некоторые сегменты памяти, которые поддерживаются файловой системой (файлы, загруженные в память), переместить некоторые части памяти, которые не использовались какое-то время, для `` подкачки '' (уничтожение ввода-вывода вашего диска)

В вашем примере вы можете легко получить кэш памяти с назначенной оперативной памятью 32 МБ, redis с 32 МБ тоже, следить за использованием памяти в кэше памяти на блоки. Redis также будет доволен 32 МБ до момента, когда он использует все 32 МБ, и он начнет проверять, что меньше всего использовалось в его памяти, чтобы удалить его (в зависимости от использования redis)

Memcache о чем нужно помнить.

Общая память memcache делится на X частей одинакового размера. Каждая порция называется slab и вмещает пара ключ-значение пары определенного размерного ряда.

Некоторые slabs может быть полным; некоторые могут быть пустыми; в зависимости от размера значений, хранящихся в кэше памяти. Невозможно статически определить размер плиты и диапазон значений, которые она будет содержать.

Как только данные находятся в slab-кэше памяти, они будут вытеснены либо, когда - срок его жизни истечет - slab заполнен, и, чтобы соответствовать новой паре ключ-значение в slab, необходимо вытолкнуть наименее используемый

Вам нужно проверить статистику вашего кэша памяти, если вы не выполняете много выселений, вам не нужно увеличивать лимит памяти для кэша памяти, потому что он работает отлично, и количество обращений, которое вы упомянули, также велико, потому что эти обращения обслуживаются из памяти; а не из какой-то базы данных, которая является более медленным источником данных.