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