Постоянные лаги и зависания сервера

Ошибки в работе сервера
ipbars
Сообщения: 195
Зарегистрирован: 22 янв 2015, 22:01

Постоянные лаги и зависания сервера

Сообщение ipbars » 03 фев 2015, 00:19

Уважаема Администрация сервера.
Проблема с лагами действительно не разрешима?
Уже третий вечер Сервер просто зависет намертв после каждого сохранения данных и и периодически просто падает.

1stAfterGod
Сообщения: 3
Зарегистрирован: 18 янв 2015, 21:50

Re: Постоянные лаги и зависания сервера

Сообщение 1stAfterGod » 03 фев 2015, 00:44

Поддерживаю. Пора уже разобраться и решить, что нужно для решения проблемы, а не спускать всё на авось. Когда сервер падает в единственные выходные за неделю, когда ты мог бы сделать овер много не есть хорошо. Админ проведи собрание, хотелось бы вести диалог. Если наладить ничего не получится, то нужно как минимум сказать об этом.


P.S. Вы принимаете Новых игроков на сервер увеличивая онлайн, а по факту это увеличивает лаги, ибо 20+ человек и играть уже не возможно. Вы либо приток игроков закройте, пока проблема не решится полностью и Вы не настроите всё как нужно. Либо в кратчайшие сроки решайте эту проблему.

P.S.s. "Кратчайшие сроки это не месяц."

Аватара пользователя
Serious07
Администратор
Сообщения: 3349
Зарегистрирован: 06 янв 2014, 17:26

Re: Постоянные лаги и зависания сервера

Сообщение Serious07 » 03 фев 2015, 00:48

Найдите ошибку в этом коде которую я ищу уже 9 дней и сервер будет работать без перезагрузок. http://pastebin.com/dJQtHSjS

Скажу больше чанки не выгружает даже OPIS.

При включенном save-on будет лагать на любом сервере( с GregTech 5) с развитыми базами, так как чанки выгружаются и загружаются каждые 30 секунд, ядром делу не поможешь, нужен механизм выгружающий чанки постепенно, и просчитывающий позицию игроков чтобы их не затрагивать.

1stAfterGod
Сообщения: 3
Зарегистрирован: 18 янв 2015, 21:50

Re: Постоянные лаги и зависания сервера

Сообщение 1stAfterGod » 03 фев 2015, 00:49

Serious07 писал(а):Найдите ошибку в этом коде которую я ищу уже 9 дней и сервер будет работать без перезагрузок. http://pastebin.com/dJQtHSjS

А мы не можем нанять специалиста, который понимает о чем идёт речь и сможет решить данную проблему?

Аватара пользователя
Mertran
Сообщения: 46
Зарегистрирован: 18 янв 2015, 16:30

Re: Постоянные лаги и зависания сервера

Сообщение Mertran » 03 фев 2015, 02:03

Если есть такой специалист, но стоит денюжку - давайте скинемся.

Аватара пользователя
Serious07
Администратор
Сообщения: 3349
Зарегистрирован: 06 янв 2014, 17:26

Re: Постоянные лаги и зависания сервера

Сообщение Serious07 » 03 фев 2015, 03:11

Добавил выгрузку чанков, по формуле PlayerCount*300 + 1000, но в момент выгрузки будет сильно лагать, другого решения пока не нашёл.

stictt
Сообщения: 34
Зарегистрирован: 19 янв 2015, 22:08

Re: Постоянные лаги и зависания сервера

Сообщение stictt » 03 фев 2015, 03:20

Serious07 писал(а):Найдите ошибку в этом коде которую я ищу уже 9 дней и сервер будет работать без перезагрузок. http://pastebin.com/dJQtHSjS

Скажу больше чанки не выгружает даже OPIS.

При включенном save-on будет лагать на любом сервере( с GregTech 5) с развитыми базами, так как чанки выгружаются и загружаются каждые 30 секунд, ядром делу не поможешь, нужен механизм выгружающий чанки постепенно, и просчитывающий позицию игроков чтобы их не затрагивать.

А что выдает компилятор ? или как то можно охарактиризовать ошибку ?

Аватара пользователя
Serious07
Администратор
Сообщения: 3349
Зарегистрирован: 06 янв 2014, 17:26

Re: Постоянные лаги и зависания сервера

Сообщение Serious07 » 03 фев 2015, 09:47

Ошибок при компиляции нет =) Код просто не работает.

timapple
Сообщения: 6
Зарегистрирован: 21 янв 2015, 16:56

Re: Постоянные лаги и зависания сервера

Сообщение timapple » 03 фев 2015, 10:11

Serious07, я готов помочь с кодом. Добавился в скайпе.

ipbars
Сообщения: 195
Зарегистрирован: 22 янв 2015, 22:01

Re: Постоянные лаги и зависания сервера

Сообщение ipbars » 03 фев 2015, 10:36

Залипать может только в этой функции

Код: Выделить всё

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 раз.


Вернуться в «Сервер»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 83 гостя