[MySQL] Зависание при смене карты

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Вопрос, один, почему зависает если база данных недоступна, вроде асинхронка, но тем не менее.
Каждую смену карты, а именно при подключении игроков, идет 32 запроса на получение онлайна, затем 32 запроса на запись/обновление статуса.
Если бд недоступна сервер подвисает на минуту-две, вроде же SQL_ThreadQuery не нуждается в ожидании ответа, нет?
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
запрещено поднятие темы раньше установленного срока
Тишина :D
 
  • it's so  bad
Реакции: Ayk
Сообщения
52
Реакции
60
Помог
2 раз(а)
Я конечно же не специалист в amxx, но вы бы показали, что там сделали, а то не работает то не понятно что)
Исходный код нужен для выявление проблемы
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
ex3m777, там ~1.5к строк, вряд ли кто-то будет вникать в суть происходящего, да и такие плагины тут не приветствуются, вся суть проблемы в том, что имеется одна вдс, чисто под базы данных, куда стучатся 25 серверов, иногда так получается, что при смене карты(коих 32 игрока * 25 серверов = 800 запросов ) разом отправляется больше 500 запросов(или иначе говоря больше 500 одновременных подключений), поэтому упираемся в лимит, и последующие запросы вылетают с ошибкой Can't connect to MySQL server, хотя бд жива, но вопрос только один, почему сервер то зависает :D У меня это в голове не укладывается

P.s: знаю, можно пакетно отправить, но максимум влезет две строки в один запрос, то есть вместо 32 будет 16 запросов, думаю на счет использование gRip, но не уверен
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
влезет две строки в один запрос
Смотря, какой запрос. 3500 символов без проблем отправляет. Больше- иногда возникают проблемы.
почему сервер то зависает
Потому что таймаут по дефолту 60 сек. При значениях до 15 сек зависаний нет. Оптимально- 5-10 сек.

C++:
/**
 * @param timeout       Specifies how long connections should wait before giving up.
 *                      If <= 0, the default of 60s is used.
 */
native Handle:SQL_MakeDbTuple(const host[], const user[], const pass[], const db[], timeout=0);
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Потому что таймаут по дефолту 60 сек. При значениях до 15 сек зависаний нет. Оптимально- 5-10 сек.
так вот этого и не ожидал я, я думал сервер будет нормально работать дальше, ну недоступна бд и фиг с ней, нет же ) я помню раньше, когда еще синхронный запрос юзали, там зависал сервер, но вот с асинхронным всегда казалось, что проблема решена.

3500 символов без проблем отправляет.
а я где-то слышал про лимит в 1024
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Какой длинны лимит вообще сейчас на sql запрос идет? Менялся ли он в зависимости от версии amx ?
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
Javekson, посмотри например в форке аеса
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
gyxoBka, смотрел, более чем уверен там не максимальное значение
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
Javekson, я конечно могу в данном вопросе ошибаться но тебе шорох точно ответит про размер строки и "магическую" прагму)
 
Сообщения
64
Реакции
131
Помог
4 раз(а)
SQL_ThreadQuery вешает сервер при смене карты и это давно обсуждали, mazdan вроде как переписывал модуль: https://kanaga.ru/plugins/mq.php

Как это происходит:
при использовании SQL_ThreadQuery создается отдельный поток, в нем отдельное подключение к БД, выполнение запроса и закрытие подключения. Если база недоступна, то SQL_ThreadQuery ждет таймаут, заданный в SQL_MakeDbTuple, по-умолчанию 60 сек.
При выполнении следующего SQL_ThreadQuery, он ждет, когда выполнится предыдущий SQL_ThreadQuery, либо отвалится по таймауту, т.е. 2 подряд SQL_ThreadQuery при отсутствии подключения будут ждать 120 секунд, но в отдельном потоке и на сервер никак не скажется.
Все меняется при смене карты, перед сменой карты сервер начинает ждать, когда очередь из накопленных SQL_ThreadQuery выполнится, либо отвалится по таймауту, это может занять от нескольких секунд до нескольких часов, зависит от установленного таймаута и кол-ва запросов в очереди.

Если это не фиксили в 1.9.0 и 1.10.0, то можешь попробовать модуль от mazdan, я лично его не тестил

PS: в sourcemod такой проблемы нет, смена карты не ждет завершения очереди, а после смены карты очередь продолжает попытку отправить запросы
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
BaHeK, благодарю, теперь понятно почему, ранее не видел такого обсуждение, а я сижу ломаю голову, вроде в описании одно, на деле получилось другое, все же буду думать на счет грип тогда наверное, либо хранение данных и отправка после смены карты.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу