Я использую сервер Ubuntu 14.04LTS (AWS EC2) для создания пользовательского дампа базы данных, но получаю очень странное поведение памяти.
Я использую сценарий CLI PHP для циклического выполнения пользовательского запроса дампа, который выводит в пронумерованный файл, а затем cat
этот файл в выходной файл. Использование памяти растет, как и ожидалось, из-за mysql. Файл дампа mysql и выходной файл записываются на отдельный смонтированный диск (EBS).
Перед запуском сценария использование памяти составляет около 20%. По завершении процесса использование памяти составляет около 90%, как показано на графиках в htop
. Я проверил использование с помощью free -m
. После перезапуска mysql потребление памяти снижается примерно до 50%.
Я использовал lsof
, чтобы убедиться, что файл не используется. Я даже сделал lsof
в каталоге и получил только мой процесс bash и lsof.
Действительно странно то, что как только я удаляю файл, использование памяти падает до 20%.
] Я попытался удалить файл без перезапуска mysql, и его использование упало на 30%, как ожидалось выше.
Использование скрипта просмотра памяти, найденного здесь , не показывает такое же использование памяти, поэтому я предполагаю, что это не совсем точно. Он не показывает потребление памяти при сохранении файла.
Есть ли другой способ узнать, что удерживает память?
На самом деле вы смотрите на использование кэша диска системой. Все современные системы будут кэшировать операции с диском, чтобы ускорить повторный доступ к одной и той же области диска.
Считается, что этот процесс кэширования требует очень мало ресурсов из-за частых преимуществ, которые он может принести позже. Поскольку система знает, что кэш не важен по сравнению с любыми другими требованиями к памяти,он мгновенно сбрасывает его части, если они понадобятся для чего-то еще.
Вы также замечаете внутреннее кэширование серверного процесса MySQL, которое будет действовать аналогично кеш-памяти операционной системы, но ОС не распознает это как кеш, который вот почему он освобождается только в результате операций, выполняемых самим серверным процессом, таких как его перезапуск.