Как ловить утечки памяти на MySQL (Percona)? [решено, поймана]
Захотелось на проекте попробовать в действии движок TokuDB. Для этого поднял Percona, которая разумеется встала взамен предыдущего MySQL 5.6. От последнего я и так планировал избавляться за его прожорливость в плане оперативы, когда он жрёт памяти вдвое больше чем вся база весит.
На полигоне Percona 5.7.13 (последняя на данный момент) показала себя прекрасно. Но при поднятии на боевом серваке ждал «сюрпрайз» в виде утекания памяти ≈300-400Мб в сутки.
Что знаю:
— Таблица x$memory_global_by_current_bytes говорит что у меня 175Мб скушано всего.
— innodb_buffer_pool_size=10M (поскольку совсем от InnoDB не избавиться, 6 системных таблиц базы MySQL на нём)
— Кеш запросов отключён
— tokudb_cache_size=100M (100Мб отдал на кеш TokuDB)
Вопросы:
— Есть ли идеи, куда она может деваться, и как это ловить?
— Есть ли кто, кто стабильно работает на Percona и TokuDB? Какая версия? Или на других клонах Мускула у кого поднят TokuDB?
Предложения прыгнуть на другую SQL-базу — рассматриваются. Предпочтение — компактность в плане оперативы, которая поддаётся настройке. Ну и скорость будет не лишней. Рассказывайте у кого что. Фенечек вроде геолокации не требуется, данные примитивны.
Дефолтное решение вернуться на MySQL 5.6, и мне оно не нравится.
Понять на полигоне что именно жрёт память пока не получается. Такое впечатление, что это либо логирование, либо соединение, либо в каком-то компоненте установка по-умолчанию отжирать столько памяти, сколько система разрешает (включая уход в своп). Скорее всего последнее, поскольку на производительности никак не сказывается.
Либо же классическая утечка в неконтролируемой области — что меня удивляет, поскольку и база, и движок — достаточно старые, проверены годами. Так что оптимальное решение — найти версию где утечки нет. Или понять как можно хотя бы контролировать процесс, чтобы увидеть где течёт.
Отдельный вопрос — как правильно параллельно на Линухе поднимать несколько экземпляров MySQL, можно ли пользоваться инсталлятором и надеяться что ничего не убьёт из существующего? Может где-то это документировано?
UPD: Утечка поймана.Течёт prefetch buffer, очень вероятно не уничтожается при разрыве соединения.
Что было: один настырный демон (про которого давно забыли) пытался соединиться с базой, которой нет. Имя базы прописано в параметре соединения (на PHP). И с регулярностью несколько раз в секунду он это делал. После разруливания заметных утечек вроде нет, prefetch buffer вернул. Но у меня соединения используются повторно, если утечка на разрыве всё же существенна, замечу я это нескоро.
63 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів