BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 13 май 2024, 04:45

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Ошибка во время Month break
СообщениеДобавлено: 01 сен 2011, 12:16 
Не в сети
Клиент

Зарегистрирован: 27 окт 2009, 16:17
Сообщения: 319
Откуда: Иркутск
Карма: 18
Здравствуйте.

Ситуация следующая:
ночью сегодня 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));
}


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 02 сен 2011, 11:55 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
"Month break skip by database load" - а эту фразу в connection.log бросал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 06 сен 2011, 09:41 
Не в сети
Клиент

Зарегистрирован: 27 окт 2009, 16:17
Сообщения: 319
Откуда: Иркутск
Карма: 18
Да бросал и очень много раз.
Т.е он зашёл в этот цикл и там остался "жить" - все выделенные коннекты к базе были исчерпаны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 06 сен 2011, 15:26 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
У меня глюков нет когда
Код:
кол-во коннектов к БД > auth.thread.count + acct.thread.count


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 07 сен 2011, 09:54 
Не в сети
Клиент

Зарегистрирован: 27 окт 2009, 16:17
Сообщения: 319
Откуда: Иркутск
Карма: 18
snark писал(а):
Код:
кол-во коннектов к БД > auth.thread.count + acct.thread.count


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 07 сен 2011, 13:06 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
А в мускуле сколько коннектов разрешено? Не К мускулу а В самом мускуле?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 07 сен 2011, 14:06 
Не в сети
Клиент

Зарегистрирован: 27 окт 2009, 16:17
Сообщения: 319
Откуда: Иркутск
Карма: 18
4500


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 03 окт 2011, 06:10 
Не в сети
Клиент

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 03 окт 2011, 06:10 
Не в сети
Клиент

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 10 окт 2011, 12:44 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Привет. У вас же 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка во время Month break
СообщениеДобавлено: 11 окт 2011, 07:52 
Не в сети
Клиент

Зарегистрирован: 27 окт 2009, 16:17
Сообщения: 319
Откуда: Иркутск
Карма: 18
Да, 5.1.
Цитата:
Вот это число потоков уменьшите до 20 и 30, больше смыслу нет.
Чтобы сглаживать колебание увеличьте размер очереди пакетов авторизации и аккаунтинга. До 200 и 300, например.
auth.thread.queue и acct.thread.queue


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.051s | 41 Queries | GZIP : On ]