性能分析与监控

记录器 – SQL 性能分析器

Frappe 记录器是 Frappe 框架内置的一个性能分析工具,用于捕获所有请求和后台任务,以及执行的 SQL 查询和相应的堆栈跟踪。

使用示例:你发现某个 DocType 保存时耗时过长,怀疑 SQL 查询可能是瓶颈。在这种情况下,启动记录器然后提交你的文档,就能完整捕获保存文档时触发的所有查询。

  1. 以管理员身份登录。从 Awesomebar 打开记录器,点击“开始”。
  2. 系统会要求你配置记录选项。选择适当的选项并开始记录。
  3. 执行你想要分析的操​​作(最好在另一个标签页中进行)。
  4. 捕获到足够的信息后,再次进入记录器并停止记录。

现在你将看到所有已处理和记录的请求或任务的列表。你可以按各种列进行排序,以找出有问题的请求。

点击某一行可打开该请求以查看额外信息。捕获中包含以下信息:

  1. path – 请求的路径或任务名称,例如 /app
  2. cmd – 方法的点分路径(后台任务为空)。
  3. time – 请求创建的时间。
  4. duration – 完成请求的耗时(参见下方的实现说明)。
  5. number of queries – 为完成该请求执行的 SQL 查询数量。
  6. Time in queries – SQL 查询所花费的时间。
  7. Request headers – 随请求收到的 HTTP 头(后台任务为空)。
  8. Form Dict – 随请求收到的表单数据(后台任务为空)。
  9. SQL queries – 所有已运行的 SQL 查询的表格。

要了解某个特定查询的更多信息,点击该行可展开额外信息。这包括查询的耗时、堆栈跟踪以及该查询的 SQL EXPLAIN 输出。

实现说明:记录器在捕获详细信息时会增加相当大的开销,因此总耗时并不代表真实环境下的性能。不过查询时间非常接近真实环境下的性能。

导入和导出 Frappe 记录器捕获数据

你可以导出记录器捕获数据,并将其导入到另一个站点以进行进一步分析。

  1. 进入记录器页面。记录完成后,点击菜单(三个点)> 导出。
  2. 这将下载一个包含捕获数据的 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 中搜索“系统健康报告”即可查看此报告。