forum.bitel.ru http://forum.bitel.ru/ |
|
[BUG] Deadlock в BGRadiusDialup при авторизации http://forum.bitel.ru/viewtopic.php?f=5&t=5544 |
Страница 1 из 1 |
Автор: | Cromeshnic [ 31 май 2011, 07:59 ] |
Заголовок сообщения: | [BUG] Deadlock в BGRadiusDialup при авторизации |
Версия радиуса: version 5.1 build 276 from 07.04.2011 12:20:07 Сегодня массово сбрасывали сессии на NAS-ах, словили такую проблему: радиус съел все разрешенные коннекты к базе и не освобождал их до перезагрузки. Сделал jstack, jmap, сохранили логи, сел разбираться. В jstack половина потоков висит на ожидании получения коннекта: Код: "radiusListener-p-3-t-311" prio=10 tid=0x0000000041cc2800 nid=0x2c75 in Object.wait() [0x00007fd229ad9000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:942) - locked <0x00007fd28cb2fb60> (a org.apache.commons.pool.impl.GenericObjectPool) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBConnectionFromPool(DefaultServerSetup.java:499) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBTrashOrMasterConnectionFromPool(DefaultServerSetup.java:703) at bitel.billing.server.script.bean.ScriptMachine.logFunctionProcess(ScriptMachine.java:258) at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:163) at bitel.billing.server.script.bean.event.EventProcessor.processContractEvent(EventProcessor.java:313) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:231) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:215) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:194) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:328) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) Вторая половина висит на ожидании входа в synchronized метод bitel.billing.server.processor.LC_LimitChecker.canComeIn() : Код: "radiusListener-p-3-t-314" prio=10 tid=0x0000000040d94800 nid=0x2c78 waiting for monitor entry [0x00007fd2297d5000] java.lang.Thread.State: BLOCKED (on object monitor) at bitel.billing.server.processor.LC_LimitChecker.canComeIn(LC_LimitChecker.java:73) - waiting to lock <0x00007fd28cbb8b58> (a ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor$1) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:890) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authenticationImpl(AbstractRadiusProcessor.java:411) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:594) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authentication(AbstractRadiusProcessor.java:192) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.authentication(RadiusSession.java:114) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.accessRequest(RadiusSession.java:92) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:316) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) А заткнулось всё на этом потоке: Код: "radiusListener-p-3-t-319" prio=10 tid=0x0000000041c67800 nid=0x2c7d in Object.wait() [0x00007fd2292d0000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:942) - locked <0x00007fd28cb2fb60> (a org.apache.commons.pool.impl.GenericObjectPool) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBConnectionFromPool(DefaultServerSetup.java:499) at bitel.billing.server.processor.LC_CheckingLogin.getStatus(LC_CheckingLogin.java:39) at bitel.billing.server.processor.LC_CheckingLogin.canLoginComeIn(LC_CheckingLogin.java:162) at bitel.billing.server.processor.LC_LimitChecker.canComeIn(LC_LimitChecker.java:79) - locked <0x00007fd28cbb8b58> (a ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor$1) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:890) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authenticationImpl(AbstractRadiusProcessor.java:411) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:594) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authentication(AbstractRadiusProcessor.java:192) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.authentication(RadiusSession.java:114) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.accessRequest(RadiusSession.java:92) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:316) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) Как я понимаю, при вызове метода ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization() тред уже берёт один коннект к базе из пула. Затем он запускает метод bitel.billing.server.processor.LC_LimitChecker.canComeIn(), в недрах которого коннект к базе получается заново. Получается, что первый коннект он успел схватить, а на получении второго застрял, т.к. они закончились. Дальше т.к. метод canComeIn() - синхронизирован, то все остальные потоки авторизации затыкаются либо на нём, либо на получении коннекта к базе. Как-то так, в целом. Правда не совсем понятно, как куча потоков авторизации, ожидающих canComeIn(), получила первый коннект к мускулю, а наш поток так и остался ждать своей очереди. Вот. Могу выслать на почту, если надо:
connection.log.err.2011-05-31-07:26 error.log.err.2011-05-31-07:26 innodbstat.log.2011-05-31-07:26 mq.log.err.2011-05-31-07:26 mysql.proc.2011-05-31-07:26 processor.log.err.2011-05-31-07:26 radius.jmap.2011-05-31-07:26 radius.jstack.2011-05-31-07:26 radius.log.err.2011-05-31-07:26 radius.out.err.2011-05-31-07:26 rad_ps.2011-05-31-07:26 script.log.err.2011-05-31-07:26 status.log.2011-05-31-07:26 |
Автор: | Cromeshnic [ 02 июн 2011, 11:13 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
up |
Автор: | Amir [ 07 июн 2011, 21:16 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Выложили обновление радиуса, где лишние соединение к базе не берется. А сколько в radius.properties auth.thread.count, db.maxActive? |
Автор: | Cromeshnic [ 08 июн 2011, 06:34 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Сейчас так: Код: db.maxActive=1500 auth.thread.count=900 acct.thread.count=500 На момент ошибки не помню уже, возможно поменьше чуть. Вложение: Столько много нужно для всяких внезапных массовых сбросов и т.п. |
Автор: | snark [ 08 июн 2011, 16:10 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Cromeshnic писал(а): Сейчас так: Код: auth.thread.count=900 acct.thread.count=500 Оппа! Понимаю что можно писать хоть 100500, но их вроде максимум 110 может быть, не? |
Автор: | Amir [ 08 июн 2011, 17:05 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Похоже что случилось так, что потоков было 900, а соединений к базе взялось в два раза больше. Теперь, без лишнего получения будет получше. Цитата: Оппа! Понимаю что можно писать хоть 100500, но их вроде максимум 110 может быть, не? На максимум там проверки нет.Цитата: auth.thread.count=900 А увеличенное количество сильно помогает? Там же, если потоки не успевают обрабатывать, все равно задача кладется в очередь.
|
Автор: | snark [ 08 июн 2011, 18:14 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Amir писал(а): Цитата: Оппа! Понимаю что можно писать хоть 100500, но их вроде максимум 110 может быть, не? На максимум там проверки нет. Я правильно понимаю что можно написать 100500 (т.к. нет проверки), но работать всеравно будет 110? Если нет, то как? А еще лучше - разъясните раз и навсегда как оптимально высчитывать эти параметры исходя из того что нам дает "status". Поймите правильно - _очень_ хочется подробностей, т.к. этот вопрос регулярно поднимается из за того что RADIUS для многих - основная часть системы. |
Автор: | Cromeshnic [ 09 июн 2011, 07:10 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
110 - это вообще откуда? Amir писал(а): А увеличенное количество сильно помогает? Там же, если потоки не успевают обрабатывать, все равно задача кладется в очередь. Эмм, уже точно не помню, вроде стало лучше. Если кладёт в очередь, то откуда берутся auth ignore? Вложение: Хотя на картинке auth ignore возможно был во время бага. Это мы сбрасывали пачками пользователей по NAS-ам. Заходим на NAS - сбрасываем всех - ждём, пока радиус всех прожуёт - заходим на следующий... snark писал(а): Поймите правильно - _очень_ хочется подробностей, т.к. этот вопрос регулярно поднимается из за того что RADIUS для многих - основная часть системы. Кстати да, все настройки правим по наитию. |
Автор: | Amir [ 09 июн 2011, 13:23 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Цитата: Если кладёт в очередь, то откуда берутся auth ignore? Это зависит от параметра auth.thread.queue, который по умолчанию равен количеству потоков. Если очередь (а в очередь задача попадает, если нет ни одного свободного потока для работы) становится больше чем auth.thread.queue, начинаются ignore. |
Автор: | Amir [ 09 июн 2011, 13:35 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Я не могу сказать, какое значение будет оптимальным в конкретном случае. auth.thread.count просто означает, какое максимальное количество потоков будет одновременно будут обрабатывать пакеты, т.е. это также означает сколько потоков будут одновременно работать с базой. Большее, чем ядер, количество потоков выигрывает в основном за счет задержек ввода/вывода, в том числе общения по сети (например, пока один поток ждет ответа от mysql, другой может что-нибудь делать). auth.thread.queue - максимальный размер очереди, при превышении которого радиус начинает игнорить пакеты. (Чтобы не съесть всю память и для авторизации - так-как у наса может выйти таймаут ответа, пока радиус доберется до задачи, тогда задача выполнится в пустую). |
Автор: | Cromeshnic [ 09 июн 2011, 14:32 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Спасибо. Я про auth.thread.queue не знал. В доках ничего нет про это: http://bgbilling.ru/v5.1/doc/ch13s09s03.html |
Автор: | snark [ 09 июн 2011, 15:39 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Cromeshnic писал(а): 110 - это вообще откуда? Отсюда: Администратор писал(а): auth.thread.must.be.free.count - определяет число "глотающих" потоков. Т.е. в случае заполнения пула какое-то число потоков должно оставаться свободным, чтобы "проглатывать" запросы, обеспечивая по факту освобождения БД обработку самых свежих. Делать эту переменную больше 5 смыслу особо нет, т.к. процесс быстрый. acct.thread.must.be.free.count - можно оставить где-то 10 потоков, чтобы 10 потоков всегда обрабатывали пакеты старта и стопа. А общее число потоков авторизации и аккаунтинга можно максимум в 110 поставить тех и тех. Вообще аккаунтинг менее приоритетен, но с другой стороны апдейтов идёт зато в 10 раз больше обычно чем авторизаций. Поэтому поровну в самый раз. Подобная конфигурация до 60 000 одновременных коннектов проверялась. Дальнейшее увеличение потоков эффекта особого не даст (если только у вас не больше 100 ядер ![]() Amir писал(а): auth.thread.queue - максимальный размер очереди Оппа! Еще один параметр ... Господа разработчики, пожалуйста, очень прошу, напишите уже наконец гайд по оптимизации RADIUS сервера с учетом всех указанных и не указанных (sic!) в доке параметров - всем от этого только лучше будет! Мы будем счастливы от того что RADIUS не падает, а Вы - от того что не надо одно и то же регулярно писать. |
Автор: | Amir [ 09 июн 2011, 16:14 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Цитата: Оппа! Еще один параметр ... Это аналог acct.thread.must.be.free.count, просто более правильная его интерпретация. |
Автор: | Cromeshnic [ 01 авг 2011, 10:23 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Снова повторилось на границе месяцев при массовом сбросе. Причина такая же, только в другом методе. Причина: Код: "radiusListener-p-3-t-775" prio=10 tid=0x00007fadacc0c000 nid=0x4c28 in Object.wait() [0x00007fad95ea3000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:942) - locked <0x00007fadc08d6970> (a org.apache.commons.pool.impl.GenericObjectPool) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBConnectionFromPool(DefaultServerSetup.java:499) at bitel.billing.server.processor.LC_CheckingLogin.loadConditions(LC_CheckingLogin.java:123) at bitel.billing.server.processor.LC_CheckingLogin.<init>(LC_CheckingLogin.java:34) at bitel.billing.server.processor.LC_LimitChecker.createCheckingLogin(LC_LimitChecker.java:92) at bitel.billing.server.processor.LC_LimitChecker.registerLogin(LC_LimitChecker.java:26) - locked <0x00007fadc09e4d20> (a ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor$1) at bitel.billing.server.processor.LC_LimitChecker.canComeIn(LC_LimitChecker.java:74) - locked <0x00007fadc09e4d20> (a ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor$1) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:892) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authenticationImpl(AbstractRadiusProcessor.java:411) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:596) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authentication(AbstractRadiusProcessor.java:192) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.authentication(RadiusSession.java:114) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.accessRequest(RadiusSession.java:92) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:316) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) Повисшие треды: Код: "radiusListener-p-3-t-714" prio=10 tid=0x00007fadac918000 nid=0x4740 waiting for monitor entry [0x00007fad31521000] java.lang.Thread.State: BLOCKED (on object monitor) at bitel.billing.server.processor.LC_LimitChecker.canComeIn(LC_LimitChecker.java:74) - waiting to lock <0x00007fadc09e4d20> (a ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor$1) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:892) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authenticationImpl(AbstractRadiusProcessor.java:411) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:596) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authentication(AbstractRadiusProcessor.java:192) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.authentication(RadiusSession.java:114) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.accessRequest(RadiusSession.java:92) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:316) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) Код: version 5.1 build 287 from 08.06.2011 20:40:34 01.08.2011 00:40:06 2365 0 2095 270 Request accounts per minute start: 0; stop: 0; update: 0 Request auths per minute accept: 0; reject: 0 Netfow packets per minute: 8614 Ignore per minute auth: 125; update: 0 Antispam ban count: 0; used per minute: 0 FlowListener: queue_size: 0; threads_active: 0; largest: 20; core: 20; pool_size: 20; recv_socket_buf_size: 131 071; recv_buf_size: 8 388 608; packets: 28354151 Started: 28.07.2011 10:41:45 Uptime: 3 d 13:58:20 Memory total: 570 818 560; max: 715 849 728; free: 95 084 544 Memory pools: Non-heap memory[Code Cache]: max: 50 331 648; used: 9 596 416; peek: 9 597 824 Heap memory[PS Eden Space]: max: 199 491 584; used: 61 051 544; peek: 258 801 664 Heap memory[PS Survivor Space]: max: 33 161 216; used: 4 325 376; peek: 89 440 296 Heap memory[PS Old Gen]: max: 536 870 912; used: 410 357 096; peek: 410 357 096 Non-heap memory[PS Perm Gen]: max: 88 080 384; used: 28 470 320; peek: 28 470 320 Thread count: 1725 Trees in cache: 162 Connections pool to Master status Idle: 0; Active: 1500; maxActive: 1500; maxIdle: 50 Код: db.maxActive=1500 auth.thread.count=900 acct.thread.count=500 netflow.thread.count=20 auth.thread.must.be.free.count=30 acct.thread.must.be.free.count=50 По-идее надо чтобы thread.count кончалось раньше, чем коннекты к базе. Уменьшил auth до 800 и acct до 300. |
Автор: | Cromeshnic [ 10 окт 2011, 07:37 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Видимо всё-таки правило auth.thread.count + acct.thread.count < db.maxActive не совсем верно, т.к. в коде куча мест, где на обработку одного пакета берётся второй (а может и третий?) коннект к базе, отчего при большой нагрузке может быть deadlock, что периодически и наблюдаем. Например: Код: "radiusListener-p-3-t-295" prio=10 tid=0x00007fc34081d000 nid=0x78db in Object.wait() [0x00007fc307c83000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:942) - locked <0x00007fc34b8053e0> (a org.apache.commons.pool.impl.GenericObjectPool) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBConnectionFromPool(DefaultServerSetup.java:499) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:125) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) "radiusListener-p-3-t-294" prio=10 tid=0x00007fc340819800 nid=0x78d8 in Object.wait() [0x00007fc307e84000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:942) - locked <0x00007fc34b8053e0> (a org.apache.commons.pool.impl.GenericObjectPool) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBConnectionFromPool(DefaultServerSetup.java:499) at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:123) at bitel.billing.server.script.bean.event.EventProcessor.processContractEvent(EventProcessor.java:313) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:231) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:199) at bitel.billing.server.processor.dialup.DialUpSessionRealtime.setCalculatePeriod(DialUpSessionRealtime.java:1940) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:744) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authorization(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authenticationImpl(AbstractRadiusProcessor.java:411) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:596) at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.authenticationImpl(DialUpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.AbstractRadiusProcessor.authentication(AbstractRadiusProcessor.java:192) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.authentication(RadiusSession.java:114) at ru.bitel.bgbilling.kernel.network.radius.RadiusSession.accessRequest(RadiusSession.java:92) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:316) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) "radiusListener-p-3-t-257" prio=10 tid=0x00007fc340243800 nid=0x7895 in Object.wait() [0x00007fc30a3aa000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:942) - locked <0x00007fc34b8053e0> (a org.apache.commons.pool.impl.GenericObjectPool) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBConnectionFromPool(DefaultServerSetup.java:499) at ru.bitel.bgbilling.server.util.DefaultServerSetup.getDBTrashOrMasterConnectionFromPool(DefaultServerSetup.java:703) at ru.bitel.bgbilling.kernel.network.radius.RadiusUtils.insertToLog(RadiusUtils.java:576) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accessRequest(RadiusProcessor.java:299) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:130) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) Хотелось бы услышать от разработчиков, сколько максимум коннектов может требоваться для обработки 1 пакета. |
Автор: | Amir [ 10 окт 2011, 15:30 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Максимум - должно быть два. Есть старые классы, которые для "универсальности" прямо в методе берут соединение и по окончании работы метода - завершают. Сложно поменять. |
Автор: | snark [ 10 окт 2011, 18:56 ] |
Заголовок сообщения: | Re: [BUG] Deadlock в BGRadiusDialup при авторизации |
Тут: Администратор писал(а): Привет. У вас же 5.1 версия?
Код: auth.thread.count=300 acct.thread.count=200 Вот это число потоков уменьшите до 20 и 30, больше смыслу нет. Чтобы сглаживать колебание увеличьте размер очереди пакетов авторизации и аккаунтинга. До 200 и 300, например. auth.thread.queue и acct.thread.queue http://www.bgbilling.ru/v5.1/doc/ch13s0 ... l#d0e12831 Эти параметры с 5.1 вообще не нужны: Код: auth.thread.must.be.free.count=30 acct.thread.must.be.free.count=50 |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |