forum.bitel.ru
http://forum.bitel.ru/

Ошибка во время Month break
http://forum.bitel.ru/viewtopic.php?f=5&t=5840
Страница 1 из 1

Автор:  focus [ 01 сен 2011, 12:16 ]
Заголовок сообщения:  Ошибка во время Month break

Здравствуйте.

Ситуация следующая:
ночью сегодня BGRadius на границе месяцев выполнял сброс сессий (Month break).
Некоторое количество клиентов скинул нормально.
Далее, я предполагаю, Radius обрабатывал ответы от NAS'ов и съел максимальное
количество коннектов к БД, которые ему отведены (это 1500).
В течении 20 минут он их все 1500 держал активными (radius.sh status так показывал).
innotop не показывал бешеной загрузки и медленных запросов.
В логах BGRadius много вот таких ошибок:

Код:
radius 09-01/00:02:59 ERROR [radiusListener-p-3-t-732] ServerUtils -
java.lang.NullPointerException
        at ru.bitel.bgbilling.server.util.ServerUtils.closeConnection(ServerUtils.java:659)
        at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:138)
        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)


Как будто closeConnection пытается закрыть con = null

А ещё До предыдущей ошибки были вот такие Exception
Код:
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.j
at bitel.billing.server.contract.bean.BalanceUtils.setContractAccount(BalanceUtils.java:216)
at bitel.billing.server.dialup.bean.DialUpSessionUtils.setContractAccountFromSessionAccount(DialUp
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNasConnection.stopConnectionImpl(DialUpNasConnec
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNasConnection.stopConnection(DialUpNasConnection
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNas.doSessionStop(DialUpNas.java:594)
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNas.stopConnection(DialUpNas.java:568)
at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accounting(RadiusProcessor.java:456)
at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.accounting(DialUpRadiusProcessor
at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.accounting(DialUpRadiusProcessor
at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accountingRequest(RadiusProcessor.java
at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:176
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)


jstack не показал блокировок.

Прошу помочь разобраться с ошибкой.

P.S.
Помимо этого в коде, класса ConnectionBreaker
есть такие строки
Код:
while (Setup.getSetup().getMasterPoolLoad() > 0.2D)
{
  ((DialUpSessionRealtime)con.getSession()).addLogInfo("Month break skip by database load");
  sleep(random.nextInt(5000));
}


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

Автор:  Администратор [ 02 сен 2011, 11:55 ]
Заголовок сообщения:  Re: Ошибка во время Month break

"Month break skip by database load" - а эту фразу в connection.log бросал?

Автор:  focus [ 06 сен 2011, 09:41 ]
Заголовок сообщения:  Re: Ошибка во время Month break

Да бросал и очень много раз.
Т.е он зашёл в этот цикл и там остался "жить" - все выделенные коннекты к базе были исчерпаны.

Автор:  snark [ 06 сен 2011, 15:26 ]
Заголовок сообщения:  Re: Ошибка во время Month break

У меня глюков нет когда
Код:
кол-во коннектов к БД > auth.thread.count + acct.thread.count

Автор:  focus [ 07 сен 2011, 09:54 ]
Заголовок сообщения:  Re: Ошибка во время Month break

snark писал(а):
Код:
кол-во коннектов к БД > auth.thread.count + acct.thread.count


тоже количество коннектов больше

Автор:  snark [ 07 сен 2011, 13:06 ]
Заголовок сообщения:  Re: Ошибка во время Month break

А в мускуле сколько коннектов разрешено? Не К мускулу а В самом мускуле?

Автор:  focus [ 07 сен 2011, 14:06 ]
Заголовок сообщения:  Re: Ошибка во время Month break

4500

Автор:  focus [ 03 окт 2011, 06:10 ]
Заголовок сообщения:  Re: Ошибка во время Month break

Проблема повторяется.
На границе месяцtв Month break начинает работать.
1. В логике Month break есть момент, где проверяется загрузка БД. Если количество активных коннектов > 20% от максимального, то заморозить thread на некоторое время.
2. Далее все коннекты, отведенные для Radius, заканчиваются и далее НЕ ЗАКРЫВАЮТСЯ!
3. В итоге происходит бесконечный цикл!

Уважаемые разработчики!
Обратите внимание на эту проблему, пожалуйста.

Автор:  focus [ 03 окт 2011, 06:10 ]
Заголовок сообщения:  Re: Ошибка во время Month break

Проблема повторяется.
На границе месяцtв Month break начинает работать.
1. В логике Month break есть момент, где проверяется загрузка БД. Если количество активных коннектов > 20% от максимального, то заморозить thread на некоторое время.
2. Далее все коннекты, отведенные для Radius, заканчиваются и далее НЕ ЗАКРЫВАЮТСЯ!
3. В итоге происходит бесконечный цикл!

Уважаемые разработчики!
Обратите внимание на эту проблему, пожалуйста.

Автор:  Администратор [ 10 окт 2011, 12:44 ]
Заголовок сообщения:  Re: Ошибка во время Month break

Привет. У вас же 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

Автор:  focus [ 11 окт 2011, 07:52 ]
Заголовок сообщения:  Re: Ошибка во время Month break

Да, 5.1.
Цитата:
Вот это число потоков уменьшите до 20 и 30, больше смыслу нет.
Чтобы сглаживать колебание увеличьте размер очереди пакетов авторизации и аккаунтинга. До 200 и 300, например.
auth.thread.queue и acct.thread.queue


Спасибо. Попробуем.
О результатах напишу.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/