Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день. Есть сервер с 16 гигами оперативки. Сервер обслуживает ряд доменов со сложно структурированной базой данных. В целях ускорения отклика страниц я по крону, раз в 15 минут, создаю для каждого домена (всего их на сервере 14) по 161 таблице типа Memory, в которые кладу подготовленные, отсортированные данные.
Сами таблицы вместе с индексами, согласно show table status, занимают в сумме 5,7 гигабайт (Data_length + Index_length) - что сразу после загрузки сервера приблизительно согласуется с памятью, которую, согласно top, забирает mysql - порядка 7 гигабайт. Однако в дальнейшем mysql начинает забирать под себя всё больше памяти, в течении нескольки часов доходит уже до 11-12 гигабайт. Затем наступает момент, когда сервер виснет и бутается. В такие моменты шелл ssh с топом умирает при следующих значениях (привожу за последние 2 ребута):
-- #1 --
Mem: 16427604k total, 16375524k used, 52080k free, 1192k buffers
Swap: 0k total, 0k used, 0k free, 262532k cached
PID:3054 USER:mysql PR:15 NI:0 VIRT:14.8g RES:14g SHR:1220 S:S %CPU:21.7 %MEM:92.5 TIME+:409:04.86 COMMAND:/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysq
-- #2 --
Mem: 16427604k total, 16372756k used, 54848k free, 2552k buffers
Swap: 4032304k total, 4032304k used, 0k free, 259720k cached
PID:3073 USER:mysql PR:15 NI:0 VIRT:18.4g RES:14g SHR:1872 S:S %CPU:17.5 %MEM:91.2 TIME+:362:03.49 COMMAND:/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysq
Разница в Swap: - это попытка ограничить доступную память, т.к. в первом случае сервер умирал от того, что данные перемещались в swap, и HDD просто захлёбывался в процессах, пытавшихся писать на него.
Т.е., как я понимаю, mysql выжирает всю память, и когда её остаётся слишком мало для апача+пхп (на сервере также есть ramfs ~ на 600Мб) - сервер падает от нагрузки.
Mysql на сервере использует только эта система.
Все "твёрдые" таблицы лежат в отдельной базе, имеют тип MyISAM и общий размер, со всеми индексами, чуть меньше 1Гб. А если отсюда вычесть размер таблиц+индексов, которые вообще не используются, и даже не открываются (остались от старой системы) - то реальный размер сокращается до 330Мб.
Все таблицы типа Memory лежат в другой базе. По крону, раз в 15 минут, производятся следующие действия: я прохожу по циклу все домены, для каждого домена создаю 161 новую таблицу с временным названием, потом переименовываю таблицы - как-бы меняю старые на новые, потом обрабатываю данные на основе накопившихся данных в shared memory и старых таблиц, после чего удаляю старые таблицы и перехожу к следующему домену.
Помогите плиз разобраться - откуда такие аппетиты MySQL, и как это вылечить?
Спасибо
Неактивен
Забыл добавить - используется MySQL 5.0.77, CentOS 5.
Неактивен
Обычно MySQL не течет. Убедитесь, что данные действительно не накапливаются, таблички
удаляются. Чтобы MySQL не использовал swap, можно запускать его с --memlock.
Со слов такого быть не должно, поэтому имеет смысл искать какие-то баги (например, можете
сравнить выводы SHOW TABLE STATUS на первых этапах работы и через час).
Неактивен
Поставил на мртг график, куда вывел размер всех memory-таблиц и индексов к ним - убедился, что эти цифры - практически константы.
Через pmap определили, что, похоже, при дропе таблиц некоторые не дропаются, а остаются мусором в оперативке. После этого: ставили MariaDB/MySQL, поменяли систему ротации таблиц с дропов на постоянное хранение временных таблиц, которые после ротации не дропаются, а очищаются через truncate. Даже выносили базу на отдельный сервер с 24 гигами оперативки - который через небольшое время тоже умер и бутнулся.
Нашёл похожую проблему тут: http://forums.mysql.com/read.php?92,258 … msg-258931
И ответ: http://forums.mysql.com/read.php?92,258 … msg-262674
Неактивен
А ОС какая?
Неактивен
Qm написал:
Забыл добавить - используется MySQL 5.0.77, CentOS 5.
64 бита.
Неактивен
В линухе, вроде, нормальные маллоки. Попробуйте сделать тест — выделите
одну большую табличку в памяти, а потом удалите ее и посмотрите, освободится
ли память. Ну и, если не освободится, наверное это повод написать багу и
заменить таблички на MyISAM.
Неактивен