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

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

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

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

h1. Многопоточность

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

{code}
{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
{code}

Подпроцессы равноверно разпределяются по потокам CPU. Суммарно, все запущенные подпроцессы относятся в одной итерации, пока они не завершили работу новая итерация не начнётся. Таким образом, если запустить слишком много подпроцессов это может не ускорить, а замедлить работу. Скорость работы напрямую зависит от количества потоков процессора, его мощности, а так же количества ОЗУ. Подробнее узнать о конфигурации сервера можно в [статье|Системные требования].
Таким образом, если запустить слишком много подпроцессов это может не ускорить, а замедлить работу - скорость работы напрямую зависит от количества потоков процессора, его мощности, а так же количества ОЗУ.
По логу работы сервиса можно увидеть количество данных обработанных за итерацию данных и суммарное время итерации:
{code}
{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: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}
{code}
Из приведенно лога видно сколько времени ушло у каждого процесса на обработку данных, в последней строке общее время итерации. "exitcode" содержит код завершения работы процесса, если он отличен от "0" *0* - значит, при выполнении проищошла какая-либо ошибка, что так же пишется в лог. Например:
{code}
{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 секунд, ошибок в работе не произошло.
{code}
Один из подпроцессов balance_change обработал 717 операций за 112 секунд, ошибок в работе не произошло.
Суммарное время итерации чуть менее 136 секунд.

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

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

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

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

Рассмотрим настройку многопоточности на примере *balance_change*. В конфигурационном файле *asr_billing* за balance_change отвечают следующие настройки:
{code}
{code}worker['abonents.perfork.cnt']='110' - количество абонентов обрабатываемых каждым воркером за итерацию
worker['balance_change.fork.cnt']='5' - количество подпроцессов обработки баланса{code}
{code}
Используя различные комбинации этих переменных можно отладить скорость работы воркера.
Пример лога:
{code}
Общие рекомендации по настройке:
* abonents.perfork.cnt не должен превышать 1500 (ограничение СУБД)
* Одна итерация не должна превышать 180 секунд, если больше - уменьшите количество потоков/абонентов balance_change.
* При массовых списаниях (раз в месяц при типе списания "Ежемесячно" и каждый день при "Ежедневно равными долями в день" или "Ежедневно"), каждый процесс balance_change должен обработать не менее 1000 записей, при этом уложиться в 180 секунд