{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' - уровень логирования ошибок
worker['balance_change.fork.cnt']='1' - количество потоков balance_change
worker['abonents.perfork.cnt']='100' - количество абонентов обрабатываемых в каждом потоке службы worker
app['worker.multiprocessing.enabled']='0' - включает многопоточность, по-умолчанию эта опция выключена
app['worker.enabled']='1' - включение воркера
{code}
{warning}
Установка *app\['worker.enabled'\]* в значение "*0*" равносильна отключению биллинга
{warning}
h1. Многопоточность
В ядре реализована функция многопоточности, чтобы равномерно распределять нагрузку по ядрам процессора. Подпроцессы равноверно разпределяются по потокам CPU. Суммарно, все запущенные подпроцессы относятся в одной итерации, пока они не завершили работу новая итерация не начнётся. Таким образом, если запустить слишком много подпроцессов это может не ускорить, а замедлить работу. Скорость работы напрямую зависит от количества потоков процессора, его мощности, а так же количества ОЗУ. Подробнее узнать о конфигурации сервера можно в [статье|Системные требования].
По логу работы сервиса можно увидеть количество данных обработанных за итерацию данных и суммарное время итерации:
{code}
2018-07-02 13:10:46,424 - worker - worker - INFO - Fork has finished:daemons.abonent_block.0, Processed 0 in 1.017s.
2018-07-02 13:12:48,942 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:48,944 - worker - worker - INFO - Fork has finished:daemons.usluga_abon_pay.0, Processed 11 in 123.516s.
2018-07-02 13:12:48,946 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:48,947 - worker - worker - INFO - Fork has finished:daemons.tarif_change.0, Processed 0 in 0.653s.
2018-07-02 13:12:48,948 - worker - worker - INFO - Fork exitcode: 0
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
2018-07-02 13:12:48,953 - worker - worker - INFO - Fork has finished:daemons.balance_change.1, Processed 808 in 118.971s.
2018-07-02 13:12:48,954 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,580 - worker - worker - INFO - Fork has finished:daemons.status_daemon.0, Processed 0 in 0.084s.
2018-07-02 13:12:58,580 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,581 - worker - worker - INFO - Fork has finished:daemons.send_commands.0, Processed 21 in 45.260s.
2018-07-02 13:12:58,581 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,582 - worker - worker - INFO - Fork has finished:daemons.pay_cards.0, Processed 0 in 0.678s.
2018-07-02 13:12:58,582 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,583 - worker - worker - INFO - Fork has finished:daemons.events.0, Processed 106 in 9.668s.
2018-07-02 13:12:58,583 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,584 - worker - worker - INFO - Fork has finished:daemons.csv_loading.0, Processed 0 in 0.009s.
2018-07-02 13:12:58,585 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,585 - worker - worker - INFO - Fork has finished:daemons.account_traf.0, Processed 501 in 33.081s.
2018-07-02 13:12:58,586 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,586 - worker - worker - INFO - Fork has finished:daemons.account_voip.0, Processed 0 in 0.166s.
2018-07-02 13:12:58,587 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,587 - worker - worker - INFO - Fork has finished:daemons.nas_stats.0, Processed 3 in 9.903s.
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
...
2018-07-02 13:13:00,383 - worker - worker - INFO - Processed in one iteration 7265 in 135.563s.
{code}
Один из подпроцессов balance_change обработал 717 операций за 112 секунд, ошибок в работе не произошло. Суммарное время итерации чуть менее 136 секунд. Всего обработано 7265 записей.
Описиние процессов:
* *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
h2. Включение и настройка
h3. Включение многопоточности
Для включения многопоточного режима, установите опцию 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. Описание параметров многопоточности
Параметры для регулирования работы службы воркер:
* *abonents.perfork.cnt* - задаёт количество обрабатываемых абонентов для всех потоков службы воркер.
{code}
worker['abonents.perfork.cnt']='100'
{code}
* *abonents.perfork.<имя процесса>* - задаёт количество обрабатываемых абонентов для потоков конкретного процесса. Например для процесса *balance_change*:
{code}
worker['abonents.perfork.balance_change']='150'
{code}
* *<имя процесса>.fork.cnt* - количество потоков обработки внутри конкретного процесса. Например для процесса *balance_change*:
{code}
worker['balance_change.fork.cnt']='5'
{code}
h3. Простая настройка многопоточности
Обычно для ускорения работы ядра биллинг достаточно включить мнгопоточность и добавить несколько потоков обработки баланса. При этом количесво абонентов обрабатываемых за каждую итерацию можно оставить стандартным. Увеличим количество потоков процесса обработки балансов *balance_change*. В конфигурационном файле *asr_billing* установим параметры для balance_change:
{code}
worker['balance_change.fork.cnt']='5'
{code}
Используя различные значения переменной для отладки скорости работы службы воркер.
{code:title=Пример лога}
2018-06-27 19:37:29,522 - worker - worker - INFO - Fork has finished:daemons.balance_change.0, Processed 0 in 0.159s.
2018-06-27 19:37:29,523 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,523 - worker - worker - INFO - Fork has finished:daemons.balance_change.1, Processed 0 in 0.208s.
2018-06-27 19:37:29,524 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,524 - worker - worker - INFO - Fork has finished:daemons.balance_change.2, Processed 0 in 0.316s.
2018-06-27 19:37:29,525 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,525 - worker - worker - INFO - Fork has finished:daemons.balance_change.3, Processed 0 in 0.258s.
2018-06-27 19:37:29,526 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,526 - worker - worker - INFO - Fork has finished:daemons.balance_change.4, Processed 0 in 0.372s.
{code}
h3. Тонкая настройка многопоточности
Для систем с высокой нагрузкой потребуется тонкая настройка многопоточности. Общие рекомендации по настройке:
* Одна итерация не должна превышать 180 секунд, если больше - уменьшите количество абонентов в потоке;
* При массовых [списаниях|Методы списания] (раз в месяц при типе списания "Ежемесячно" и каждый день при "Ежедневно равными долями в день" или "Ежедневно"), каждый процесс balance_change должен обработать не менее 1000 записей, при этом уложиться в 180 секунд;
* Общее количество потоков службы воркер не должно превышать количество потоков процессора, иначе это может замедлить работу всю системы;
* Мы рекомендуем оставлять запас ядер процессора для выполнения других задач на биллинга;
* На слабых платформах лучше не изменять настройки, а оставить стандартные: 110 абонентов в 1 потоке;
* В системе есть ограничение в *5000* записей на поток вне зависимости от настроек.
h3. Описиние параметров каждого процесса и особенности настройки:
h5. abonent_block
{code}
abonent_block.fork.cnt
abonents.perfork.abonent_block
{code}
h5. usluga_abon_pay списание абонентской платы и обработка статусов услуг
{code}
usluga_abon_pay.fork.cnt
abonents.perfork.usluga_abon_pay
{code}
h5. tarif_change
{code}
tarif_change.fork.cnt
abonents.perfork.tarif_change
{code}
h5. balance_change
{code}
balance_change.fork.cnt
abonents.perfork.balance_change
{code}
h5. status_daemon
h5. send_commands
{code}
send_commands.fork.cnt
abonents.perfork.send_commands
{code}
h5. account_traf
{code}
account_traf.fork.cnt
abonents.perfork.account_traf
{code}
h5. account_voip
{code}
account_voip.fork.cnt
abonents.perfork.account_voip
{code}
h5. events
{code}
events.fork.cnt
abonents.perfork.events
{code}
h5. pay_cards
h5. csv_loading
h5. nas_stats
h1. Отладка
При возникновении каких-либо проблем в работе сервиса, можно выключить повышенное логирование в следующей переменной:
{code}app['worker.loglevel']='warning'{code}
* *ERROR* \- логирование только ошибок
* *WARNING* \- логирование ошибок и предупреждений, которые в общем случае не влияют на скорость работы и не вызывают существенных проблем
* *INFO* \- полный лог работы процесса, включая логирование всех запросов к БД и их результаты
При изменении уровня логирования, требуется перезапустить процесс:
{code} chroot /app/asr_billing/ service worker restart{code}
{note}Рекомендуется после завершения отладки вернуть уровень логирования в "ERROR", так как "INFO" может очень быстро заполнить дисковое пространство. Если Вы забудете вернуть базовый уровень логирования, он изменится автоматический через пять дней.{note}
h1. Описание ядра биллинговой системы
Обработчик абонентов *worker* является одной из основных систем Carbon Billing 5 - именно он выполняет все финансовые расчеты, регистрирует состояния абонентов и добавляет данные которые в последствии обрабатывают другие системы, такие как отправка оповещений, события для отправки на оборудование.
Фактический эта служба - ядро биллинга.
В конфигурационном файле */app/asr_billing/cfg/config* за настройку ядра отвечают следующие переменные:
{code}
app['worker.logfile']='/var/log/worker.log' - расположение лог-файла работы процесса
app['worker.loglevel']='warning' - уровень логирования ошибок
worker['balance_change.fork.cnt']='1' - количество потоков balance_change
worker['abonents.perfork.cnt']='100' - количество абонентов обрабатываемых в каждом потоке службы worker
app['worker.multiprocessing.enabled']='0' - включает многопоточность, по-умолчанию эта опция выключена
app['worker.enabled']='1' - включение воркера
{code}
{warning}
Установка *app\['worker.enabled'\]* в значение "*0*" равносильна отключению биллинга
{warning}
h1. Многопоточность
В ядре реализована функция многопоточности, чтобы равномерно распределять нагрузку по ядрам процессора. Подпроцессы равноверно разпределяются по потокам CPU. Суммарно, все запущенные подпроцессы относятся в одной итерации, пока они не завершили работу новая итерация не начнётся. Таким образом, если запустить слишком много подпроцессов это может не ускорить, а замедлить работу. Скорость работы напрямую зависит от количества потоков процессора, его мощности, а так же количества ОЗУ. Подробнее узнать о конфигурации сервера можно в [статье|Системные требования].
По логу работы сервиса можно увидеть количество данных обработанных за итерацию данных и суммарное время итерации:
{code}
2018-07-02 13:10:46,424 - worker - worker - INFO - Fork has finished:daemons.abonent_block.0, Processed 0 in 1.017s.
2018-07-02 13:12:48,942 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:48,944 - worker - worker - INFO - Fork has finished:daemons.usluga_abon_pay.0, Processed 11 in 123.516s.
2018-07-02 13:12:48,946 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:48,947 - worker - worker - INFO - Fork has finished:daemons.tarif_change.0, Processed 0 in 0.653s.
2018-07-02 13:12:48,948 - worker - worker - INFO - Fork exitcode: 0
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
2018-07-02 13:12:48,953 - worker - worker - INFO - Fork has finished:daemons.balance_change.1, Processed 808 in 118.971s.
2018-07-02 13:12:48,954 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,580 - worker - worker - INFO - Fork has finished:daemons.status_daemon.0, Processed 0 in 0.084s.
2018-07-02 13:12:58,580 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,581 - worker - worker - INFO - Fork has finished:daemons.send_commands.0, Processed 21 in 45.260s.
2018-07-02 13:12:58,581 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,582 - worker - worker - INFO - Fork has finished:daemons.pay_cards.0, Processed 0 in 0.678s.
2018-07-02 13:12:58,582 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,583 - worker - worker - INFO - Fork has finished:daemons.events.0, Processed 106 in 9.668s.
2018-07-02 13:12:58,583 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,584 - worker - worker - INFO - Fork has finished:daemons.csv_loading.0, Processed 0 in 0.009s.
2018-07-02 13:12:58,585 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,585 - worker - worker - INFO - Fork has finished:daemons.account_traf.0, Processed 501 in 33.081s.
2018-07-02 13:12:58,586 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,586 - worker - worker - INFO - Fork has finished:daemons.account_voip.0, Processed 0 in 0.166s.
2018-07-02 13:12:58,587 - worker - worker - INFO - Fork exitcode: 0
2018-07-02 13:12:58,587 - worker - worker - INFO - Fork has finished:daemons.nas_stats.0, Processed 3 in 9.903s.
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
...
2018-07-02 13:13:00,383 - worker - worker - INFO - Processed in one iteration 7265 in 135.563s.
{code}
Один из подпроцессов balance_change обработал 717 операций за 112 секунд, ошибок в работе не произошло. Суммарное время итерации чуть менее 136 секунд. Всего обработано 7265 записей.
Описиние процессов:
* *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
h2. Включение и настройка
h3. Включение многопоточности
Для включения многопоточного режима, установите опцию 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. Описание параметров многопоточности
Параметры для регулирования работы службы воркер:
* *abonents.perfork.cnt* - задаёт количество обрабатываемых абонентов для всех потоков службы воркер.
{code}
worker['abonents.perfork.cnt']='100'
{code}
* *abonents.perfork.<имя процесса>* - задаёт количество обрабатываемых абонентов для потоков конкретного процесса. Например для процесса *balance_change*:
{code}
worker['abonents.perfork.balance_change']='150'
{code}
* *<имя процесса>.fork.cnt* - количество потоков обработки внутри конкретного процесса. Например для процесса *balance_change*:
{code}
worker['balance_change.fork.cnt']='5'
{code}
h3. Простая настройка многопоточности
Обычно для ускорения работы ядра биллинг достаточно включить мнгопоточность и добавить несколько потоков обработки баланса. При этом количесво абонентов обрабатываемых за каждую итерацию можно оставить стандартным. Увеличим количество потоков процесса обработки балансов *balance_change*. В конфигурационном файле *asr_billing* установим параметры для balance_change:
{code}
worker['balance_change.fork.cnt']='5'
{code}
Используя различные значения переменной для отладки скорости работы службы воркер.
{code:title=Пример лога}
2018-06-27 19:37:29,522 - worker - worker - INFO - Fork has finished:daemons.balance_change.0, Processed 0 in 0.159s.
2018-06-27 19:37:29,523 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,523 - worker - worker - INFO - Fork has finished:daemons.balance_change.1, Processed 0 in 0.208s.
2018-06-27 19:37:29,524 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,524 - worker - worker - INFO - Fork has finished:daemons.balance_change.2, Processed 0 in 0.316s.
2018-06-27 19:37:29,525 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,525 - worker - worker - INFO - Fork has finished:daemons.balance_change.3, Processed 0 in 0.258s.
2018-06-27 19:37:29,526 - worker - worker - INFO - Fork exitcode: 0
2018-06-27 19:37:29,526 - worker - worker - INFO - Fork has finished:daemons.balance_change.4, Processed 0 in 0.372s.
{code}
h3. Тонкая настройка многопоточности
Для систем с высокой нагрузкой потребуется тонкая настройка многопоточности. Общие рекомендации по настройке:
* Одна итерация не должна превышать 180 секунд, если больше - уменьшите количество абонентов в потоке;
* При массовых [списаниях|Методы списания] (раз в месяц при типе списания "Ежемесячно" и каждый день при "Ежедневно равными долями в день" или "Ежедневно"), каждый процесс balance_change должен обработать не менее 1000 записей, при этом уложиться в 180 секунд;
* Общее количество потоков службы воркер не должно превышать количество потоков процессора, иначе это может замедлить работу всю системы;
* Мы рекомендуем оставлять запас ядер процессора для выполнения других задач на биллинга;
* На слабых платформах лучше не изменять настройки, а оставить стандартные: 110 абонентов в 1 потоке;
* В системе есть ограничение в *5000* записей на поток вне зависимости от настроек.
h3. Описиние параметров каждого процесса и особенности настройки:
h5. abonent_block
{code}
abonent_block.fork.cnt
abonents.perfork.abonent_block
{code}
h5. usluga_abon_pay списание абонентской платы и обработка статусов услуг
{code}
usluga_abon_pay.fork.cnt
abonents.perfork.usluga_abon_pay
{code}
h5. tarif_change
{code}
tarif_change.fork.cnt
abonents.perfork.tarif_change
{code}
h5. balance_change
{code}
balance_change.fork.cnt
abonents.perfork.balance_change
{code}
h5. status_daemon
h5. send_commands
{code}
send_commands.fork.cnt
abonents.perfork.send_commands
{code}
h5. account_traf
{code}
account_traf.fork.cnt
abonents.perfork.account_traf
{code}
h5. account_voip
{code}
account_voip.fork.cnt
abonents.perfork.account_voip
{code}
h5. events
{code}
events.fork.cnt
abonents.perfork.events
{code}
h5. pay_cards
h5. csv_loading
h5. nas_stats
h1. Отладка
При возникновении каких-либо проблем в работе сервиса, можно выключить повышенное логирование в следующей переменной:
{code}app['worker.loglevel']='warning'{code}
* *ERROR* \- логирование только ошибок
* *WARNING* \- логирование ошибок и предупреждений, которые в общем случае не влияют на скорость работы и не вызывают существенных проблем
* *INFO* \- полный лог работы процесса, включая логирование всех запросов к БД и их результаты
При изменении уровня логирования, требуется перезапустить процесс:
{code} chroot /app/asr_billing/ service worker restart{code}
{note}Рекомендуется после завершения отладки вернуть уровень логирования в "ERROR", так как "INFO" может очень быстро заполнить дисковое пространство. Если Вы забудете вернуть базовый уровень логирования, он изменится автоматический через пять дней.{note}