LINUX.ORG.RU
ФорумAdmin

mysql тормозит


0

0

стояла slackware 11.0. Прокси-сервер, почтовик. На нем же крутился разборщик статистики, написаный на перле, который разбирал лог squid и лог fetchmail и все запихивал в mysql, ну а потом скриптом делалась выборка и и составлялся репорт. Ну вообщем ничего такого хитроко. Сейчас перевел сервак на 13ю слаку. Скрипты разбора статистики оставил те же, создал в мускуле такие же таблицы. Тоесть все повторил, как было на старой системе. С пол месяца это все дело не запускалось, а потом примерно в середине месяцв запустил разборку... (лог у сквида больше полтора гига уже, но на 11й слаке проблем не было таких, даже когда на 3х гиговый лог натравливал) сервак через час начинает дико тормозить, а мускуль занимает до 50-70% CPU. Попробовал оставить на ночь разбор лога. Утром столкнулся с нем, что сервак вообще был полуживой, а скрипт разбора статистики так и не закончил свою работу. Конфиг для mysql подсунул тот, который my-small.cnf без дополнительных настроек. Насколько помню, то на старом серваке делал именно так же, без дополнительных настроек, но там хоть и машинка была намного слабее и по процессору и по памяти такого эффекта никогда не возникало. Да, конечно подзагружал систему, но не на столько сильно. Вот я и думаю, может быть что-то в конфиге мускуля можно подправить, чтоб такого эффекта не было? Конечно понимаю, что экстрасенсы в отпуске, но может будут какие-то советы, на что смотреть?

★★★

а - и еще. Версия оодуля Mysql.pl может как-то влиять на это?

deys ★★★
() автор топика

смотреть mtop, пробовать увеличить буферы для мускуля (попробуй my-medium хотя бы).
ну и добавить дебаг в скрипты, и потом изучать лог.

Komintern ★★★★★
()

http://balancer.endofinternet.net/files/linux/tools/tuning-primer.sh

Держишь под нагрузкой столько времени, чтобы было достаточно для репрезентативности и запускаешь этот однострочник^W скрипт. Подробно расскажет что и как подкрутить. Мне в своё время довольно сильно помогло :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

я бы изначально предложил проверить запросы =) а то вдруг у вас уже база выросла раз эдак в 10 =)
может у вас запросы идут с кучей джоинов и без использования индексов. Крутить параметры самого мускула - хороший вариант, но не самый первый

Jaizer
()
Ответ на: комментарий от Jaizer

после более детального разбора всетаки оказалось, что мускуль тут ни при чем и поедание ресурсов это только временный характер имеет, которое хоть и сказывается на общей производительности, но не критично. Причиной оказался скрипт разбора лога, написанный на перле. Я не особо програмер и поэтому, когда писал биллинг(а было это несколько лет назад и пока с этим гемора не было никакого), то такого и и предусмотреть даже не мог. При обработке access.log скрипт смотрит номер строчки в $stop_log и с нее начинает дальшейший разбор. Так вот, когда лог разбирался каждый день и не было особой нагрузки. Да плюс ко всем это ночь делалось и вообще было ни для кого не заметно. А тут я ему подсунул уже лог размером в полтора гига. Не знаю точно всего механизма, как происходит разбор лога, но похоже он все пихает в память и потом начинает разборку. А когда вышло, что полторагиговый лог подсунул - его и переглючило. Вчера выставил счетчик, что начать со строчки 10 000 000 (10 мильонной) - это было 70% от всего лога. Утром пришел, посмотрел - за час все отработалось. А вот когда ему сразу было подсунут огромный файл (с начала месяца не разбиравшийся), уже ресурсов и не хватило. Вот кусок скрипта, который делает разбор лога и запизивает в мускуль


# Открыть access.log со строки указанной в stop_log
open START, "$stop_log" || die "Cent open $stop_log\n";
$iii = <START>;
close START;

open LOG, "$access_log";
for ($i = 1; $i <= $iii; ++$i)
{
$tmpsss = <LOG>;
}

foreach(<LOG>)
{
$iii+= 1;

s/^\d+\.\d+/strftime("%Y-%m-%d %H:%M:%S",localtime $&)/e;
s/ - / /g;
next unless ($day, $time, $elapsed, $ip, $replycode, $isiz,$method, $url, $login, $hierarhy, $mimetype) =
m/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+ )\s+(\S+)\s/;

$url=~s|(^http://)([^/]*/).*|\1\2 |;

$db->Query("insert into http values ('$day', '$time', '$ip', '$login', '$replycode', '$url', '$file', $isiz)");

}
close LOG;

deys ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.