Worker (ядро биллинга)

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (27)

просмотр истории страницы
{toc:maxLevel=2}

h1. Описание ядра биллинговой системы

Обработчик абонентов *worker* является одной из основных систем Carbon Billing 5 - именно он выполняет все финансовые расчеты, регистрирует состояния абонентов и добавляет данные которые в последствии обрабатывают другие системы, такие как отправка оповещений, события для отправки на оборудование.
Фактический эта служба - ядро биллинга.

В конфигурационном файле */app/asr_billing/cfg/config* за настройку воркера ядра отвечают следующие переменные:
{code}
app['worker.logfile']='/var/log/worker.log' - расположение лог-файла работы процесса
app['worker.loglevel']='warning' - уровень логирования ошибок
app['worker.s_profile.enabled']='0'
worker['balance_change.fork.cnt']='1' - количество потоков balance_change
worker['abonents.perfork.cnt']='15' - количество абонентов обрабатываемых в каждом потоке balance_change
app['worker.multiprocessing.enabled']='0' - включает многопоточность, по-умолчанию эта опция выключена
app['worker.enabled']='1' - включение воркера{code}
{warning}Установка *app\['worker.enabled'\]* в значение "*0*" равносильна отключению биллинга{warning}

h1. Многопоточность.
В обработчике абонентов реализована многопоточность с целью максимальной утилизации доступных ресурсов процессора и памяти: worker запускает несколько подпроцессов, каждый из которых обрабатывает определенное количество данных того или иного типа:
* *abonent_block* - обрабатывает блокировки абонентов
* *usluga_abon_pay* - TODO
* *tarif_change* - переключает тарифы
* *balance_change* - обновляет состояния балансов
* *status_daemon* - TODO
* *send_commands* -TODO
* *pay_cards* - обрабатывает пополнение баланса через карты оплаты
* *events* - добавляет в стек команды для отправки на оборудование
* *csv_loading* - обрабатывает загрузку платежей из csv
* *account_traf* - регистрирует информацию по объёмам интернет-трафика
* *account_voip* - обрабатывает зарегистрированный VoIP трафик
* *nas_stats* -TODO

В ядре реализована функция многопоточности чтобы равномерно распределять нагрузку по ядрам процессора:
* *abonent_block* \- обрабатывает блокировки абонентов
* *usluga_abon_pay* \- списание абонентской платы и обработка статусов услуг
* *tarif_change* \- переключает тарифы
* *balance_change* \- обновляет состояния балансов
* *status_daemon* \- статусы абонентов
* *send_commands* \- обработка кеша: кеш абонентов, обработка флага modified в БД абонентов (что может говорить Воркеру о необходимости отправки команд на оборудование) , [сброс RADIUS-сессий по таймауту|CarbonBilling:Глобальные настройки биллинга и оператора]
* *pay_cards* \- обрабатывает пополнение баланса через карты оплаты
* *events* \- добавляет в стек команды для отправки на оборудование
* *csv_loading* \- обрабатывает загрузку платежей из csv
* *account_traf* \- регистрирует информацию по объёмам интернет-трафика
* *account_voip* \- обрабатывает зарегистрированный VoIP трафик
* *nas_stats* \- статистика NAS

{code}2018-07-02 12:07:22,778 - worker - worker - INFO - Fork daemons.abonent_block.0:9477
2018-07-02 12:07:22,782 - worker - worker - INFO - Fork daemons.usluga_abon_pay.0:9479
2018-07-02 13:12:58,591 - worker - worker - INFO - Recalculating customers tree: 1970-01-01 03:00:00
2018-07-02 13:13:00,383 - worker - worker - INFO - Processed in one iteration 7265 in 135.563s.{code}
Из приведенно лога видно сколько времени ушло у каждого процесса на обработку данных, в последней строке общее время итерации. "exitcode" содержит код завершения работы процесса, если он отличен от "0" - значит, при выполнении проищошла какая-либо ошибка, что так же пишется в лог. Например:
{code}2018-07-02 13:12:48,950 - worker - worker - INFO - Fork has finished:daemons.balance_change.0, Processed 717 in 111.879s.
2018-07-02 13:12:48,951 - worker - worker - INFO - Fork exitcode: 0

Количество потоков и обрабатываемых в каждом потоке данных описано в логике биллинга. Тем не менее, для *balance_change* оставлена возможность настройки.
h2. Настройка многопоточности *balance_change*

h2. Включение и настройка

Для включения многопоточного режима, установите опцию worker.multiprocessing.enabled в единицу и перезапустите ядро:
{code:title=Опция в /app/asr_billng/cfg/config}app['worker.multiprocessing.enabled']='1'{code}
{code:title=Перезапуск ядра}
chroot /app/asr_billing service worker restart{code}

h3. Настройка многопоточности balance_change

В конфигурационном файле *asr_billing* за balance_change отвечают следующие настройки:
{code}worker['abonents.perfork.cnt']='25' {code}worker['abonents.perfork.cnt']='110' - N количество абонентов обрабатываемых каждым воркером за итерацию
worker['balance_change.fork.cnt']='5' - демоны количество подпроцессов обработки баланса{code}
Используя различные комбинации этих переменных можно отладить скорость работы воркера.
Пример лога:
{code}
2018-06-27 19:37:29,526 - worker - worker - INFO - Fork has finished:daemons.balance_change.4, Processed 0 in 0.372s.
{code}
Рекомендации по настройке:
* Желательно чтобы общее количество подпроцессов balance_change и прочих не превышало количество потоков процессора, иначе balance_change может замедлить всю работу воркера
Общие рекомендации по настройке:
* abonents.perfork.cnt не должен превышать 1500 (ограничение СУБД)
* Одна итерация не должна превышать 180 секунд, если больше - уменьшите количество потоков/абонентов balance_change.
* При массовых списаниях (раз в месяц при типе списания "Ежемесячно" и каждый день при "Ежедневно равными долями в день" или "Ежедневно"), каждый процесс balance_change должен обработать не менее 1000 записей, при этом уложиться в 180 секунд
* Общее количество подпроцессов balance_change и прочих не должно превышать количество потоков процессора, иначе balance_change может замедлить всю работу системы
* На слабых платформах лучше не изменять настройки, а оставить стандартные: 25 110 абонентов в 1 потоке

h3. Настройка многопоточности account_voip

Параллельную обработку трафика телефонии можно включить, настроив *account_voip.fork.cnt*:
{code}
worker['account_voip.fork.cnt']='16'
{code}
Заметки и рекомендации по настройке:
* Параметр может отсутствовать в конфигурационном файле по-умолчанию. Если он требуется - добавьте вручную.
* Количество потоков не должно превышать количество доступных потоков процессора. Например, если у Вас два шестиядерных процессора с технологией hyperthreading, то account_voip.fork.cnt должен быть не более 24 (2 * 6 * 2).
* На слабых платформах лучше не изменять настройки и оставить один поток

В каждом потоке {{account_voip}} обрабатывает звонки для 1000 разных абонентов. На текущий момент, это значение не настраивается и прописано в коде ядра.

Пример лога:
{code}
2021-10-11 14:07:19,799 - worker - worker - INFO - Fork has finished:daemons.account_voip.1, Processed 963 in 16.700s.
2021-10-11 14:07:19,811 - worker - worker - INFO - Fork has finished:daemons.account_voip.10, Processed 6 in 14.522s.
2021-10-11 14:07:19,815 - worker - worker - INFO - Fork has finished:daemons.account_voip.13, Processed 316 in 14.921s.
2021-10-11 14:07:19,816 - worker - worker - INFO - Fork has finished:daemons.account_voip.14, Processed 58 in 14.599s.
2021-10-11 14:07:19,817 - worker - worker - INFO - Fork has finished:daemons.account_voip.15, Processed 4579 in 23.562s.
{code}

h3. Настройка многопоточности events
Настроить многопоточность службы обработки событий оборудования можно параметром:
{code}
worker['events.fork.cnt']='8'
{code}
h3. Настройка многопоточности send_commands
Настроить многопоточность службы отправки коммманд на оборудование можно параметром:
{code}
worker['send_commands.fork.cnt']='8'
{code}
h3. Настройка многопоточности usluga_abon_pay
Настроить многопоточность службы списанием за услуги можно параметром:
{code}
worker['usluga_abon_pay.fork.cnt']='8'
{code}
h3. Настройка многопоточности account_traf
{code}
worker['account_traf.fork.cnt']='8'
{code}

h1. Отладка.

При возникновении каких-либо проблем в работе сервиса, можно выключить повышенное логирование в следующей переменной:
{code}app['worker.loglevel']='warning'{code}
* *ERROR* - \- логирование только ошибок
* *WARNING* - \- логирование ошибок и предупреждений, которые в общем случае не влияют на скорость работы и не вызывают существенных проблем
* *INFO* - \- полный лог работы процесса, включая логирование всех запросов к БД и их результаты

При изменении уровня логирования, требуется перезапустить процесс:
{code} chroot /app/asr_billing/ service worker restart{code}
{warning}"INFO" может очень быстро заполнить дисковое пространство{warning}
{note}Рекомендуется после завершения отладки вернуть уровень логирования в "ERROR", так как "INFO" может очень быстро заполнить дисковое пространство. Если Вы забудете вернуть базовый уровень логирования, он изменится автоматический через пять дней.{note}