OBProxy 有自己的慢查询日志打印功能,通过 OBProxy 的以下两个配置项可控制打印到日志中的 SQL 或事务的处理时间阈值。
配置项 | 描述 |
slow_transaction_time_threshold | 指慢查询或事务的整个生命周期的时间阈值,超过了该时间,就会打印相关日志。 |
slow_proxy_process_time_threshold | 在发往 Server 前 Proxy 本身的处理时间,包括获取集群信息、路由信息、黑名单信息等。 |
slow_query_time_threshold | 指从 OBProxy 获取 SQL 直到返回给客户端之前的这段时间的阈值,超过了该时间,也会打印相关日志。 |
查看和修改 OBProxy 慢查询配置项
- 在 OceanBase 数据库支持的客户端工具中使用 root 用户登录集群的 sys 租户。
- 运行下述语句查看 OBProxy 配置项:
obclient> SHOW PROXYCONFIG LIKE 'slow_transaction_time_threshold';
obclient> SHOW PROXYCONFIG LIKE 'slow_proxy_process_time_threshold';
obclient> SHOW PROXYCONFIG LIKE 'slow_query_time_threshold';
- 修改 OBProxy 配置项的值。
示例语句如下所示,一般修改配置项 slow_transaction_time_threshold
即可,且配置项 slow_proxy_process_time_threshold
默认值为 2 ms,该值适用于绝大多数场景。
obclient> ALTER PROXYCONFIG SET slow_transaction_time_threshold='100ms';
obclient> alter proxyconfig set slow_proxy_process_time_threshold='5ms';
排查慢查询
通过查看 OBProxy 慢查询日志找到运行缓慢的 SQL 语句。
OBProxy 的日志路径为 /opt/taobao/install/[obproxy目录]/log
。其中, [obproxy目录]
在 OBProxy 不同版本下可能不同,早期版本为 obproxy
;较新版本为 obproxy-[具体版本号]
,例如 obproxy-1.5.7
。
在 OBProxy 宿主机的命令行工具中 cd 至上述目录后,运行下述语句以查看运行缓慢的 SQL 语句:
grep -i 'slow query'
您也可以运行下述命令对慢查询日志稍作格式化以方便您解读其中的内容:
grep -i 'slow query' obproxy.xxx.log | sed "s/, /,\n/g"
下述为格式化后的示例日志
[2020-02-19 15:17:01.072491] WARN [PROXY.SM] update_cmd_stats (ob_mysql_sm.cpp:5673) [103335][Y0-7FF57C8613A0] [lt=10] [dc=0] Slow Query: (client_ip={127.0.0.1:44228}, // 执行SQL client IP
server_ip={xxx.xxx.xxx.xxx:2881} // SQL 被路由到的 OBServer
server_trace_id=YB420BA65786-00059E5922A874E6 // 目标 OBServer 中执行过程中的 trace id
route_type=ROUTE_TYPE_LEADER // SQL 使用的路由策略
user_name=root // 连接用户名
tenant_name=xxx // 连接租户名
cluster_name=xxx // 连接 OceanBase 集群名称
use_compress_protocol=true // SQL 传输是否使用压缩协议
cs_id=365 // client login 时看到的 connection id 和 OBProxy 分配
proxy_sessid=7 // client 访问 OceanBase 数据库时内部记录的 connection id
ss_id=10
server_sessid=3221946244 // SQL 在目标 OBServer 中的 connection id 和 OBServer 分配
sm_id=9535
cmd_size_stats={client_request_bytes:31 // 客户端请求 SQL 大小
server_request_bytes:49 // 路由到 OBServer SQL 大小
server_response_bytes:0 // OBServer 转发给 OBProxy 数据大小
client_response_bytes:76} // OBProxy 转发给 client 数据大小
cmd_time_stats={
client_transaction_idle_time_us=0 // 在事务中该条 SQL 与上一条 SQL 执行结束之间的间隔时间,即 client 事务间隔时间
client_request_read_time_us=27 // Proxy 从 client socket 读取请求包的耗时
client_request_analyze_time_us=25 // Proxy 分析 client 的 SQL 耗时
cluster_resource_create_time_us=0 // Proxy 创建集群资源耗时(仅首次访问集群时需要创建)
pl_lookup_time_us=16 // 根据 SQL 获取涉及路由表的耗时
pl_process_time_us=34 // 对涉及路由表进行筛选排序的耗时
congestion_control_time_us=5 // 根据 SQL 获取涉及黑名单信息的耗时
congestion_process_time_us=0 // 对涉及黑名单的进行检查过滤的耗时
do_observer_open_time_us=198 // 对目标 OBServer 获取可用连接的耗时, 包含 connect_time
server_connect_time_us=166 // 对目标 OBServer 创建连接的耗时
server_sync_session_variable_time_us=1127 // 对选择的目标连接进行初始化的耗时, 包括 saved_login,同步 DB,同步系统变量,同步 last_insert_id,同步 start_trans
server_send_saved_login_time_us=571 // 对选择的目标连接进行 saved login 耗时
server_send_use_database_time_us=189 // 对选择的目标连接同步 DB 耗时
server_send_session_variable_time_us=366 // 对选择的目标连接同步已修改的系统变量耗时
server_send_all_session_variable_time_us=0 // 对选择的目标连接同步所有系统耗时
server_send_last_insert_id_time_us=0 // 对选择的目标连接同步 last_insert_id 耗时
server_send_start_trans_time_us=0 // 对选择的目标连接同步 start_trans/begin 耗时
build_server_request_time_us=37 // 构建对目标 Server 的请求包的耗时
plugin_compress_request_time_us=0 // 对请求包进行压缩耗时
prepare_send_request_to_server_time_us=1606 // 从 Proxy 接受到客户端请求,到转发到 OBServer 执行前总计时间,正常应该是前面所有时间之和
server_request_write_time_us=8 // Proxy 向目标 Server socket 发送请求包的耗时
server_process_request_time_us=381489 // 目标 Server执行该条SQL的耗时
server_response_read_time_us=9 // Proxy从目标 Server socket 读取响应包的耗时
plugin_decompress_response_time_us=13 // 对响应包进行解压缩耗时
server_response_analyze_time_us=10 // 对响应包进行分析的耗时
ok_packet_trim_time_us=0 // 对响应包 trim 掉最后一个 ok 包的耗时
client_response_write_time_us=34 // Proxy 向 client socket 发送响应包的耗时
request_total_time_us=383233} // Proxy 处理该请求总时间, 等于前面所有耗时之和
sql=select count(1) from test1) //client 的请求 SQL