Проблема с зависанием сервера

Володя

Fantix Attack
VIP
Участник Новогоднего Фонда 2024
Победитель в номинации 2024
Старожил I степени
Участник Новогоднего Фонда 2023
Победитель в номинации 2023
Победитель в номинации 2022
Сообщения
316
Розыгрыши
0
Решения
2
Репутация
22
Реакции
147
Баллы
1 465
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
l2j-dev
Проблема такая, сервер может работать год и ничего не происходит и вот в этом месяце третий раз повторятся одна и таже проблема, причем сейчас онлайн на дне.
Суть зависание визуально со стороны игрока выглядит очень просто - время бафа доходит до 0 и эффект на спадает, в течение получаса - часа сервер зависает (рандомный мини евент с френзи иконами и апетитами).
Естественно поймать данный баг не получается уже более 5 лет.
Подозрение на цикл, который забивает тред пул, но как поймать баг мыслей даже не имею.
Так же в этой сборке был цикл, связанный с таликом на трансфер пейн сумоном и пати уд.
Исходы l2j-dev

мб у кого есть какие то мысли, ну либо примеры зацикливания кода, куда глядеть чо делать?
 

Оверпостинг
А автофарм у тебя имеется?
нет

Я думаю проблема в работе какова то эффекта возможно пару эффектов, которые при взаимодействие начинается бесконечный цикл который вешает очереди
пример приводил подобного цикла, который очень сложно воспроизвести
пет + талик на распредел хп + пати уд + блеед от тх
 
Последнее редактирование модератором:
Я думаю проблема в работе какова то эффекта возможно пару эффектов, которые при взаимодействие начинается бесконечный цикл который вешает очереди
пример приводил подобного цикла который очень сложно воспроизвести
пет + талик на распредел хп + пати уд + блеед от тх
Если у тебя редико это происходит, то мне кажется это скорее всего тупо забивание потоков(пулов).
Ибо у нас на сервере с автофармом на той же сборке всё происходит намного быстрее и чаще, но в пики онлайна.
Тут даже сложно сказать.
На жуке есть инфа от 13 года про забаг эффектов, но там он связан с картией, а картия это уже год.... и с петом в частности )
 
Если у тебя редико это происходит, то мне кажется это скорее всего тупо забивание потоков(пулов).
Ибо у нас на сервере с автофармом на той же сборке всё происходит намного быстрее и чаще, но в пики онлайна.
Тут даже сложно сказать.
На жуке есть инфа от 13 года про забаг эффектов, но там он связан с картией, а картия это уже год.... и с петом в частности )
если это было бы так, то оно бы не забивалось при онлайне в 20 человек в 8 утра после рестарта.
при этом могло работать на больших онлайнах годами)
просто логически не вяжется.
 
если это было бы так, то оно бы не забивалось при онлайне в 20 человек в 8 утра после рестарта.
при этом могло работать на больших онлайнах годами)
просто не вяжется.
Не вяжется с эти багов вообще ничего) Ловим его на протяжении 5 лет и всегда при разных условиях
 
может это еще один бекдор и один из 20 онлайна юзает его назло?))
 
Я бы повесил счетчик на вызов next эффекта и выгрузил статистику с разбиением по перцентилям. Мне кажется, где-то просто вы ловите рекурсию, которая вам просто забивает очередь. Если у вас все эффекты шедулятся в общий пул, то там накладные расходы просто на сортировку этих тасков во внутренней DelayQueue начинают преобладать и из-за этого задачи стоят в очереди валидные, т.к у рекурсивных задач разница выполнения - наносекунды.

Эффект не проявляется регулярно, т.к баг в каком-то скилле, который сам себя вызывает.
Могу предположить, что это может быть что-то из ХФ контента, например бесконечные яды или блиды в ДВ-ЛОА, либо какие-то эффекты зон от SoA.
 
Последнее редактирование:
Кстати да может там где какой эффект типа i_call_skill в каком-то достаточно редко вызываемом скилле и в котором по ошибке задан вызов этого же скилла, т.е. оно тупо само себя бесконечно будет вызвать после первого каста.
Я недавно в процессе колупания скиллов тоже по невнимательности умудрился такое сделать в одном из скиллов, благо достаточно быстро на косяк наткнулся. После чего добавил "защиту от дурака", чтобы сразу ругалось если обнаруживается зацикленность вызова.
 
Не вяжется с эти багов вообще ничего) Ловим его на протяжении 5 лет и всегда при разных условиях
ну как зависнет делай
jstack -l ид_процесса_гс >C:\thread_dump.txt
на ебунте по моему без -l
 
Проверь скиллы в "danger" зонах, типо:
4625 - Decrease Speed (Castle Damage Zones)
4148 - Poison (Swamp Of Screams)
4150 - Flame (лава в блейзинг свамп)

может при "заходах - выходах" в такие зоны, где вешается дебаф некорретно эффект завершается, может перса критует там или специально кто-то делает что.
 
Сегодня поймал залаг бафа
Код:
"ThreadPoolExecutor-7" #59 [5320] prio=5 os_prio=0 cpu=24812.50ms elapsed=40372.55s tid=0x000000b6cc11f910 nid=5320 waiting for monitor entry  [0x000000b6d1ece000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.mmocore.gameserver.model.Effect.exit(Effect.java:458)
    - waiting to lock <0x000000060f498bb0> (a org.mmocore.gameserver.skills.effects.EffectCancelTransform)
    at org.mmocore.gameserver.model.Effect.exit(Effect.java:446)
    at org.mmocore.gameserver.model.EffectList.addEffect(EffectList.java:396)
    at org.mmocore.gameserver.model.Effect.schedule(Effect.java:331)
    at org.mmocore.gameserver.model.Skill$1.runImpl(Skill.java:1589)
    at org.mmocore.commons.threading.RunnableImpl.run(RunnableImpl.java:20)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@21/Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@21/ThreadPoolExecutor.java:642)
    at java.lang.Thread.runWith(java.base@21/Unknown Source)
    at java.lang.Thread.run(java.base@21/Unknown Source)
    at org.mmocore.commons.threading.PriorityThreadFactory$1.run(PriorityThreadFactory.java:31)

   Locked ownable synchronizers:
    - <0x00000005a6c001c8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
    - <0x000000061c82d090> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)


так же дедлок

Код:
Found one Java-level deadlock:
=============================
"ScheduledThreadPool-2":
  waiting for ownable synchronizer 0x000000061c82d090, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "ThreadPoolExecutor-7"

"ThreadPoolExecutor-7":
  waiting to lock monitor 0x000000b6ce5d85f0 (object 0x000000060f498bb0, a org.mmocore.gameserver.skills.effects.EffectCancelTransform),
  which is held by "ThreadPoolExecutor-4"

"ThreadPoolExecutor-4":
  waiting for ownable synchronizer 0x000000061c82d090, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "ThreadPoolExecutor-7"

Java stack information for the threads listed above:
===================================================
"ScheduledThreadPool-2":
    at jdk.internal.misc.Unsafe.park(java.base@21/Native Method)
    - parking to wait for  <0x000000061c82d090> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(java.base@21/Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@21/Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@21/Unknown Source)
    at java.util.concurrent.locks.ReentrantLock$Sync.lock(java.base@21/ReentrantLock.java:153)
    at java.util.concurrent.locks.ReentrantLock.lock(java.base@21/ReentrantLock.java:322)
    at org.mmocore.gameserver.model.EffectList.lock(EffectList.java:89)
    at org.mmocore.gameserver.model.EffectList.removeEffect(EffectList.java:458)
    at org.mmocore.gameserver.model.Effect.runImpl(Effect.java:429)
    at org.mmocore.commons.threading.RunnableImpl.run(RunnableImpl.java:20)
    at org.mmocore.commons.threading.SteppingRunnableQueueManager$SteppingScheduledFuture.run(SteppingRunnableQueueManager.java:163)
    at org.mmocore.commons.threading.SteppingRunnableQueueManager.run(SteppingRunnableQueueManager.java:88)
    at java.util.concurrent.Executors$RunnableAdapter.call(java.base@21/Executors.java:572)
    at java.util.concurrent.FutureTask.runAndReset(java.base@21/FutureTask.java:358)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@21/ScheduledThreadPoolExecutor.java:305)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@21/Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@21/ThreadPoolExecutor.java:642)
    at java.lang.Thread.runWith(java.base@21/Unknown Source)
    at java.lang.Thread.run(java.base@21/Unknown Source)
    at org.mmocore.commons.threading.PriorityThreadFactory$1.run(PriorityThreadFactory.java:31)
"ThreadPoolExecutor-7":
    at org.mmocore.gameserver.model.Effect.exit(Effect.java:458)
    - waiting to lock <0x000000060f498bb0> (a org.mmocore.gameserver.skills.effects.EffectCancelTransform)
    at org.mmocore.gameserver.model.Effect.exit(Effect.java:446)
    at org.mmocore.gameserver.model.EffectList.addEffect(EffectList.java:396)
    at org.mmocore.gameserver.model.Effect.schedule(Effect.java:331)
    at org.mmocore.gameserver.model.Skill$1.runImpl(Skill.java:1589)
    at org.mmocore.commons.threading.RunnableImpl.run(RunnableImpl.java:20)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@21/Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@21/ThreadPoolExecutor.java:642)
    at java.lang.Thread.runWith(java.base@21/Unknown Source)
    at java.lang.Thread.run(java.base@21/Unknown Source)
    at org.mmocore.commons.threading.PriorityThreadFactory$1.run(PriorityThreadFactory.java:31)
"ThreadPoolExecutor-4":
    at jdk.internal.misc.Unsafe.park(java.base@21/Native Method)
    - parking to wait for  <0x000000061c82d090> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(java.base@21/Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@21/Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@21/Unknown Source)
    at java.util.concurrent.locks.ReentrantLock$Sync.lock(java.base@21/ReentrantLock.java:153)
    at java.util.concurrent.locks.ReentrantLock.lock(java.base@21/ReentrantLock.java:322)
    at org.mmocore.gameserver.model.EffectList.lock(EffectList.java:89)
    at org.mmocore.gameserver.model.EffectList.removeEffect(EffectList.java:458)
    at org.mmocore.gameserver.model.Effect.exit(Effect.java:466)
    at org.mmocore.gameserver.model.Effect.exit(Effect.java:446)
    at org.mmocore.gameserver.model.Player.stopTransformation(Player.java:8621)
    at org.mmocore.gameserver.skills.effects.EffectCancelTransform.onStart(EffectCancelTransform.java:22)
    at org.mmocore.gameserver.model.Effect.start(Effect.java:363)
    - locked <0x000000060f498bb0> (a org.mmocore.gameserver.skills.effects.EffectCancelTransform)
    at org.mmocore.gameserver.model.EffectList.addEffect(EffectList.java:431)
    at org.mmocore.gameserver.model.Effect.schedule(Effect.java:331)
    at org.mmocore.gameserver.model.Skill$1.runImpl(Skill.java:1589)
    at org.mmocore.commons.threading.RunnableImpl.run(RunnableImpl.java:20)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@21/Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@21/ThreadPoolExecutor.java:642)
    at java.lang.Thread.runWith(java.base@21/Unknown Source)
    at java.lang.Thread.run(java.base@21/Unknown Source)
    at org.mmocore.commons.threading.PriorityThreadFactory$1.run(PriorityThreadFactory.java:31)

Found 1 deadlock.
 
Нужно переписывать эффект лист на лок-фри версию и отказываться от шедула отдельных эффектов в общий пул. Это настолько хуевая идея у лыжи была изначально, что аж жуть пробирает.
 
Привет народ. А что за бекдор в l2j-dev? где он в коде фиксите? Покажите плиз =)
 
Привет народ. А что за бекдор в l2j-dev? где он в коде фиксите? Покажите плиз =)
В классе StrTable. Этот бэкдор был портирован с JTS случайно разрабом.
По определенной команде с чата начинается рекурсивный цикл вычисления двух дробей, которые выжирают память.
 
Назад
Сверху