... Обработчик абонентов *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.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
|
{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 12:07:22,786 - worker - worker - INFO - Fork daemons.tarif_change.0:9482 2018-07-02 12:07:22,790 - worker - worker - INFO - Fork daemons.balance_change.0:9483 2018-07-02 12:07:22,795 - worker - worker - INFO - Fork daemons.balance_change.1:9485 2018-07-02 12:07:22,823 - worker - worker - INFO - Fork daemons.status_daemon.0:9499 2018-07-02 12:07:22,827 - worker - worker - INFO - Fork daemons.send_commands.0:9503 2018-07-02 12:07:22,832 - worker - worker - INFO - Fork daemons.pay_cards.0:9509 2018-07-02 12:07:22,836 - worker - worker - INFO - Fork daemons.events.0:9517 2018-07-02 12:07:22,841 - worker - worker - INFO - Fork daemons.csv_loading.0:9521 2018-07-02 12:07:22,846 - worker - worker - INFO - Fork daemons.account_traf.0:9526 2018-07-02 12:07:22,850 - worker - worker - INFO - Fork daemons.account_voip.0:9529 2018-07-02 12:07:22,854 - worker - worker - INFO - Fork daemons.nas_stats.0:9532 {code} Подпроцессы равноверно разпределяются по потокам 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 секунд.
|
Количество потоков и обрабатываемых в каждом потоке данных описано в логике биллинга. Тем не менее, для *balance_change* оставлена возможность настройки.
|
|
h2. Настройка многопоточности *balance_change*
|
|
В конфигурационном файле *asr_billing* за balance_change отвечают следующие настройки:
|
{code}worker['abonents.perfork.cnt']='25' - N количество абонентов обрабатываемых каждым воркером за итерацию
|
worker['balance_change.fork.cnt']='5' - демоны количество подпроцессов обработки баланса{code}
|
Используя различные комбинации этих переменных можно отладить скорость работы воркера.
|
Пример лога: {code}
|
... 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} Рекомендации по настройке:
|
* Желательно чтобы общее количество подпроцессов balance_change и прочих не превышало количество потоков процессора, иначе balance_change может замедлить всю работу воркера * Одна итерация не должна превышать 180 секунд, если больше - уменьшите количество потоков/абонентов balance_change.
|
* На слабых платформах лучше не изменять настройки, а оставить стандартные: 215 абонентов в 1 потоке
|
h1. Отладка.
|
|
При возникновении каких-либо проблем в работе сервиса, можно выключить повышенное логирование в следующей переменной: {code}app['worker.loglevel']='warning'{code}
|
* *ERROR* - \- логирование только ошибок
|
* *WARNING* - \- логирование ошибок и предупреждений, которые в общем случае не влияют на скорость работы и не вызывают существенных проблем
|
* *INFO* - \- полный лог работы процесса, включая логирование всех запросов к БД и их результаты
|
При изменении уровня логирования, требуется перезапустить процесс:
|
... {code} chroot /app/asr_billing/ service worker restart{code} {warning}"INFO" может очень быстро заполнить дисковое пространство{warning}
|