Я использую Ubuntu 9.10 на своем сервере. Он работает нормально, просто со временем (обычно через пару дней) использование памяти просто растет и растет, пока оно неизменно не исчерпывается и его нужно перезагружать.
На нем работают Apache, Samba, ProFTPd, Postfix, Munin и Webmin.
Можно ли что-нибудь сделать, чтобы освободить память, которая больше не нужна?
Зависит от того, как вы считаете использованную память. Если вы ищете "бесплатно", не забудьте не использовать кэширование и используемые буферы.
Linux пытается кэшировать как можно больше дисковой активности, чтобы последующий доступ к этим файлам был намного быстрее, чем необходимость повторного обращения к диску. Если требуется память, кэш-память будет освобождена для удовлетворения нового запроса.
Например:
# free
total used free shared buffers cached
Mem: 3973040 3944864 28176 0 433448 3123468
-/+ buffers/cache: 387948 3585092
Swap: 2040244 72080 1968164
В этом случае, хотя система сообщает, что почти вся используемая память 4G используется, более тщательное изучение показывает, что 3G ее «кэшируется», что означает, что на самом деле доступно много памяти. Вторая строка free
вывод представляет этот расчет - без учета буферов и кеша доступно 3,5 ГБ памяти.
Вам не нужно перезагружать сервер, чтобы освободить память. Использовать top
, чтобы определить, какой процесс использует память, перезапустить его и попытаться диагностировать причину аномального потребления памяти.
Что касается вероятной причины вашей проблемы, это своего рода выстрел в темноте, но есть хорошо-известный утечка памяти в console-kit-daemon
, специфичный для Ubuntu демон, который вы можете просто убить и удалить из rcX.d.
Информация Google о квотах ресурсов в Linux. Я бы также посмотрел, какой процесс раздувается, чтобы занять всю эту память. Вы также не упоминаете, сколько памяти у вас есть в этой системе; это просто случай, когда вам нужно получить больше памяти для сервера? Не наблюдая за использованием ресурсов и не видя, что происходит в каком процессе, вы не знаете, происходит ли это просто из-за постепенного использования памяти, или это вызвано утечкой ресурсов / проблемой приложения.
Сколько пользователей обращаются к этому серверу? Какая нагрузка? Сколько в нем уже памяти? Какие ошибки, если они есть, записываются в журнал непосредственно до, во время и после проблем с памятью?
Я также хотел бы указать, что использование ограничений / квот ресурсов будет означать настройку процесса, который будет действовать как сторожевой таймер для перезапуска процессов, которые были убиты, и это не очень чисто, так как это может принудительно убить процессы и вещи, которые полагаются на дисковом вводе-выводе или базах данных, вероятно, не понравится, что его внезапно убьют. Вместо этого вы можете сосредоточиться на поиске того, какой процесс является причиной проблем, и исправить или изолировать его. Хуже того, у вас может быть атака, которая вызывает увеличение использования памяти, или неконтролируемое задание cron, что-то в этом роде. Завершение работы процессов или перезагрузка не решают проблему, а помогают скрыть ее.
Если проблема связана только с буферами и кешами, вы всегда можете заставить ядро их отбросить. Просто сделать:
echo 1> / proc / sys / vm / drop_caches (для освобождения кэша страниц)
echo 2> / proc / sys / vm / drop_caches (для освобождения данных и индексных дескрипторов)
echo 3> / proc / sys / vm / drop_caches (для освобождения кэша страниц, dentries и inodes)