Биллинг медленно работает

Skip to end of metadata
Go to start of metadata

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

В любом случае нестандартного поведения сервера полезно проверять системный лог
tail -f /var/log/messages

Перегрев процессора

Пример записи в логе /var/log/messages корневой системы
  * CPU3: Package temperature above threshold, cpu clock throttled

Такая запись в логе говорит о том, что система приостанавливает процессор из-за перегрева. Проверьте температуру процессора с помощью утилиты sensors (устанавливается с помощью команды yum install lm_sensors)

Другие проблемы аппаратного обеспечения

Пример записи в логе /var/log/messages корневой системы
  * [Hardware Error]: Machine check events logged

Запись говорит об аппаратной проблеме, выявленной при самодиагностике ОС. Например, это исправленная ошибка в памяти с исправлением ошибок (ECC). В большинстве случаев не является причиной замедления работы, однако в случае повторения чаще чем раз в пару месяцев необходима расширенная диагностика памяти.

Проблемы дисковой подсистемы

Если в top/atop длительно присутствуют процессы в состоянии D (непрерываемый сон), то в большинстве случаев это следствие недостатка производительности дисковой подсистемы.
Запускаем в момент проблемы:

iostat -dmx 2

либо

iostat -dmx 2 /dev/sda /dev/sdb

где 2 - интервал повторения в сек, /dev/sdX - интересующие нас диски (без них покажет все)

Нужно обратить внимание на соотношение столбцов rMB/s и/или wMB/s с %util. Если %util больше 90 при скорости менее 10 мегабайт/сек (в любую сторону), то налицо деградация скорости жесткого диска.
Скорость может деградировать по разным причинам:

  • отказ диска в массиве: если это аппаратный RAID, то необходимо уточнить в /var/log/dmesg тип контроллера и установить соответствующее ПО для взаимодействия с ним, запросить через него состояние дисков;
  • несоответствие типа массива задаче: например, под систему оптимальнее использовать RAID10, нежели RAID6, т.к. у последнего медленная скорость записи;
  • диск медленный сам по себе, например энергосберегающие модели со скоростью 5400 RPM, скорость должна быть 7200 RPM.

Биллинг перегружен обработкой трафика (слишком часто отправляется аккаунтинг)

Диагностика

Создание абонента или проведение денежных средств занимает достаточно много времени - более минуты. В процессе диагностики проблемы следует изучить лог обработчика абонентов. Если в нем видно, что много времени уходит на обработку account_traf и количество постоянно большое (около 1000 или больше), можно попробовать изменить частоту отправки Accountg-Update чтобы снизить нагрузку на обработчик данных по трафику.

Посмотреть количество и скорость обработки объёмов трафика:

[root@billing ~]# egrep 'finished:daemons.account_traf' /app/asr_billing/var/log/worker.log | tail -n 3
2018-10-09 09:20:05,989 - worker - worker - INFO - Fork has finished:daemons.account_traf.0, Processed 945 in 89.275s.
2018-10-09 09:21:36,117 - worker - worker - INFO - Fork has finished:daemons.account_traf.0, Processed 969 in 89.218s.
2018-10-09 09:23:06,914 - worker - worker - INFO - Fork has finished:daemons.account_traf.0, Processed 978 in 90.484s.

Посмотреть сколько еще записей не обработаны:

[root@billing ~]# sqlexec /var/db/buff_traf.gdb "select count(*) from traffic where status=0 or status is null"

       COUNT
============
     4528613 

Решение

  1. Нужно снизить частоту отправки Acocunting-Update (в примере - два часа или более) на биллинг и убедиться что данные по трафику не дублируются, отправляясь одновременно в Netflow и Radius-Accounting.
  2. Увеличить таймаут Radius-сессий на биллинге, по истечении которого, если не поступал аккаунтинг, сессия считается оборвавшейся. Значение должно более чем в два раза превышать Acct-Interim-Interval.
  3. Сбросить все сессии на всех NAS (вероятно можно перезагрузить роутеры) чтобы они установились заново
  4. Либо дождаться пока обработается уже собранная информация по объемам трафика, либо взять БД трафика из скелета без этой информации (однако в таком случае не обработанная информация по объёмам трафика будет утеряна). Как взять базу из скелета описано в статье "Восстановление БД биллинга из резервной копии"

Ниже приведен скрипт, который выполнит первые два пункта

#!/bin/bash

#Значение Acct-Interim-Interval
attr_value=8600
#Время жизни сессии для биллинга, равное удвоенному Acct-Interim-Interval плюс 15 минут
const_value=$((900 + $attr_value * 2))

#Устанавливается таймаут accounting update
curl "http://169.254.80.82:8082/rest_api/v2/VpnConst/" -d 'method1=objects.get&arg1={"const_id":43}&method2=objects.set&arg2={"const_value":"'$const_value'"}&method3=save&arg3={}'

#Получает список NAS с ID RADIUS-атрибутов Acct-Interim-Interval если они есть, sed для фильтрации пустых строк вывода sqlexec
sqlexec "set heading off; select
    n.id,
    coalesce(nrp.id,'none')
from
    nas n
left join
    Nas_Radius_Params nrp on n.id=nrp.nas_id and lower(attribute)='acct-interim-interval'
where
    n.id>=1000
    and n.id in (select distinct nas_id from users where auth_type in (0,6) and nas_id>=1000)" | sed '/^$/d' |\

while read nas param; do

        echo 'nas='$nas 'param='$param
        #Отключение опции "Использовать radius вместо NetFlow" в настройках NAS
        curl "http://169.254.80.82:8082/rest_api/v2/Nas/" -d 'method1=objects.get&arg1={"id":'$nas'}&method2=objects.set&arg2={"radius_ins_netflow":0}&method3=save&arg3={}'

        #Если нет атрибута Acct-Interim-Interval, то он создаётся, если есть - устанавливается значение "частота 8600, при любом статусе баланса и блокировки"
        if [[ $param == 'none' ]]; then
            curl "http://169.254.80.82:8082/rest_api/v2/NasRadiusParams/" -d 'method1=objects.create&arg1={"attribute":"Acct-Interim-Interval","thevalue":"'$attr_value'","balance_status_id":0,"block_status_id":0,"op":":=","nas_id":"'$nas'","is_hotspot_attrib":0}'
        else
            curl "http://169.254.80.82:8082/rest_api/v2/NasRadiusParams/" -d 'method1=objects.get&arg1={"id":'$param'}&method2=objects.set&arg2={"thevalue":"'$attr_value'","balance_status_id":0,"block_status_id":0}&method3=save&arg3={}'
        fi

done

Атрибуты добавятся только на те NAS к которым привязаны учетные записи с типом авторизации "по vpn pppoe/pptp" и "любая через RADIUS", чтобы добавить на всех маршрутизаторах, уберите условие "and n.id in (select distinct nas_id from users where auth_type in (0,6) and nas_id>=1000)"

Биллинг перегружен обработкой трафика (слишком много "первых пакетов")

Если замедление так же связано с обработкой трафика, включите уровень логирования INFO, если в логе nf_collector много записей first_packet=0 и они часто повторяются по одним и тем же адресам, значит проблема в этом.

Абоненты долго обрабатываются

Ситуация

Вы создали нового абонента, Вас перевело в его карточку и над номером договора долго не пропадает сообщение что абонент в обработке:

Это говорит о том, что итерация Воркера длится слишком долго и он не справляется с работой. В первую очередь нужно убедиться, что скорость работы дисков достаточная (в первую очередь диск на котором находится БД), как это диагностировать подробно описано в статье "Проблемы с оборудованием", явным признаком проблемы скорости работы является долгое выполнение запросов, при том что тот или иной воркер не произвел ни какой работы:

2018-12-28 13:50:27,259 - worker - worker - INFO - Fork has finished:daemons.nas_stats.0, Processed 0 in 500.677s.

В приведенном примере воркер обновляющий статистику NAS (количество подключенных абонентов и т.д. на соответствующей вкладке настроек оборудования) не выполнил каких-либо операций, но работал в течение 500 секунд, что говорит о том что запросы к БД медленно выполняются.

Решение

Подключите для БД отдельный диск с высокой скоростью доступа.

Всё очень медленно работает, не проходят платежи, не управляется оборудование, не работают авторизации

Причина

Проверьте, что БД не слишком большого размера - если она превышает 10Гб, это уже достаточно много, система мониторинга создаст автоматическую заявку по этой проблеме ALARM Превышен лимит размера БД

В среднем, 10Гб достаточно чтобы хранить данные нескольких десятков тысяч абонентов без дополнительных оптимизаций или активной работы механизма партиционирования.

Если абонентов у Вам меньше 50 000, при этом база вышла за рамки 10Гб, нужно изучить, на что ушло место, очистить лишние данные и уменьшить размер БД. Ниже описано, как это сделать.

Решение

  1. Определите, какие таблицы БД занимают больше всего места:
    chroot /app/asr_billing/ gstat-fb /var/db/billing.gdb -data | \
    grep -E '^[A-Z]|Data pages:' | sed ':a;N;$!ba;s/\n  */ /g; s/,//g' | \
    awk '{print $5,"data pages;",$1,$2";",$9,"data page slots;",$12,"average fill"}' | \
    sort  -h | tail -n 3

    Скрипт покажет топ 3 таблиц, отсортированных по количеству "страниц". В большинстве случаев такая сортировка достаточно точно поможет определить, на что ушло место.

  2. Проанализируйте вывод, будет что-то вроде этого:
    39178 data pages; ARCH_ACCOUNT_STACK (146); 39178 data page slots; 87% average fill
    75789 data pages; RADIUS_SESSIONS (254); 75789 data page slots; 86% average fill
    949991 data pages; EVENTS_STACK (193); 949991 data page slots; 94% average fill

    По выводу видно что под таблицау EVENTS_STACK в базе отведенено существенно больше места, чем под все прочие.

  3. Дальнейшие шаги зависят от конкретных таблиц - суть в том, чтобы TOP3 были примерно одного порядка)
  4. Решив проблему переполнения таблиц, сделайте резервную копию и восстановление из неё - таким образом работает механизм "сборки мусора". Это описано в статье по системе мониторинга в тесте размера БД

EVENTS_STACK

В общих чертах описание возможных проблем переполнения стека команд для оборудования можно найти в статье по системе мониторинга.

Описание подсистемы отправки команд и пути отладки описаны в статье https://docs.carbonsoft.ru/display/CarbonBilling/nas_event_daemon

Проблема чаще всего возникает, если используется авторизация по RADIUS.

Наиболее частые причины:

  • Медленный диск, в результате чего при перезагрузке оборудования происходит массовая авторизация абонентов, но события не отправляются достаточно быстро, поэтому абоненты продолжают авторизоваться и стек продолжает пополняться
  • Проблемы оборудования: возможно, что-то не так с NAS-сервером, в результате чего постоянно отпадают RADIUS-сессии и абоненты переавторизуются, стек копится, например NAS-сервер слишком медленно отвечает биллингу
  • Ошибки в скрипте управления NAS: команды отправляются с ошибкой, а в скрипте событий описана обработка этих ошибок, но не слишком оптимально, это так же может замедлять отправку событий и приводить к "снежному кому" в стеке

Возможно Ваша причина тут не описана - здесь помогут хорошее понимание схемы взаимодействия биллинга с оборудованием, анализ логов и знание особенностей используемого оборудования.

ARCH_ACCOUNT_STACK

В таблице хранятся проводки, влияющие на баланс абонента. "Проводки" в терминах бухгалтерии.

Возможные причины и решения:

  1. У Вас включена опция сохранять движения всего трафика в настройках оператора связи, чтобы предоставлять подневную (или почасовую) детализацию объёмов трафика абонентам.
    Решить можно следующими способами:
  2. Возможно, это проводки за списания и тогда через конструктор отчётов постарайтесь понять структуру расхода: у каких абонентов больше всего проводок, по каким операциям и тд. Возможно, где-то в настройках услуг или ведении абонентов допущена ошибка.

RADIUS_SESSIONS

В таблице хранится история RADIUS-авторизаций. Если таблица слишком разрослась, настройте период хранения исторических данных в базе - уменьшите его. Если это не помогло - возможно, проблема так же где-то в авторизациях или оборудованиии и, вероятно, помимо таблицы с историей авторизаций, у Вас так же разрастётся EVENTS_STACK.

Введите метки, чтобы добавить к этой странице:
Please wait 
Ищите метку? просто начните печатать.