Можно ли заставить конкретную программу использовать виртуальную память?
Допустим, у меня есть 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, потому что он работает отлично, и количество обращений, о которых вы упомянули, также велико, потому что эти попадания подаются из памяти; а не из какой-то базы данных, которая является более медленным источником данных.