Профілювання коду Odoo

Попередження

Для цього посібника потрібно встановити Odoo і написати код Odoo

Побудова методу на графіку

Odoo вбудовує профайлер коду. Цей вихід вбудованого профайлера можна використовувати для створення графіка викликів, ініційованих методом, кількості запитів, відсотка часу, витраченого на сам метод, а також часу, який знадобився метод і його підвикликові методи.

from odoo.tools.misc import profile
[...]
@profile('/temp/prof.profile')
def mymethod(...)

Це створює файл під назвою /temp/prof.profile

Інструмент під назвою gprof2dot створить графік із таким результатом:

gprof2dot -f pstats -o /temp/prof.xdot /temp/prof.profile

Інструмент під назвою xdot відобразить отриманий графік:

xdot /temp/prof.xdot

Зареєструйте метод

Інший профайлер можна використовувати для реєстрації статистики методу:

from odoo.tools.profiler import profile
[...]
@profile
@api.model
def mymethod(...):

Статистика буде відображена в журналах, коли метод, який потрібно проаналізувати, буде повністю перевірено.

2018-03-28 06:18:23,196 22878 INFO openerp odoo.tools.profiler:
calls     queries   ms
project.task ------------------------ /home/odoo/src/odoo/addons/project/models/project.py, 638

1         0         0.02          @profile
                                  @api.model
                                  def create(self, vals):
                                      # context: no_log, because subtype already handle this
1         0         0.01              context = dict(self.env.context, mail_create_nolog=True)

                                      # for default stage
1         0         0.01              if vals.get('project_id') and not context.get('default_project_id'):
                                          context['default_project_id'] = vals.get('project_id')
                                      # user_id change: update date_assign
1         0         0.01              if vals.get('user_id'):
                                          vals['date_assign'] = fields.Datetime.now()
                                      # Stage change: Update date_end if folded stage
1         0         0.0               if vals.get('stage_id'):
                                          vals.update(self.update_date_end(vals['stage_id']))
1         108       631.8             task = super(Task, self.with_context(context)).create(vals)
1         0         0.01              return task

Total:
1         108       631.85

Дамп стека

Надсилання сигналу SIGQUIT до процесу Odoo (доступно лише на POSIX) змушує цей процес виводити поточну трасу стека до журналу з рівнем інформації. Коли здається, що процес odoo застряг, надсилання цього сигналу процесу дозволяє дізнатися, що процес робить, і дозволяє процесу продовжувати свою роботу.

Виконання коду трасування

Замість того, щоб надсилати сигнал SIGQUIT до процесу Odoo досить часто, щоб перевірити, де процеси працюють гірше, ніж очікувалося, ми можемо використовувати інструмент py-spy, щоб зробити це за нас.

Встановити py-spy

python3 -m pip install py-spy

Запис виконаного коду

Оскільки py-spy встановлено, тепер ми записуємо виконані рядки коду. Цей інструмент записуватиме трасування стека процесу кілька разів на секунду.

# record to raw file
py-spy record -o profile.json -f speedscope --pid <PID>

# OR record directly to svg
py-spy record -o profile.svg --pid <PID>

де <PID> - це ідентифікатор процесу odoo, який ви хочете побудувати на графіку.

Щоб відкрити profile.json, ви можете скористатися онлайн-інструментом speedscope.app.

Щоб відкрити profile.svg, вам слід скористатися браузером, оскільки інші засоби перегляду можуть не підтримувати інтерактивну частину.

../../_images/flamegraph.svg