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

Создание большого файла связывает память после завершения процесса

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