sql memory manager mutex lock 竞争大,锁等待次数持续增多

【 使用环境 】 测试环境
【 OB or 其他组件 】OB
【 使用版本 】社区版OBV4.2.4.0
【问题描述】测试sysbench查询GV$LATCH表,出现多条一样的数据,想问下这几条数据之间有什么区别,然后sql memory manage mutex lock的misses也一直再涨,想问下是否可以通过参数方式解决

【复现路径】sysbench 只读场景高并发,10张表每张表1000万行数据

根据您提供的信息,您在测试环境中使用 sysbench 进行高并发只读场景测试时,遇到了 sql memory manager mutex lock 竞争大的问题,这导致了 misses 数量持续增加。此外,您还提到在查询 GV$LATCH 表时发现了多条相同的数据,希望了解这些数据之间的区别以及如何通过参数解决 sql memory manager mutex lock 的竞争问题。

关于 GV$LATCH 表中多条相同数据的区别

GV$LATCH 表用于显示系统中各个 latch 的状态信息。latch 是一种轻量级的锁,用于保护共享数据结构,防止多个线程同时修改同一数据。在 GV$LATCH 表中,多条相同的数据通常表示不同的线程在同一时间点对同一个 latch 进行了操作。具体来说:

  • ADDR:latch 的内存地址。
  • NAME:latch 的名称,例如 sql memory manager mutex lock
  • GETS:成功获取 latch 的次数。
  • MISSES:未能立即获取 latch 而需要等待的次数。
  • SLEEPS:在等待 latch 时进入睡眠状态的次数。
  • IMMEDIATE_GETS:立即获取 latch 的次数。
  • IMMEDIATE_MISSES:立即获取失败的次数。
  • SPIN_GETS:自旋获取 latch 的次数。

多条相同数据的区别在于它们可能对应不同的线程或不同的时间点。您可以结合 SVR_IPSVR_PORT 字段来区分不同的 OBServer 节点上的 latch 状态。

解决 sql memory manager mutex lock 竞争问题

sql memory manager mutex lock 竞争大通常是由于高并发场景下多个线程频繁访问内存管理相关的数据结构导致的。以下是一些可能的解决方案:

  1. 增加内存分配粒度

    • 通过调整内存分配的粒度,减少对 sql memory manager mutex lock 的竞争。您可以尝试调整 memory_pool_size 参数,增加内存池的大小,从而减少内存分配的频率。
  2. 优化查询

    • 检查并优化您的查询,确保查询的复杂度和资源消耗尽可能低。可以通过 EXPLAIN 语句查看查询的执行计划,找出潜在的性能瓶颈。
  3. 调整并发度

    • 适当降低并发度,减少对 sql memory manager mutex lock 的竞争。您可以尝试减少 sysbench 的并发线程数,观察 misses 数量的变化。
  4. 使用分区表

    • 如果您的表数据量较大,可以考虑使用分区表来分散查询压力,减少对单一数据结构的竞争。
  5. 检查系统配置

    • 确保您的系统配置(如 CPU、内存、磁盘 I/O 等)能够满足高并发场景的需求。您可以使用 topiostat 等工具监控系统的资源使用情况。

示例 SQL 查询

您可以使用以下 SQL 查询来进一步分析 sql memory manager mutex lock 的竞争情况:

SELECT 
    NAME, 
    GETS, 
    MISSES, 
    SLEEPS, 
    IMMEDIATE_GETS, 
    IMMEDIATE_MISSES, 
    SPIN_GETS, 
    SVR_IP, 
    SVR_PORT 
FROM 
    GV$LATCH 
WHERE 
    NAME = 'sql memory manager mutex lock';

总结

  • GV$LATCH 表中的多条相同数据表示不同的线程在同一时间点对同一个 latch 进行了操作。
  • 通过增加内存分配粒度、优化查询、调整并发度、使用分区表和检查系统配置等方法,可以缓解 sql memory manager mutex lock 的竞争问题。

如果您在实施上述建议后仍然遇到问题,建议使用 obdiag 工具收集更多的诊断信息,并联系 OceanBase 的技术支持团队获取进一步的帮助。

检索到的文档如下:

  1. 诊断实践:使用 SQL_PLAN_MONITOR 分析性能问题
  2. V$OB_PLAN_CACHE_STAT
  3. 查询 SQL 流量分布情况及 QPS
  4. 内存问题诊断
  5. 内部等待问题
  6. V$OB_PLAN_CACHE_PLAN_STAT
  7. 常见内存问题
  8. 并行执行问题诊断

用诊断工具obdiag 拿一下sysbench的巡检报告:


# 执行 sysbench 时的巡检任务集合
obdiag check --cases=sysbench_run

# 执行 sysbench 前的巡检任务集合
obdiag check --cases=sysbench_free

https://www.oceanbase.com/docs/common-obdiag-cn-1000000001768218

obd版本2.10.1,离线部署2.6版本obdiag后未见~/.obdiag目录,只有oceanbase-diagnostic-tool目录,执行obdiag命令 command not found

根据您提供的信息,您在离线部署了 obdiag 2.6 版本后,发现没有生成 ~/.obdiag 目录,并且在执行 obdiag 命令时提示 command not found。以下是可能的原因和解决步骤:

可能的原因

  1. 环境变量未设置obdiag 命令的路径没有添加到系统的环境变量中。
  2. 安装路径不正确obdiag 可能没有正确安装到预期的目录。
  3. 权限问题:安装过程中可能遇到了权限问题,导致 obdiag 无法正确安装。

解决步骤

1. 检查 obdiag 的安装路径

首先,确认 obdiag 是否已经正确安装到 oceanbase-diagnostic-tool 目录中。您可以使用以下命令检查:

ls -l $HOME/oceanbase-diagnostic-tool

确保 obdiag 可执行文件存在于该目录中。

2. 设置环境变量

如果 obdiag 已经正确安装,但命令不可用,可能是环境变量未设置。您需要将 obdiag 的路径添加到 PATH 环境变量中。编辑您的 shell 配置文件(例如 .bashrc.zshrc),添加以下内容:

export PATH=$HOME/oceanbase-diagnostic-tool:$PATH

然后,重新加载配置文件:

source ~/.bashrc  # 或者 source ~/.zshrc

3. 检查 ~/.obdiag 目录

如果 ~/.obdiag 目录确实不存在,您可以手动创建它:

mkdir -p ~/.obdiag

4. 验证 obdiag 命令

再次尝试执行 obdiag 命令,验证是否可以正常使用:

obdiag --help

综合检查

如果您仍然遇到问题,可以尝试以下综合检查步骤:

  1. 重新安装 obdiag
    确保您按照官方文档的步骤重新安装 obdiag。您可以参考 敏捷诊断工具 obdiag 文档中的安装步骤。

  2. 检查安装日志
    查看安装过程中的日志,确认是否有任何错误或警告信息。

  3. 使用绝对路径执行 obdiag
    如果环境变量设置仍然无效,您可以尝试使用绝对路径执行 obdiag

    $HOME/oceanbase-diagnostic-tool/obdiag --help
    

总结

  • 检查 obdiag 的安装路径,确保 obdiag 可执行文件存在。
  • 设置环境变量,将 obdiag 的路径添加到 PATH 中。
  • 手动创建 ~/.obdiag 目录,如果该目录不存在。
  • 重新安装 obdiag,确保安装过程无误。
  • 检查安装日志,查找可能的错误信息。
  • 使用绝对路径执行 obdiag,验证命令是否可用。

如果您在实施上述步骤后仍然遇到问题,建议联系 OceanBase 的技术支持团队获取进一步的帮助。

检索到的文档如下:

  1. 诊断工具命令组
  2. 集群诊断
  3. obdiag
  4. 快速入门:obdiag 全链路功能诊断
  5. obcdc 开发说明
  6. (可选)查看资源
  7. 通过 obd 白屏部署 OceanBase 集群

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

obd部署的直接:obdiag check <集群名> --cases=sysbench_free