Объясните эту модель потребления памяти в Amazon RDS/Mysql?

Люди,

Может ли кто-нибудь объяснить эту картину потребления памяти на Amazon RDS, работающей с Mysql? На этом графике я обновил до db.m2.2xlarge, с 34 ГБ доступной памяти, в 03:30. Вы очень четко видите переключение. Когда клиенты начинают подключаться и попадают в этот экземпляр, память Freeable круто падает до 5 ГБ, где она теперь витает. При моем предыдущем обновлении между размерами экземпляра DB я увидел тот же шаблон, пока свободная память не упала до уровня менее 1 ГБ и не зависла там неопределенно долго.

Что этот пример делает с 03:30 до 07:30? Почему он не освобождает неиспользуемую память, когда она становится доступной? Думаю, я бы ожидал, что этот график будет формой волны, соответствующей шаблонам использования и трафика, vs и экспоненциальной форме распада, что говорит о том, что это супер ленивый и/или сломанный алгоритм сбора мусора.

Также обратите внимание, что около 2/3rds операций с БД - это записи, а 1/3 - чтение, и около 2 ГБ memcache перед БД.

memory consumption amazon rds mysql

Ответ 1

MySQL поддерживает кеш недавно использованных таблиц, запросов и результатов в памяти, чтобы возвращать более быстрые результаты. Например, если вы запросите "select * from company, где id = 1" от клиента 1 миллион раз, только первый запрос должен перейти на диск, следующие 999,999 будут поступать прямо из кеша ОЗУ. У MySQL нет причин для истечения срока действия этого кеша, пока он не узнает, что ему требуется больше памяти, поэтому он сохраняет все до тех пор, пока ему не нужно освобождать ОЗУ для других работ или более часто используемых результатов.

Я не претендую на роль эксперта - я понимаю, что оптимизация кеша запросов БД является очень сложной и глубокой наукой. Программисты из Oracle, Microsoft и других компаний потратили годы и годы на разработку лучшего способа управления кэшем, поэтому его трудно предсказать извне.