Metal Messiah

Metal Messiah
Рейтинг
163
Регистрация
01.08.2010
Программистъ

Ах.. мистика. С 4.9 сек до 0.0005. Поставил индекс на auth+authprov+proto т.к. это вместе характеризует сборку клиента игры.

Хотя вообще я тут чего-то не понимаю.

Всегда индекс использовал id auto_increment для однозначного определения строки и ее редактирования/удаления в CMS и только раз надо было из одинаковых таблиц на нескольких источниках свести данные в одну - ставил unique на id (auto_increment)+id источника чтобы не путались. Больше с индексами работать не приходилось и все сорцы которые ковырял - нигде не видел больше 1 индекса...

Завтра в пике посмотрю на результат и отпишу. Всем спасибо.

Индекс id который основной. Структура

CREATE TABLE `plmon` (
`id` int(11) unsigned NOT NULL auto_increment,
`csbid` int(4) unsigned NOT NULL,
`ip` int(4) unsigned default NULL,
`lang` varchar(2) NOT NULL,
`auth` varchar(21) NOT NULL,
`name` varchar(50) NOT NULL,
`proto` int(1) unsigned NOT NULL,
`authprov` int(1) unsigned NOT NULL,
`slotid` int(1) unsigned default NULL,
`serverid` int(4) unsigned NOT NULL,
`serverip` int(4) unsigned default NULL,
`time` int(4) unsigned default NULL,
`country` varchar(2) NOT NULL,
`city` varchar(50) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=MyISAM

Country и city думал индексами на другую таблицу сделать но потом понял что join дольше работает чем хранить лишние байты

Есть медленные. В таблице под 700тыс записей, когда-то было больше но из за вылета винта стата за последние 2 месяца не сохранилась - так что записей реально меньше чем было. Никогда тормозов не было.

# Query_time: 30.509671 Lock_time: 0.000027 Rows_sent: 0 Rows_examined: 686309
SELECT * FROM plmon WHERE ip='6340****2' AND name='****' AND proto='48' AND auth='********' AND authprov='4' ORDER BY id LIMIT 1;
# Query_time: 30.587146 Lock_time: 0.000056 Rows_sent: 1 Rows_examined: 686024
SELECT * FROM plmon WHERE ip='29763****8' AND name='****' AND country='RU' AND proto='48' AND auth='*********' AND authprov='4' ORDER BY id LIMIT 1;
# Query_time: 32.598488 Lock_time: 0.000064 Rows_sent: 0 Rows_examined: 686312
SELECT * FROM plmon WHERE name='********' AND country='PL' AND proto='47' AND auth='********' AND authprov='1' ORDER BY id LIMIT 1;

Но мне нужна именно выборка по критериям потому как можно сократить количество этих запросов идей нет.

Теперь я вообще ничего не понимаю. Была свободная память, апачи не размножались, база тормозила.

Все что сделал - перевел таблицу в InnoDB перед этим его включив в конфиге. Теперь запросы SELECT стали заметно медленнее работать (это без пика нагрузки).

В результате в пике проц сожран на 100%, памяти тоже нет и апачей не 10-11 как было а больше 15. Настройки вебсервера не менял. Где эти лишние апачи были при MyISAM?

gif sbtop2.gif

О, вчера был выходной а сейчас сразу много! Всем спасибо за идеи.

2. Отказаться от apache в пользу php5-fpm

Ну и смысл? Будет nginx всеми потоками ждать пока база ответит и не принимать новые запросы.

3. Оптимизировать запросы MySQL

посмотрю что можно сделать

4. Кэшировать

ну нет там того что можно кешировать. Запросы в БД все разные.

Так не используйте mysql для статистики - для этого есть мемкеш
А из него раз в час пакетным инсертом скидывайте в мискуль

Это идея хорошая, но тогда возможны сбои в стиле что следующая запись должна ссылаться на предыдущую а та еще не добавлена потому она никуда не ссылается или ссылается не на ту... Тут надо алгоритм полностью менять будет.

Таблицы с активной записью (а можно и все) в InnoDB перекинь

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

Лучше это когда проект будет приносить доходов на 2 таких VPSки. ЗА совет конечно спасибо, но мне интересно как выжать максимум из существующего железа. Хостер мне тоже предложил увеличить тариф, но это я всегда успею.

На крайняк у меня есть решение - плагин, который делает GET запрос к веб серверу, изменить на плагин, который будет делать тот же коннект на демон, и написать демон который будет принимать конненты по TCP на определенный порт и делать всю ту же работу включая общение с базой, таким образом освобождается куча памяти на апачи и из этой цепочки полностью выпадает пхп. Но это решение тоже упрется в какой-то невидимый лимит mysql сервера, так что пока это только идея. Все равно с MySQL надо что-то делать!

Если baidu по запросу "п**да" выводит запчасти к а/м Мазда (видимо логика такая на основе лексического строения китайского языка - там каждый иероглиф жто звук) то на ру рынке им делать нечего.

А Mail.ru давно к этому шли, чего стоит один только их аналог ТИЦа

У меня та же стата + игровой сервер + еще всякая мелочевка висела на сервере от Eomy.net с 384 RAM+96 Swap, потом запустил 2й игровой сервер там же памяти перестало хватать (100-150 Мб на процесс) и апгрейдил тариф до 512+128 Мб. Там проц 2500 но при превыщении 800. Что можно выжать из P3-600 Мгц я сам знаю т.к. дома такой сервер был под виндой. К чему я это...

К тому что все работало нормально. Пики нагрузки были но это сказывалось только на скорости отдачи страниц, но они отдавались в разумное время. Apache в конфиге до 5 серверов с Keep-Alive + Mysql. Без nginx. Просто месяц назад у EOMY на серве слетел винт и пока решался вопрос с восстановлением данных пришлось перенести и уже думал насовсем.

на этом оффтоп заканчивается.

ОК, 150 коннектов. У меня все равно столько нет - вот скрин top'а во время ступора. 10 php, 11 apache. 10 одновременных подключений к БД...

gif btop.gif

Спасибо, но боюсь что не поможет.

1. Сайт берет 10% от всей нагрузки, скрипт статы - 90%. Даже если я закеширую сайт...

2. Стату кешировать никак нельзя, т.к. каждый запрос заканчивается записью строки в таблицу БД и возвратом некоторых данных запрашивающему.

Вообще странно что max_connections=100 закомментировано, т.е. не ограничено, апачей штук 15 всего без KeepAlive, т.е. одновременно обрабатывается с 2 десятка запросов, а база тормозит и не отвечает вовремя на половину.

Можно на твой виндовый сервер поставить виртуалку на 512Mb (тот же VirtualBox) с Linux'ом и через нее траффик завернуть.

Что за игруха? КС? Если да то любой прокси или вторая машина впереди подымет пинг, причем существенно.

Нужно отфильтровывать пакеты клиентов UDP от флуда UDP приходящего на игровой порт.

ты флуд как можешь отличить? специфичное содержимое или рандом?

Если под эту игру нет конкретного решения нужно писать специальный софт, и затачивать только под защиту этой игры. Никаких правил, фильтров и прочего - быстрее работать будет.

Всего: 570