1 Star 0 Fork 0

OceanBase / tutorials-doc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
3.6-2-factors-affecting-performance.md 8.54 KB
一键复制 编辑 原始数据 按行查看 历史
obdev 提交于 2023-08-07 12:38 . PullRequest: 39 常用词扫描

6.2 影响性能的因素

磁盘划分

如果 OBServer 节点的运行日志、事务日志、数据文件都在一块盘上,则被称为单盘部署。单盘部署的风险较大,目前已知问题有如下几项:

  • 事务日志(CLOG)空间利用率超过 80% 会开始回收,超过 95% 节点就会停止写入、掉线。

  • 转储和合并时需要额外的 IO、CPU 资源,和业务读写的 IO 可能会互相影响。

  • 运行日志(LOG)写的太多太快,可能会导致节点掉线,LOG 写满可能会导致节点异常。

  • 影响 liboblog 同步,影响 CLOG 回收和副本迁移速度等。

  • 参数文件 observer.config.bin 因为盘满导致持久化失败。

以上对 TPC-C 和 SYSBENCH 测试影响多一些,对 TPC-H 影响少一些。

应对策略:

  • CLOG、LOG、SSTable 分多个独立文件系统。无论是多盘部署还是单盘部署,均使用 LVM 划分出多个 LV。

  • 开启 LOG 限流,相关参数为:syslog_io_bandwidth_limit

    alter system set syslog_io_bandwidth_limit='10M';
  • LOG 滚动输出,设置最大数目。

    alter system set enable_syslog_recycle=true; alter system set max_syslog_file_count=50;
  • CLOG 参数

    • clog_disk_usage_limit_percentage 默认为 95,不建议调大。

    • clog_disk_utilization_threshold 默认为 80,可以下调到 50,但不能太低。

OceanBase 和 ODP 参数

OceanBase 参数

alter system set net_thread_count = 32; -- 网络线程数
alter system set _clog_aggregation_buffer_amount=4;
alter system set _flush_clog_aggregation_buffer_timeout='1ms' ; -- 把大概几毫秒之内的日志都聚合到一个 rpc 中发送,减小网络开销,提高并发读
alter system set trace_log_slow_query_watermark='10s' ;   --打印 SQL QUERY 的阈值
alter system set large_query_threshold='1s' ; -- large query 的阈值,超过后进入大查询队列,避免大查询阻塞小查询
alter system set syslog_level='PERF'; -- 控制日志输出级别
alter system set clog_sync_time_warn_threshold='2000ms' ;  -- clog 日志同步慢的时候触发 debug 日志的输出。
alter system set syslog_io_bandwidth_limit='10M' ;  -- 超过 10M 会日志限流,减小写日志文件带来的 IO 消耗
alter system set enable_sql_audit=false  -- 关闭 sql audit
alter system set enable_perf_event=false;   -- 关闭监控项
alter system set clog_max_unconfirmed_log_count=5000;  -- 增大滑动窗口,解决 clog 滑动窗口满导致的性能问题
alter system set minor_warm_up_duration_time=0 ; -- 转储 SSTable 预热时间,转储完成后到预热时间内,所有对应 partition 的流量会逐步从 MemTable 过渡到 SSTable,设置 0 转储之后流量马上切到 SSTable,使得 MemTable 快速释放 ,内存释放更快。
alter system set memory_chunk_cache_size = '0';  -- 降低 OceanBase 内部 2MB 内存块被 OS 回收的概率,增大 2MB 内存块在 OceanBase 内部的复用率,减少 RPC 由于内存操作慢而导致超时的风险。
alter system set minor_merge_concurrency = 32;  -- 增大转储的线程数,期望提高转储的速度。
alter system set _mini_merge_concurrency = 8;  -- 增大 mini_merge 的线程数,期望提高 mini_merge 的速度
alter system set freeze_trigger_percentage = 40;  -- 触发转储的时机
alter system set autoinc_cache_refresh_interval='86400s';  -- 调大自增列刷新的频率,减少性能损耗。
alter system set cpu_quota_concurrency=2;  -- 这个数*租户cpu=工作线程数,具体调整的数值需要根据业务模型和机器配置调整,工作线程超过实际 CPU 核数也没有意义同时会增加 CPU 调度和上下文切换的开销
alter system set builtin_db_data_verify_cycle = 0 ; -- 宏块巡检周期参数,当设置为 0 时关闭巡检
alter system set micro_block_merge_verify_level = 0;  -- 微块校验等级设置,0:不做任何校验;1:对 encoding 做 decode 校验;2:对 encoding 做 decode 校验,对压缩做解压校验
alter system set _ob_get_gts_ahead_interval = '0ms'; 
alter system set bf_cache_priority = 10;  -- 为频繁空查的宏块建立 bloomfilter 并缓存,减少磁盘 IO 和 CPU 消耗,提升写入性能
alter system set user_block_cache_priority=5; 
alter system set merge_stat_sampling_ratio = 1 ;  -- 合并时统计信息采样率,当设置为 0 时则关闭统计信息采集
alter system set _enable_static_typing_engine=true; 

alter system set enable_early_lock_release=false tenant=all; -- 提前解行锁场景下,用于租户级别控制,是否打开该优化

ODP 参数

alter proxyconfig set enable_ob_protocol_v2=false ;
alter proxyconfig set enable_qos=false ;
alter proxyconfig set enable_compression_protocol=false ;
alter proxyconfig set automatic_match_work_thread = false;  -- 关闭自动计算线程个数
alter proxyconfig set work_thread_num = 32;  -- 手动设置工作线程个数,需要 restart
alter proxyconfig set syslog_level='ERROR';
alter proxyconfig set monitor_log_level = 'ERROR';
alter proxyconfig set enable_monitor_stat = false ;
alter proxyconfig set xflush_log_level="ERROR";

JDBC URL 参数

conn=jdbc:mysql://x.x.x.x(ip):xx(port)/xxxx(dbname)?rewriteBatchedStatements=true&allowMultiQueries=true&useLocalSessionState=true&useUnicode=true&characterEncoding=utf-8&socketTimeout=3000000
  • rewriteBatchedStatements:此参数影响导数据效率,不可以忽略。

  • useLocalSessionState:是否使用 autocommitread_onlytransaction isolation 的内部值(jdbc 端的本地值),建议设置为 true。如果设置为 false,则需要发语句到远端请求,增加发送请求频次将会影响性能。

转储与合并

转储是租户级别的操作,当一台服务器的一个租户中 MemTable 的内存占用超过租户内存上限的一定比例时,就会触发小版本冻结(Minor Freeze)。

所谓冻结,就是禁止当前活跃 MemTable 的写入,并同时创建新的空 MemTable 以支持新的写入。被冻结后的 MemTable 就成为一个静态的数据结构,可以被后台线程读取并转储为 SSTable。

合并是全局级别的操作,合并会把当前大版本的 SSTable 和 MemTable 与前一个大版本的全量静态数据进行合并,产生新的全量数据。

说明

合并操作包含转储操作。

转储和合并是把内存数据刷到磁盘上,存储层统计信息可以更准确,生成的执行计划也就更稳定准确。MemTable 扫描性能很差,合并后 RANGE 查询性能会有提升。

PRIMARY_ZONE 设置

租户的 PRIMARY_ZONE 用来控制租户里主副本的分布。如果设置为 RANDOM,就可以将不同分区的主副本分散在不同 Zone 的节点上,机器利用率将达到最大化。反过来,设置为某个具体的 Zone,则只能利用部分节点。

使用分区表

分区表使用水平拆分策略将一个大表切割为多个独立的分区。

说明

独立的分区并不是分表,依然是分区表的一部分。

分区表有以下作用:

  • 将海量数据分散到不同分区存储,不同分区可以分散在不同节点存储,从而化解单机空间瓶颈。

  • 将海量请求分散到不同分区,不同分区主副本可以分散在不同节点,从而化解单机处理能力瓶颈。

分区表的索引分为全局索引和本地索引:

  • 全局索引对某些不带分区键的查询比较友好,但是对写不友好,可能导致分布式事务。此外,当 RANGE 查询要返回很多数据时,全局索引也会有很多分布式查询,性能并不一定比本地索引好。

  • 使用本地索引读写数据,可以规避分布式事务,可以多分区多节点并行读。

使用表分组 Table Group

表分组是将一组业务联系紧密的表的分区分布调度在一起。

  • table_group :Table Group 是一个逻辑概念,它和物理数据文件没有关联关系,Table Group 只影响表分区的调度方法,OceanBase 数据库会优先把属于同一个 Table Group 的相同分区号的分区调度到同一台节点上,以减少跨节点分布式事务。

  • partition_group:Table Group 的每个分区表中下标相同的一组分区为 Partition Group,作用是将分区号相同的 partition 放到 1 个 Partition Group 的物理结构里面达到提升性能的目的。

注意

同一个表分组里面的分区表的分区策略必须一致。

1
https://gitee.com/oceanbase/tutorials-doc.git
git@gitee.com:oceanbase/tutorials-doc.git
oceanbase
tutorials-doc
tutorials-doc
V1.0.0

搜索帮助