Jump to content

Семь кругов ада одного дня хайпа (МТА и Массовый вход)


Recommended Posts

Привет всем.

Случилось следующее. Запустили сервер, заказали рекламу. За 1 час зашло 150 человек и одновременно начали качать кэш (1.7 гб)

Сервер стал нещадно проседать, запросы перестали отправляться. Сервер держался и держится упорно. У всех появились проблемы CD20 с таймаутами при загрузке кэша.

К вечеру онлайн на половину уменьшился и все с горем пополам скачали кэш. Скажите, как можно распределить загрузку кэша? Как вообще сделать лучше? Ибо это жесткая проблема. Просто у нас хороший ресурс для рекламы, страшно представить что будет если 500 человек зайдет.

База данных и сервер на одной машине, сама панель и сервер не лагали, лагали запросы к бд и загрузка кэша, с ней вообще отдельная песня.

Как только все скачали кэш, на онлайне 120, сервер чувствует себя хорошо.

Link to comment

Короче дело такое

Сервер располагается на VDS (канал 100 мбит/с)

На сервере apache, mysql, mtasa server.

Запросы формируются таким образом:

fetchRemote("https://s1.************.ru/********.php", GetPlayerCars, "player_cars|"..getElementData(player, "player.id"), false, player)

А в ответе:

function GetPlayerCars(responseData, errno, source)
    if errno == 0 then
		if isElement(source) then
			local JSonBody = fromJSON(responseData)
			if tostring(JSonBody["status"]) == "ok" then
				if tonumber(JSonBody["count"]) > 0 then
					local cars_Count = tonumber(JSonBody["count"])
					local car_Info = JSonBody["cars"]
					PlayerCarsToClient = ""
					for i in pairs(car_Info) do 
						if tonumber(car_Info[i]["model"]) == 510 then cars_Count = cars_Count-1 end
						PlayerCarsToClient = PlayerCarsToClient..","..tonumber(car_Info[i]["id"]).."~"..tonumber(car_Info[i]["model"]).."~"..tostring(car_Info[i]["number"])
					end
					PlayerCarsToClient = string.sub(PlayerCarsToClient,2)
					setElementData(source, "player.cars", tostring(PlayerCarsToClient))
					setElementData(source, "player.carsCount", cars_Count)
				else
					setElementData(source, "player.cars", "")
					setElementData(source, "player.carsCount", 0)
				end
			elseif tostring(JSonBody["status"]) == "empty" then
				setElementData(source, "player.cars", "")
				setElementData(source, "player.carsCount", 0)
			end
		end
    end
end

 

Таким образом я реализовал весь мод.

На необольшом онлайне все гуд. Дальше начинаются проблемы вида: запрос идет по 1,5 минуты.

Например спавн машины занимает 1-1.5 мин. Сам сервер не ложится, сайт вообще без нареканий, база тоже.

А вот сервер отправляет запрос ООЧЕНЬ долго.

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

 

Как быть? Рекламу дали бешенную, мод писали три месяца. Но теперь всё крахом бл**ть!

Перенести кэш на другой сервер не получается

С горем пополам вь**ал туда nginx, поставил ftp сервер который через раз работает.

На нулевый debian 7, столько танцев с бубнами - ПИ**ЕЦ!

Помогите кто нибудь мне срочно, заплатим денег, с доната, который идет бесконечно.

Люди долбятся в баги и говорят что все нравится, мы на нервах, до праздника 1 день.

ЖОПА ПОЛНАЯ, УЖЕ ГРЕШУ НА ВСЕ! И НА БАГИ мтА и так далее и на свои кривые видимо по всему судя РУКИ!

После включения сервера счетчик игроков как ебн**ый 0-100 быстрее чем бугатти веерон набирает!

ПОМОГИТЕ СТОЛЬКО СИЛ ВЛОЖИЛИ И ДЕНЕГ!

Edited by PrototypeX
Link to comment
  • Other Languages Moderators
18 minutes ago, PrototypeX said:

Короче дело такое

Сервер располагается на VDS (канал 100 мбит/с)

На сервере apache, mysql, mtasa server.

Запросы формируются таким образом:


fetchRemote("https://s1.************.ru/********.php", GetPlayerCars, "player_cars|"..getElementData(player, "player.id"), false, player)

А в ответе:


function GetPlayerCars(responseData, errno, source)
    if errno == 0 then
		if isElement(source) then
			local JSonBody = fromJSON(responseData)
			if tostring(JSonBody["status"]) == "ok" then
				if tonumber(JSonBody["count"]) > 0 then
					local cars_Count = tonumber(JSonBody["count"])
					local car_Info = JSonBody["cars"]
					PlayerCarsToClient = ""
					for i in pairs(car_Info) do 
						if tonumber(car_Info[i]["model"]) == 510 then cars_Count = cars_Count-1 end
						PlayerCarsToClient = PlayerCarsToClient..","..tonumber(car_Info[i]["id"]).."~"..tonumber(car_Info[i]["model"]).."~"..tostring(car_Info[i]["number"])
					end
					PlayerCarsToClient = string.sub(PlayerCarsToClient,2)
					setElementData(source, "player.cars", tostring(PlayerCarsToClient))
					setElementData(source, "player.carsCount", cars_Count)
				else
					setElementData(source, "player.cars", "")
					setElementData(source, "player.carsCount", 0)
				end
			elseif tostring(JSonBody["status"]) == "empty" then
				setElementData(source, "player.cars", "")
				setElementData(source, "player.carsCount", 0)
			end
		end
    end
end

 

Таким образом я реализовал весь мод.

На необольшом онлайне все гуд. Дальше начинаются проблемы вида: запрос идет по 1,5 минуты.

Например спавн машины занимает 1-1.5 мин. Сам сервер не ложится, сайт вообще без нареканий, база тоже.

А вот сервер отправляет запрос ООЧЕНЬ долго.

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

 

Как быть? Рекламу дали бешенную, мод писали три месяца. Но теперь всё крахом бл**ть!

Перенести кэш на другой сервер не получается

С горем пополам вь**ал туда nginx, поставил ftp сервер который через раз работает.

На нулевый debian 7, столько танцев с бубнами - ПИ**ЕЦ!

Помогите кто нибудь мне срочно, заплатим денег, с доната, который идет бесконечно.

Люди долбятся в баги и говорят что все нравится, мы на нервах, до праздника 1 день.

ЖОПА ПОЛНАЯ, УЖЕ ГРЕШУ НА ВСЕ! И НА БАГИ мтА и так далее и на свои кривые видимо по всему судя РУКИ!

После включения сервера счетчик игроков как ебн**ый 0-100 быстрее чем бугатти веерон набирает!

ПОМОГИТЕ СТОЛЬКО СИЛ ВЛОЖИЛИ И ДЕНЕГ!

 

Ну я же выше кинул ссылки....

 

Пиши в телеграм, может помогу (@disinterpreter)

Edited by Disinterpreter
Link to comment
Just now, Disinterpreter said:

 

Ну я же выше кинул ссылки....

Работаю в режиме НОНСТОП, сна 3 часа. Более 800 вопросов от игроков за 10 часов.

В минуту 18-20 вопросов. Работаю один. Сижу сейчас работаю с мануалом.

Как думаешь, это именно из-за кэша? Пробовал отключать ресурсы по очереди, в т.ч. содержащие все многовесные файлы кэша.

Проблемы продолжали наблюдаться. Хостинг ihor. VDS (8гб озу, 4 ядра, 100 мбит/с)

 

С чем вообще может быть это связано? У меня раздрай. 100к строк кода, куда смотреть чего глядеть, ужас!

Есть время помочь? Скайп возможно?

Link to comment
1 minute ago, PrototypeX said:

Да

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

Link to comment
1 minute ago, Misha_Konsta said:

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

Да я это уже понял, ебусь с nginx'ом.

Link to comment
19 minutes ago, PrototypeX said:

Да я это уже понял, ебусь с nginx'ом.

Сервер "дохнет" от забитого канала. Купи просто ВДСку в другом месте (на пару дней копейки стоит, не суть), и настрой её отдельно как веб-сервер для кэша и ресурсов. И сайт лучше тоже отдельно держать, так как плохо настроенный веб-сервер в случае той же атаки на него - будет мешать работе игрового сервера.

Edited by Misha_Konsta
Link to comment
2 hours ago, PrototypeX said:

Таким образом я реализовал весь мод.

На необольшом онлайне все гуд. Дальше начинаются проблемы вида: запрос идет по 1,5 минуты.

Если у Вас все написано в таком стиле, как Вы показали - то проблема может быть в злоупотреблении setElementData. Вообще использовать setElementData с синхронизацией данных для всех игроков Я бы советовал в исключительных случаях. Это загружает CPU на сервере в экспоненциальной зависимости от кол-ва игроков.

PS. кстати, что за проект?

PPS. случаем не оно :)? Если да, то у меня для Вас плохие новости касательно радара)

Edited by AfterAll14
Link to comment
6 minutes ago, AfterAll14 said:

Если у Вас все написано в таком стиле, как Вы показали - то проблема может быть в злоупотреблении setElementData. Вообще использовать setElementData с синхронизацией данных для всех игроков Я бы советовал в исключительных случаях. Это загружает CPU на сервере в экспоненциальной зависимости от кол-ва игроков.

PS. кстати, что за проект?

https://vk.com/smotramtasa

Link to comment
5 minutes ago, AfterAll14 said:

Ок, зайду, гляну, может чего бросится в глаза.

edit: или не зайду xD

Запущу в 21:00, сможешь наглядно увидить весь треш когда заходят 150 человек одновременно.

Сейчас кэш конечно уже на другом сервере, но я думаю, проблема останется.

Link to comment
45 minutes ago, PrototypeX said:

Запущу в 21:00, сможешь наглядно увидить весь треш когда заходят 150 человек одновременно.

Сейчас кэш конечно уже на другом сервере, но я думаю, проблема останется.

Вроде всё ок. Кэш качает, запросы обрабатываются без задержки

Edited by Misha_Konsta
Link to comment
Quote

За 1 час зашло 150 человек и одновременно начали качать кэш (1.7 гб)

 

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

Quote

Сервер стал нещадно проседать, запросы перестали отправляться. Сервер держался и держится упорно. У всех появились проблемы CD20 с таймаутами при загрузке кэша.

Может быть дело также и в самой оптимизации мода и запросов, используйте performancebrowser, чтобы узнать где у вас проблемы.

Edited by Kenix
Link to comment

Сразу видно, что игроки пытаются флудить различными способами, когда что то не работает.

Можно попробовать увеличить ресурсы ВДС на время, посмотреть, какие ресурсы "едят" вдс, и на время поиска ошибки этих ресурсов - отключить их

Link to comment
6 minutes ago, PrototypeX said:

Увеличил ресурсы ВДС, кэш на другом сервере.

ФПС стабилизировалось, теперь запросы идут по 1.5 минут, но уже без лагов для сервера.

Тогда надо искать ресурсы, которые нагружают сервер 

51 minutes ago, Kenix said:

performancebrowser

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

Edited by Misha_Konsta
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...