Профілювання коду 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, вам слід скористатися браузером, оскільки інші засоби перегляду можуть не підтримувати інтерактивну частину.