SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.05.2010 14:33:31

Qm
Участник
Зарегистрирован: 13.05.2010
Сообщений: 4

MySQL жрёт память и ложит сервер

Добрый день. Есть сервер с 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, и как это вылечить?

Спасибо smile

Неактивен

 

#2 13.05.2010 14:35:52

Qm
Участник
Зарегистрирован: 13.05.2010
Сообщений: 4

Re: MySQL жрёт память и ложит сервер

Забыл добавить - используется MySQL 5.0.77, CentOS 5.

Неактивен

 

#3 13.05.2010 18:18:54

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL жрёт память и ложит сервер

Обычно MySQL не течет. Убедитесь, что данные действительно не накапливаются, таблички
удаляются. Чтобы MySQL не использовал swap, можно запускать его с --memlock.

Со слов такого быть не должно, поэтому имеет смысл искать какие-то баги (например, можете
сравнить выводы SHOW TABLE STATUS на первых этапах работы и через час).

Неактивен

 

#4 18.05.2010 20:38:38

Qm
Участник
Зарегистрирован: 13.05.2010
Сообщений: 4

Re: MySQL жрёт память и ложит сервер

Поставил на мртг график, куда вывел размер всех 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

After allocated the memory using my_malloc, msyql use my_free to free the memory, and the behavior of my_free depends on the library mysql used. Some library just doesn't release the memory back to OS with the hope to reuse it later.
We faced the same problem on solaris, the default library mysql used and the mtmalloc won't really release back the memory to OS. You may try to find a different memory allocator that could release the memory back. One of my workmate tested mysqld on linux and found the memory could be released back to OS which is the opposite of what you experienced.


Только не совсем понял - это надо как-то по-другому перекомпилить mysql?

Неактивен

 

#5 19.05.2010 11:36:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL жрёт память и ложит сервер

А ОС какая?

Неактивен

 

#6 19.05.2010 13:35:04

Qm
Участник
Зарегистрирован: 13.05.2010
Сообщений: 4

Re: MySQL жрёт память и ложит сервер

Qm написал:

Забыл добавить - используется MySQL 5.0.77, CentOS 5.

64 бита.

Неактивен

 

#7 19.05.2010 15:10:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL жрёт память и ложит сервер

В линухе, вроде, нормальные маллоки. Попробуйте сделать тест — выделите
одну большую табличку в памяти, а потом удалите ее и посмотрите, освободится
ли память. Ну и, если не освободится, наверное это повод написать багу и
заменить таблички на MyISAM.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson