Без уважительной причины (без больших запросов, без большой загрузки процессора, ничего не изменилось) Mysql 5.1 в Ubuntu 10.04 внезапно освободил около 20% своей объединенной памяти и переместил ее в раздел подкачки. Теперь мое использование памяти подкачки составляет ~ 30% .. (если только оно не снижается и не настраивается заново)
но почему он это делает? Согласно top, mysql VIRT и RES остались прежними при 12,5g 11g. Так почему же память переместилась вот так?
это в системе с 16 ГБ, 12 ГБ зарезервировано как Innodb_buffer_pool.
Сервис mysql не перезапускался около 3 месяцев.
MySQL не отвечает за управление свопом на сервере; это работа подсистемы управления памятью ядра. Настраиваемая функция ядра, которая управляет этим конкретным поведением, называется «swappiness», и вы можете прочитать об этом больше здесь:
http://kerneltrap.org/node/3000
По сути, если приложение запрашивает некоторый объем памяти и память сервера заполнена, это заставляет приложение ждать, пока не будет выгружено достаточное количество неактивного содержимого памяти, что вызывает задержку в приложении. Поскольку нам не нужна эта задержка, ядро всегда старается сохранять определенный объем памяти свободным. Делая это превентивно и в фоновом режиме, когда сервер приближается к исчерпанию памяти, он обеспечивает немедленное выполнение любых новых запросов к памяти на сервере, ускоряя работу без заметного воздействия на какие-либо работающие приложения. Во всяком случае, это теория.
Иногда вы этого не хотите, особенно если вся физическая память на сервере предполагается использовать в качестве кеша некоторым приложением (например, MySQL). В этих случаях вам нужно уменьшить sysctl vm.swappiness до 0.
Система удаляет данные из ОЗУ, если к ним не обращались в течение очень и очень долгого времени. Это делает доступным больше физической памяти для хранения вещей, которые могут повлиять на производительность.
Причина, по которой так много информации перемещалось за один раз, вероятно, заключается в том, что поведение подкачки никогда раньше не запускалось (или не в течение очень долгого времени), поэтому накопилось много информации, которая была настолько старой, насколько система могла отслеживать. Выброс чего-либо вызвал выброс всего этого. (Системное отслеживание возраста страниц очень грубое, потому что детализация отслеживания приводит к значительному увеличению затрат на программные ошибки страниц.)
Вероятно, почти все это данные, которые никогда не будут использоваться. Он будет находиться на диске до перезагрузки системы. Таким образом, дополнительная свободная память, которая теперь должна иметь систему для хранения данных, которые будут использоваться, фактически свободна.