Уважаема Администрация сервера.
Проблема с лагами действительно не разрешима?
Уже третий вечер Сервер просто зависет намертв после каждого сохранения данных и и периодически просто падает.
Постоянные лаги и зависания сервера
-
- Сообщения: 3
- Зарегистрирован: 18 янв 2015, 21:50
Re: Постоянные лаги и зависания сервера
Поддерживаю. Пора уже разобраться и решить, что нужно для решения проблемы, а не спускать всё на авось. Когда сервер падает в единственные выходные за неделю, когда ты мог бы сделать овер много не есть хорошо. Админ проведи собрание, хотелось бы вести диалог. Если наладить ничего не получится, то нужно как минимум сказать об этом.
P.S. Вы принимаете Новых игроков на сервер увеличивая онлайн, а по факту это увеличивает лаги, ибо 20+ человек и играть уже не возможно. Вы либо приток игроков закройте, пока проблема не решится полностью и Вы не настроите всё как нужно. Либо в кратчайшие сроки решайте эту проблему.
P.S.s. "Кратчайшие сроки это не месяц."
P.S. Вы принимаете Новых игроков на сервер увеличивая онлайн, а по факту это увеличивает лаги, ибо 20+ человек и играть уже не возможно. Вы либо приток игроков закройте, пока проблема не решится полностью и Вы не настроите всё как нужно. Либо в кратчайшие сроки решайте эту проблему.
P.S.s. "Кратчайшие сроки это не месяц."
Re: Постоянные лаги и зависания сервера
Найдите ошибку в этом коде которую я ищу уже 9 дней и сервер будет работать без перезагрузок. http://pastebin.com/dJQtHSjS
Скажу больше чанки не выгружает даже OPIS.
При включенном save-on будет лагать на любом сервере( с GregTech 5) с развитыми базами, так как чанки выгружаются и загружаются каждые 30 секунд, ядром делу не поможешь, нужен механизм выгружающий чанки постепенно, и просчитывающий позицию игроков чтобы их не затрагивать.
Скажу больше чанки не выгружает даже OPIS.
При включенном save-on будет лагать на любом сервере( с GregTech 5) с развитыми базами, так как чанки выгружаются и загружаются каждые 30 секунд, ядром делу не поможешь, нужен механизм выгружающий чанки постепенно, и просчитывающий позицию игроков чтобы их не затрагивать.
-
- Сообщения: 3
- Зарегистрирован: 18 янв 2015, 21:50
Re: Постоянные лаги и зависания сервера
Serious07 писал(а):Найдите ошибку в этом коде которую я ищу уже 9 дней и сервер будет работать без перезагрузок. http://pastebin.com/dJQtHSjS
А мы не можем нанять специалиста, который понимает о чем идёт речь и сможет решить данную проблему?
Re: Постоянные лаги и зависания сервера
Если есть такой специалист, но стоит денюжку - давайте скинемся.
Re: Постоянные лаги и зависания сервера
Добавил выгрузку чанков, по формуле PlayerCount*300 + 1000, но в момент выгрузки будет сильно лагать, другого решения пока не нашёл.
Re: Постоянные лаги и зависания сервера
Serious07 писал(а):Найдите ошибку в этом коде которую я ищу уже 9 дней и сервер будет работать без перезагрузок. http://pastebin.com/dJQtHSjS
Скажу больше чанки не выгружает даже OPIS.
При включенном save-on будет лагать на любом сервере( с GregTech 5) с развитыми базами, так как чанки выгружаются и загружаются каждые 30 секунд, ядром делу не поможешь, нужен механизм выгружающий чанки постепенно, и просчитывающий позицию игроков чтобы их не затрагивать.
А что выдает компилятор ? или как то можно охарактиризовать ошибку ?
Re: Постоянные лаги и зависания сервера
Ошибок при компиляции нет =) Код просто не работает.
Re: Постоянные лаги и зависания сервера
Serious07, я готов помочь с кодом. Добавился в скайпе.
Re: Постоянные лаги и зависания сервера
Залипать может только в этой функции
В общем этот кусок кода я бы переписал вот так:
Основные заметки
Оптимизация Кода - не стоит каждый раз использовать MinecraftServer.getServer();
Один раз его уже создали в MinecraftServer cuurentMinecraftServer = MinecraftServer.getServer(); с этим и стоит работать
Выгрузка чанков должна осуществлятся только после успешного сохранения, но никак не при ошибке сохранения и не одновременно.
Для более оптимального осуществления выгрузки чанков стоит подробно рассмотреть куски кода ответственного за
выгрузку чанков, за проверку на то стоит ли его вообще выгружать, какие критерии при этом учитывать и т.д. и т.п.
P.S. я не Java программист и могу не знать о многих особенностях жабы.
Код: Выделить всё
public void processCommand(ICommandSender sender, String[] args) {
if(sender instanceof EntityPlayerMP){ // Если команду выполнил игрок ??? А команда по таймауту о выгрузке чанков идёт не от игрока или в серверной части скрипт обрабатывается как игрок?
String permission = "UNLOAD";
if(cl.CheckGroupPermission(cl.GetPlayerGroup(cl.GetPlayerId(((EntityPlayerMP) sender).getDisplayName())), permission)) { ??? тут идёт проверка прав пользователя на использование команды UNLOAD
MinecraftServer minecraftserver = MinecraftServer.getServer(); ??? Создаётся объект с данными о всех серверах? /mining /nether /основной [b] Он случайно не создаётся пустой?[/b]
int length = minecraftserver.worldServers.length; ??? длина??? Это длина массива со списком загруженных серверов?
int count = 0;
for(int i=0; i<length; i++){
count += minecraftserver.worldServers[i].theChunkProviderServer.getLoadedChunkCount(); ??? подчсчёт количества загруженных чанков?
}
// Выполнить команду на сохранение здесь
MinecraftServer.getServer().getCommandManager().executeCommand(MinecraftServer.getServer(), "save-all"); ??? Эту команду следует запускать перед подсчётом чанков, и пока функция сохранения не вернёт результат (true) никаких действий по выгрузке чанков не стоит производить, при краше сохранения дальнейшие манипуляции тоже не стоит производить
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Сейчас подгружено " + count);
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Выгружаем чанки!");
for(int i=0; i<length; i++){
boolean flag = MinecraftServer.getServer().worldServers[i].levelSaving; // тут как я понимаю происходит магия которую не разберёшь без подробной информации о MinecraftServer.getServer().worldServers
minecraftserver.worldServers[i].levelSaving = true;
minecraftserver.worldServers[i].theChunkProviderServer.unloadAllChunks();
minecraftserver.worldServers[i].theChunkProviderServer.unloadQueuedChunks();
ch.SendMessageToPlayer((EntityPlayerMP) sender, (i + 1) + " из " + length + " " + MinecraftServer.getServer().worldServers[i].theChunkProviderServer.canSave());
minecraftserver.worldServers[i].levelSaving = flag;
}
count = 0;
for(int i=0; i<length; i++){
count += minecraftserver.worldServers[i]. .getLoadedChunkCount();
}
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Чанки успешно выгружены! Подгружено: " + count);
}
}
}
В общем этот кусок кода я бы переписал вот так:
Код: Выделить всё
@Override
public void processCommand(ICommandSender sender, String[] args) {
if(sender instanceof EntityPlayerMP){ // Если команду выполнил игрок
String permission = "UNLOAD";
if(cl.CheckGroupPermission(cl.GetPlayerGroup(cl.GetPlayerId(((EntityPlayerMP) sender).getDisplayName())), permission)) {
MinecraftServer cuurentMinecraftServer = MinecraftServer.getServer();
// Выполнить команду на сохранение здесь
if(cuurentMinecraftServer.getCommandManager().executeCommand(cuurentMinecraftServer, "save-all")){ // Если прошло успешно - выгружаем чанки
int length = cuurentMinecraftServer.worldServers.length;
int count = 0;
for(int i=0; i<length; i++){
count += minecraftserver.worldServers[i].theChunkProviderServer.getLoadedChunkCount();
}
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Сейчас подгружено " + count);
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Выгружаем чанки!");
for(int i=0; i<length; i++){
boolean flag = cuurentMinecraftServer.worldServers[i].levelSaving;
cuurentMinecraftServer.worldServers[i].levelSaving = true;
cuurentMinecraftServer.worldServers[i].theChunkProviderServer.unloadAllChunks();
cuurentMinecraftServer.worldServers[i].theChunkProviderServer.unloadQueuedChunks();
ch.SendMessageToPlayer((EntityPlayerMP) sender, (i + 1) + " из " + length + " " + cuurentMinecraftServer.worldServers[i].theChunkProviderServer.canSave());
cuurentMinecraftServer.worldServers[i].levelSaving = flag;
}
count = 0;
for(int i=0; i<length; i++){
count += cuurentMinecraftServer.worldServers[i].theChunkProviderServer.getLoadedChunkCount();
}
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Чанки успешно выгружены! Подгружено: " + count);
} else { // при неудаче сохранения - 2 варианта - оставить как есть или повторить.
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Попаболь! Сохранение не удалось... ");
// вообще можно рекурсивно запустить public void processCommand(ICommandSender sender, String[] args) вплоть до успешного сохранения бэкапа,
// но с ограниченным количеством итераций
}
} else {
ch.SendMessageToPlayer((EntityPlayerMP) sender, "Ты кто такой? Давай досвидания!!! ");
}
}
}
Основные заметки
Оптимизация Кода - не стоит каждый раз использовать MinecraftServer.getServer();
Один раз его уже создали в MinecraftServer cuurentMinecraftServer = MinecraftServer.getServer(); с этим и стоит работать
Выгрузка чанков должна осуществлятся только после успешного сохранения, но никак не при ошибке сохранения и не одновременно.
Для более оптимального осуществления выгрузки чанков стоит подробно рассмотреть куски кода ответственного за
выгрузку чанков, за проверку на то стоит ли его вообще выгружать, какие критерии при этом учитывать и т.д. и т.п.
P.S. я не Java программист и могу не знать о многих особенностях жабы.
Последний раз редактировалось ipbars 03 фев 2015, 10:44, всего редактировалось 1 раз.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей