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

Память свободна, но все равно подкачка?

Я уверен, что это довольно простой вопрос, но я просто пытаюсь понять, что происходит с моим сервером Ubuntu Hardy, на котором работает сайт на основе Rails. Кажется, что у меня есть свободная память, но система сообщает, что она все еще меняет местами память (если я не читаю это неправильно?).

Здесь free -m вывод

              total       used       free     shared    buffers     cached
Mem:          1024        905        118          0         33        409
-/+ buffers/cache:        462        561
Swap:         2047         95       1952

Может ли кто-нибудь объяснить мне некоторые возможные причины того, что он постоянно поддерживает 95 МБ свопа (никогда не меньше)? Я просто ищу некоторые зацепки, которые я мог бы проверить, которые объяснили бы мне, как именно используется память в Linux.

Я тренировался в классе, который вел Тед Ц'о, и то, как он объяснил мне это, когда я задал тот же вопрос, было таким ...

По умолчанию ядро ​​резервирует большую часть памяти для кеширования таких вещей, как метаданные файловой системы. Вот почему в вашем столбце «использованные» указано 905 МБ. Это общий объем памяти, который «используется» программами и кешем. Фактический объем свободной памяти указан в столбце «Свободная» рядом с «- / + буферы / кеш», другими словами, 561 МБ. Это сумма, доступная для использования программами.

Теперь, когда ядро ​​использует 462 МБ для кеширования, остается полностью доступным 118 МБ. Когда программа сообщает ядру: «Эй, мне нужно 50 МБ памяти ПРЯМО СЕЙЧАС!», Ядро извлекает память из этого «свободного» пула. В результате размер «свободного» пула составляет около 68 МБ, что слишком мало для удобства, поэтому после того, как эта память будет извлечена, количество данных, хранящихся в кеше, уменьшается, а «свободный» пул снова увеличивается.

Но что случится, если программа - свинья и говорит: «Мне нужно 120 МБ памяти ПРЯМО СЕЙЧАС!». У вас не так много «свободной» памяти, поэтому ядро ​​не может передать ее программе, даже временно, поэтому ядро ​​копается в свопинге, достаточно долго, чтобы выделить достаточно свободной памяти, чтобы дать программе то, что ей нужно, затем освобождается достаточно данных кэша, чтобы «свободная» память могла вернуться к удобному уровню.

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

Если вас это беспокоит, вы можете запустить «swapoff», затем «swapon», чтобы избавиться от него, но это ничего не вредит.

Управление памятью очень сложно. В статье «Понимание ядра Linux» от O'Reilly содержится много деталей.

Идея состоит в том, что вы можете поменять местами память, которая, вероятно, больше никогда не будет использоваться проактивно. Вы можете контролировать, насколько вероятно, что своп будет использоваться со значением от 0 до 100 в /proc/sys/vm/swappiness. Чем больше число, тем выше вероятность обмена.

Прежде, чем вы начнете возиться с этим, посмотрите, есть ли своп активно используется с просмотром столбцов si / so в vmstat 3. Если они остаются равными 0, то подкачка происходит, но в настоящее время подкачки не происходит, и в этом случае я рекомендую вам оставить ее как есть :-) Одна из причин заключается в том, что те кешированные файлы, о которых вам бесплатно рассказывали, могут быть полезны для использования в объем памяти. Не допускайте подкачки ненужной памяти процесса, и вы можете упустить возможность кэшировать некоторые файлы, которые было бы полезно кэшировать.

Если у вас есть 95 МБ данных программы, к которым не обращались в течение часа, что вы бы предпочли:

1) Потратьте 95 МБ физической памяти, содержащей данные, к которым никогда не будет доступа.

2) Поменяйте эти 95 МБ на диск и получите дополнительно 95 МБ свободной физической памяти.

Система разумно выбирает вариант 2.

Вы, как правило, получаете умеренный объем памяти такого типа во многих системах. Одна из частых причин - программы, которые выделяют память при запуске, а затем ждут запросов, которые никогда не поступают. Во многих системах Linux есть полдюжины серверных программ, которые работают, но фактически никогда не используются.