记录器 – SQL 性能分析器
Frappe 记录器是 Frappe 框架内置的一个性能分析工具,用于捕获所有请求和后台任务,以及执行的 SQL 查询和相应的堆栈跟踪。
使用示例:你发现某个 DocType 保存时耗时过长,怀疑 SQL 查询可能是瓶颈。在这种情况下,启动记录器然后提交你的文档,就能完整捕获保存文档时触发的所有查询。
- 以管理员身份登录。从 Awesomebar 打开记录器,点击“开始”。
- 系统会要求你配置记录选项。选择适当的选项并开始记录。
- 执行你想要分析的操作(最好在另一个标签页中进行)。
- 捕获到足够的信息后,再次进入记录器并停止记录。
现在你将看到所有已处理和记录的请求或任务的列表。你可以按各种列进行排序,以找出有问题的请求。
点击某一行可打开该请求以查看额外信息。捕获中包含以下信息:
- path – 请求的路径或任务名称,例如
/app - cmd – 方法的点分路径(后台任务为空)。
- time – 请求创建的时间。
- duration – 完成请求的耗时(参见下方的实现说明)。
- number of queries – 为完成该请求执行的 SQL 查询数量。
- Time in queries – SQL 查询所花费的时间。
- Request headers – 随请求收到的 HTTP 头(后台任务为空)。
- Form Dict – 随请求收到的表单数据(后台任务为空)。
- SQL queries – 所有已运行的 SQL 查询的表格。
要了解某个特定查询的更多信息,点击该行可展开额外信息。这包括查询的耗时、堆栈跟踪以及该查询的 SQL EXPLAIN 输出。
实现说明:记录器在捕获详细信息时会增加相当大的开销,因此总耗时并不代表真实环境下的性能。不过查询时间非常接近真实环境下的性能。
导入和导出 Frappe 记录器捕获数据
你可以导出记录器捕获数据,并将其导入到另一个站点以进行进一步分析。
- 进入记录器页面。记录完成后,点击菜单(三个点)> 导出。
- 这将下载一个包含捕获数据的 JSON 文件。要在另一个站点上查看,你可以点击导入并选择该 JSON 文件来查看捕获的数据。
使用记录器进行 Python 性能分析
除了捕获 SQL 查询外,记录器还可以运行内置的 Python 性能分析器“cProfile”,为你提供运行 Python 函数的性能分析输出。你可以在启动记录器时启用此选项。
如果你在记录器中启用 cProfiler,它会在记录期间增加更高的开销。请确保在调试完成后立即将其禁用。你也可以过滤请求/任务,以避免影响生产流量。
使用 bench 对函数进行性能分析
Bench 的 execute 命令会运行指向方法的点分路径,并且它也支持性能分析。
▶ bench --site [sitename] --profile execute erpnext.projects.doctype.task.task.set_tasks_as_overdue
现在你应该能够通过 execute 运行大多数可以通过控制台运行的命令,包括 db 方法。
▶ bench --site [sitename] execute frappe.db.get_database_size
6784
Frappe 监控器
监控器会记录请求和任务的元数据。要启用此功能,请在你的站点配置中设置 "monitor": 1。
收集到的数据会缓存在 redis 缓存中,并通过一个计划任务 frappe.monitor.flush 定期移动到 logs 目录下的 monitor.json.log 文件中。
{
"duration": 807142,
"request": {
"ip": "127.0.0.1",
"method": "GET",
"path": "/api/method/frappe.realtime.get_user_info",
"response_length": 9687,
"status_code": 500
},
"site": "frappe.local",
"timestamp": "2020-03-05 09:37:17.397884",
"transaction_type": "request",
"uuid": "83be6a4c-27a1-497a-9ce6-c815bca4e420"
}
{
"duration": 1364,
"job": {
"method": "frappe.ping",
"scheduled": false,
"wait": 90204
},
"site": "frappe.local",
"timestamp": "2020-03-05 09:37:40.124682",
"transaction_type": "job",
"uuid": "8225ab76-8bee-462c-b9fc-a556406b1ee7"
}
后台任务监控
Frappe 使用 RQ(Redis 队列)在后台异步执行长时间任务。你可以使用以下内置虚拟 doctype 来监控 RQ:
1. RQ Worker – 监控后台工作进程
RQ worker doctype 显示你站点上所有正在消费后台任务队列的后台工作进程。它还包含关于该工作进程的基本统计信息,如名称、时间、成功和失败的任务数量以及当前状态。
2. RQ Job – 监控和控制后台任务。
RQ Job 是一个虚拟 doctype,提供关于所有后台任务的信息。你可以按队列和状态过滤任务。
RQ 任务的表单视图显示该任务的所有信息。
调试卡住的进程
如果你认为某个工作进程卡住了,可以向它发送 SIGUSR1 信号,它会将其所有线程的当前堆栈打印到 stderr。
示例:kill -SIGUSR1 <pid></pid>
在典型的部署中,你可以在日志文件中找到写入 stderr 的输出:
- Web 工作进程 –
bench/logs/web.error.log - 后台工作进程 –
bench/logs/worker.error.log - 调度器 –
bench/logs/schedule.error.log
监控服务的整体健康状况
“系统健康报告”可用于快速检查系统健康状况。这包括但不限于:
- 后台任务
- 调度器
- 数据库
- 缓存
- 电子邮件
- 错误日志
- 存储
- 备份
- 用户
在 Awesomebar 中搜索“系统健康报告”即可查看此报告。