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

Память BGInetAccounting
http://forum.bitel.ru/viewtopic.php?f=44&t=8541
Страница 1 из 1

Автор:  Cromeshnic [ 08 окт 2013, 07:47 ]
Заголовок сообщения:  Память BGInetAccounting

BGInetAccounting стал непредсказуемо кушать много памяти.

Начал разбираться.
Первое, что сделал - разделил на 2 аккаунтинга: для Flow и для Radius.
Но радиус-аккаунтинг меньше кушать не стал.

Смотрю дамп, Biggest Objects - вижу в радиус-аккаунтинге 1 объект FlowAgentInterfaceMap размером 217MB
Вложение:
biggest_object.png
biggest_object.png [ 128.71 КБ | Просмотров: 14280 ]


Он такой большой, т.к. у меня 13 устройств, у каждого из которых очень много интерфейсов, а без указания flow.agent.link в этот объект попадают все интерфейсы устройства.

Вопрос, зачем этот объект вообще создаётся, если у меня в inet-accounting.xml относительно flow прописана только детализация:

Код:
        <context name="collector">

                <context name="detail">
                        <!-- Cоздание обработчика flow детализации -->
                        <bean name="detailWorker" class="ru.bitel.bgbilling.modules.inet.accounting.detail.InetDetailWorker"/>
                </context>
        </context>


?

Автор:  Cromeshnic [ 08 окт 2013, 07:53 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Указал пока что в конфиге типа устройства radius :
Код:
flow.agent.link={@deviceId}:0

- просто, чтобы создавалось меньше объектов.
Правда не уверен, как повлияет на детализацию.

Указал и перегрузил конфигурацию в 10:40 :
Вложение:
reload.png
reload.png [ 13.04 КБ | Просмотров: 14278 ]

Бум!

Автор:  Cromeshnic [ 08 окт 2013, 08:00 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Вот график за последние 2 недели.
От чего зависят эти скачки, я так и не понял.
Иногда через пару дней после рестарта аккаунтинга всё устаканивается до следующего рестарта.
Вложение:
2weeks.png
2weeks.png [ 43.13 КБ | Просмотров: 14277 ]

Автор:  Cromeshnic [ 08 окт 2013, 08:01 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Вот ещё непонятная картинка:
Вложение:
acct-mem-byte-ra.png
acct-mem-byte-ra.png [ 109.53 КБ | Просмотров: 14277 ]

Автор:  Cromeshnic [ 14 окт 2013, 13:03 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Интересно, что после в течение нескольких дней, если сервер не рестартовать, то память постепенно освобождается.
Вложение:
mem-week-acct.png
mem-week-acct.png [ 36.16 КБ | Просмотров: 14252 ]


Access так себя не ведёт, только Accounting радиуса.

Автор:  Cromeshnic [ 14 окт 2013, 13:16 ]
Заголовок сообщения:  Re: Память BGInetAccounting

А вот так себя ведут сервера при одновременном подключении новых клиентов: заведение сервисов на договорах и авторизация пачками по ~20 штук (делаем скриптом перенос клиентов с роутера на роутер).

Удивляют пики памяти у Accounting +300MB при таком переводе. Хорошо хоть, что освобождает быстро.

Вложение:
new_sessions.png
new_sessions.png [ 68.88 КБ | Просмотров: 14252 ]


Моменты подключений клиентов видно по зелёным полоскам Start и Accept - пакетов

Автор:  Amir [ 14 окт 2013, 14:41 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Покажите, пожалуйста, скрипт переноса - возможно какой-то определенный метод влияет на скачок.
Просто при создании сервиса же нет такого скачка?

Автор:  Cromeshnic [ 14 окт 2013, 14:57 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Так скрипт отрабатывает в контексте сервера - это динамический глобальный скрипт поведения.
Единственно, если он через события как-то влияет.

Автор:  Amir [ 14 окт 2013, 16:25 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Да, думаю через события. Возможно что-то перечитывать из БД начинает. Возможно какое-то перечитывание не оптимизировано.

Автор:  Amir [ 14 окт 2013, 17:58 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Может быть вызывается Перечитать конфигурацию на серверах (InetReloadEvent)?

Автор:  Cromeshnic [ 15 окт 2013, 07:34 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Порылся - не вызывается.
Вызываются devicePortUpdate и inetServUpdate.

Автор:  Cromeshnic [ 15 окт 2013, 08:37 ]
Заголовок сообщения:  Re: Память BGInetAccounting

А вот ещё какая штука - решил пересчитать текущий месяц по всем договорам - получил ошибку памяти BGInetAccounting:

Код:
mq 10-15/11:17:29 ERROR [Thread-47266] InetRecalculateEventProcessor -
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
        at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
        at java.util.concurrent.FutureTask.get(FutureTask.java:83)
        at ru.bitel.bgbilling.modules.inet.accounting.recalculate.InetRecalculateEventProcessor$Recalculator$1.run(InetRecalculateEventProcessor.java:350)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.OutOfMemoryError: Java heap space
        at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1676)
        at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1434)
        at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2936)
        at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:477)
        at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2631)
        at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1800)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2221)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
        at ru.bitel.bgbilling.modules.inet.accounting.recalculate.SessionRecalculateTarifficationManager.initDetailPSAndRS(SessionRecalculateTarifficationManager.java:624)
        at ru.bitel.bgbilling.modules.inet.accounting.recalculate.SessionRecalculateTarifficationManager.recalculate(SessionRecalculateTarifficationManager.java:228)
        at ru.bitel.bgbilling.modules.inet.accounting.recalculate.SessionRecalculateTarifficationManager.run(SessionRecalculateTarifficationManager.java:150)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        ... 1 more


Код:
ID события: system.no.memory
Время регистрации события: 15.10.2013 11:17:29 Хост сервера: ...

Приложению недостаточно выделенной для него памяти!
Зарезервировано 1122631680 из 1431699456 (максимум) байтов памяти.
Сейчас свободно: 274784904 байтов.

Необходимо выделить большее количество памяти приложению.

Вложение:
chart2 (2).png
chart2 (2).png [ 20.25 КБ | Просмотров: 14225 ]


Несмотря на ошибку, пришло письмо о завершении пересчёта:
Цитата:
Начисление Inet завершено
Время: 0 d 00:34:28

Автор:  Cromeshnic [ 15 окт 2013, 08:51 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Перед этим нашёл вот такую ошибку:
Цитата:
radius 10-15/11:15:35 WARN [rdsLstnr-p-8-t-9] CheckReentrantLock - Lock wait timeout (waiting next 15s)
java.lang.RuntimeException: Lock wait timeout for ContractRuntime[180029]@1314377511
at ru.bitel.common.util.CheckReentrantLock.lock(CheckReentrantLock.java:42)
at ru.bitel.bgbilling.kernel.contract.runtime.ContractRuntime.lock(ContractRuntime.java:104)
at ru.bitel.bgbilling.kernel.contract.runtime.ContractRuntime.lock(ContractRuntime.java:111)
at ru.bitel.bgbilling.modules.inet.runtime.InetServRuntime.lock(InetServRuntime.java:503)
at ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor.getNasConnectionIfExist(InetRadiusProcessor.java:1446)
at ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor.getNasConnection(InetRadiusProcessor.java:1668)
at ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor.getNasConnection(InetRadiusProcessor.java:1615)
at ru.bitel.bgbilling.modules.inet.radius.InetNas.updateConnection(InetNas.java:542)
at ru.bitel.bgbilling.modules.inet.radius.InetNas.updateConnection(InetNas.java:1)
at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accounting(RadiusProcessor.java:588)
at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accountingRequest(RadiusProcessor.java:519)
at ru.bitel.bgbilling.modules.inet.radius.InetRadiusListenerWorker.accountingRequest(InetRadiusListenerWorker.java:182)
at ru.bitel.bgbilling.modules.inet.radius.InetRadiusListenerWorker.accountingRequest(InetRadiusListenerWorker.java:1)
at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.processAccountingRequest(RadiusListenerWorker.java:271)
at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.processPacket(RadiusListenerWorker.java:242)
at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.runImpl(RadiusListenerWorker.java:135)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
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)
Caused by: java.lang.RuntimeException: OwnerThread: Thread[accwrkr-2-p-17-t-1,5,main]
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3345)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1983)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at ru.bitel.bgbilling.modules.inet.accounting.SessionFlushingManager.flushDetailDelta(SessionFlushingManager.java:706)
at ru.bitel.bgbilling.modules.inet.accounting.SessionFlushingManager.flushDelta(SessionFlushingManager.java:557)
at ru.bitel.bgbilling.modules.inet.accounting.SessionFlushingManager.flush(SessionFlushingManager.java:428)
at ru.bitel.bgbilling.modules.inet.accounting.SessionFlushingManager.runImpl(SessionFlushingManager.java:201)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
... 4 more


- это вроде фиксили уже, мы после этого обновлялись (было обращение в HD).
Других таких ошибок не было в логе, только одна.

Автор:  Cromeshnic [ 15 окт 2013, 08:55 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Чтобы оценить объёмы:
Код:
recalculate 10-15/11:09:49  INFO [Thread-47266] InetServRuntimeMap - Loaded 3193 inetServs.


Причём, у нас сессий на сервис мало - по одной в сутки, т.к. session timeout нет, поднимаются они на NAS-е, т.е. по факту коннекты висят месяцами.

Автор:  Cromeshnic [ 15 окт 2013, 08:59 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Кстати, судя по коду SessionRecalculateTarifficationManager, slave-база не используется :(

Автор:  Cromeshnic [ 15 окт 2013, 09:09 ]
Заголовок сообщения:  Re: Память BGInetAccounting

В логах BGInetAccounting вижу записи обсчёта SessionTarifficationManager только для текущей даты, хотя запускал за весь месяц.
Я правильно понимаю, что предыдущие дни обсчитывает планировщик, а текущий - BGInetAccounting?

Автор:  Cromeshnic [ 15 окт 2013, 11:27 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Есть ощущение, что при пересчёте текущего месяца, если не указывать конкретный день, то пересчитывается только текущий день.
Запустил за весь месяц - выполнялось 34 минуты:
Цитата:
Начисление Inet завершено
Время: 0 d 00:34:28


Запустил за 01.10.2013 - выполнялось 38 минут:
Цитата:
Начисление Inet завершено
Время: 0 d 00:38:19


Перед этим я поправил все тарифы по совету Амира, чтобы появился максимальный трафик.

Код:
mysql> select day, count(distinct contractId) from inet_tariff_traffic_max_detail_30_201310 group by day;
+-----+----------------------------+
| day | count(distinct contractId) |
+-----+----------------------------+
|   1 |                       1378 |
|  14 |                          1 |
|  15 |                       1378 |
+-----+----------------------------+
3 rows in set (0.09 sec)

Судя по этой выборке, пересчитались действительно только 1 и 15 число (14 я тестировал превалирующий трафик на 1 договоре).

Такие дела.

inet вер. 5.2 сборка 1243 от 07.10.2013 17:16:53

Когда мне Бител уже зарплату будет платить, как внештатному тестеру? :)

Автор:  Cromeshnic [ 15 окт 2013, 11:35 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Кстати, 01.10.2013 пересчиталось вообще без проблем - скачков памяти не заметил.

Автор:  Cromeshnic [ 15 окт 2013, 12:56 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Насчёт скачков памяти при заведении пользователей - похоже, это мой ISGIPoEProtocolHandler - он обновляет полностью кэш имён интерфейсов при изменении интерфейса на устройстве.
Буду оптимизировать.

Автор:  Cromeshnic [ 17 окт 2013, 10:39 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Выделил баг с переобсчётом в отдельную тему: viewtopic.php?f=44&t=8589

Автор:  lan31 [ 28 окт 2013, 07:30 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Сервер: вер. 6.0 сборка 1603 от 18.10.2013 19:38:05
os: FreeBSD; java: OpenJDK 64-Bit Server VM, v.1.6.0_32

И это при условии того что BGInetAccounting ничего не обрабатывает, никаких newflow и никаких radius потоков к нему нет.

Код:
10-27/22:45:37  WARN [Low Memory Detector] AlarmSender - Low memory - used=313046704, max=477233152
10-28/00:30:16  WARN [Low Memory Detector] AlarmSender - Low memory - used=314833304, max=477233152
10-28/02:27:56  WARN [Low Memory Detector] AlarmSender - Low memory - used=320897256, max=477233152
10-28/04:36:06  WARN [Low Memory Detector] AlarmSender - Low memory - used=327164920, max=477233152
10-28/06:30:14  WARN [Low Memory Detector] AlarmSender - Low memory - used=332898576, max=477233152
10-28/08:12:22  WARN [Low Memory Detector] AlarmSender - Low memory - used=338203960, max=477233152

Автор:  stark [ 29 окт 2013, 16:22 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Cromeshnic писал(а):
В логах BGInetAccounting вижу записи обсчёта SessionTarifficationManager только для текущей даты, хотя запускал за весь месяц.
Я правильно понимаю, что предыдущие дни обсчитывает планировщик, а текущий - BGInetAccounting?

Нет . Планировщик дает задания, в переобсчитывает BGInetAccounting.

Автор:  stark [ 29 окт 2013, 16:24 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Cromeshnic писал(а):
Кстати, судя по коду SessionRecalculateTarifficationManager, slave-база не используется :(


Давайте последовательно, вначале с памятью разберемся( обновление выложено ), а потом уже со slave-ом. slave можно будет использовать только при переобсчете прошлого, не текущего дня.

Автор:  lan31 [ 18 ноя 2013, 09:16 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Код:
11-18/11:09:21  WARN [Low Memory Detector] AlarmSender - Low memory - used=183701096, max=238616576
11-18/11:10:00  WARN [Low Memory Detector] AlarmSender - Low memory - used=183706048, max=238616576
11-18/11:11:49  WARN [Low Memory Detector] AlarmSender - Low memory - used=183788472, max=238616576
11-18/11:13:55  WARN [Low Memory Detector] AlarmSender - Low memory - used=183851832, max=238616576
11-18/11:15:01  WARN [Low Memory Detector] AlarmSender - Low memory - used=183860720, max=238616576
11-18/11:15:01  WARN [Low Memory Detector] AlarmSender - Low memory - used=183939224, max=238616576
11-18/11:15:18  WARN [Low Memory Detector] AlarmSender - Low memory - used=183962120, max=238616576

Java Runtime: Sun Microsystems Inc. OpenJDK 64-Bit Server VM [1.6.0_32] /usr/local/openjdk6/jre
  Runtime name: 87413@bgb.krasinfo.ru
  Java endorsed dirs: /lib/endorsed:/usr/local/openjdk6/lib/endorsed
  OS: FreeBSD 9.1-RELEASE-p5 [amd64], file.encoding: UTF-8, user.name: root
  Heap sizes: current=93824k  free=92843k  max=1392640k
Kernel version 6.0 build 1632 from 13.11.2013 17:18:28
Inet version 6.0 build 1266 from 13.11.2013 19:22:07
Radius:
  accounting-requests per minute start: 0; stop: 0; update: 0
  access-requests per minute accept: 0; reject: 0
  ignore per minute access-request: 0; accounting-update: 0
Flow listener [null:2001]
  flow packets in current minute: 0
Flow listener [null:9367]
  flow packets in current minute: 0
Flow listener [null:9368]
  flow packets in current minute: 0

Started: 14.11.2013 09:56:04    Uptime: 4 d 01:19:21
Memory total: 190 906 368; max: 238 616 576; free: 6 464 016
Memory pools:
  Non-heap memory[Code Cache]: max: 50 331 648; used: 3 737 792; peek: 3 746 432
  Heap memory[PS Eden Space]: max: 88 801 280; used: 5 485 304; peek: 75 300 864
  Heap memory[PS Survivor Space]: max: 262 144; used: 0; peek: 4 681 376
  Heap memory[PS Old Gen]: max: 178 978 816; used: 178 975 568; peek: 178 978 808
  Non-heap memory[PS Perm Gen]: max: 85 983 232; used: 26 675 824; peek: 26 678 928
Thread count: 36
Trees in cache: 0
Connections pool to Master status Idle: 2; Active: 0; maxActive: 300; maxIdle: 20

Автор:  Cromeshnic [ 18 ноя 2013, 10:13 ]
Заголовок сообщения:  Re: Память BGInetAccounting

256 - всяко мало

Автор:  skyb [ 18 ноя 2013, 16:53 ]
Заголовок сообщения:  Re: Память BGInetAccounting

Cromeshnic писал(а):
256 - всяко мало

всем хватит 64к(с) Билл Гейтс

Автор:  Artur [ 28 ноя 2013, 13:23 ]
Заголовок сообщения:  Re: Память BGInetAccounting

skyb писал(а):
Cromeshnic писал(а):
256 - всяко мало

всем хватит 64к(с) Билл Гейтс


640, если точнее

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