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

Допустим, у меня есть 1GB RAM Ubuntu, мне нужно запустить оба memcached а также redis на одной машине

Использование memcached является довольно тяжелым (например, 1K чтения в секунду) и Redis менее тяжелым (но все еще 10 чтения в секунду).

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

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

1 ответ

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

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

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

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

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

Memcache вещи, чтобы иметь в виду.

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

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

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

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

Другие вопросы по тегам