# 调优 ## `magma-site.xml` 关键参数配置说明 **`nbuffers`** 配置 btree 使用的buffer pool中buffer的数目(page默认16K)。其主要目的在于将 index,已删除数据等尽可能缓存在内存中。 这是 Magma 中目前内存消耗最大的配置项。 对于重在测试index查询,以及update/delete比较频繁的场景,需要将该参数调大。 实际情况还需要结合机器的内存进行合理配置。理论上配置越大越好,因为我们总是希望将尽可能多的数据放入内存中。 根据机器的内存,可以分为3档: | 机器内存 | 配置项数值 | | ---------- | ------------------------------------------------------------ | | 0~32g | nBuffers = 10240(大约每个rg配置160MB)
对于索引比较多,update/delete比较频繁一类的OLTP场景,可以调大该配置 | | 32g ~ 256g | nBuffers = 102400 (大约每个rg配置1.6GB) | | 256g 以上 | nBuffers = 204800(大约每个rg配置3.2GB) | **注**:具体过程中遇到问题时,根据机器的总内存量, 副本数目,并发数,适当调整该配置。 **`shared_buffer_size_per_table_per_range`** 等同于 HDFS 中的块大小,单位是 Byte, 是 Magma AP 表存储压缩的最小单位,小于这个大小的数据,通常会存储在内存中; 这个参数对于TP、AP场景比较敏感。**AP场景不低于4MB,TP场景不超过4MB。** **`shared_buffer_size_max_per_table_per_range`** 在AP型场景中,不乏有宽表存在,很快就会超过前面设定的块大小(shared_buffer_size_per_table_per_range), 但是这时候可能缓存的block内部行数还很少,压缩解压带来的性价比不高,所以需要积累行数,但是不能超过这个上限值。 一旦到达这个上限,必然会触发压缩写。**AP型场景不超过32MB, TP型场景不超过8MB。** **`shared_buffer_min_tuples`** 单个存储block内的最少行数,如果行数太少,会导致大表的block数目过多,从而影响IO性能。 通常与shared_buffer_size_per_table_per_range 和 shared_buffer_size_max_per_table_per_range联动修改。 **`rpc_server_work_thread_num`** 配置 Magma 的 Meta Rg上的rpc服务的线程池大小,目前仅仅对 vsc_catalog 有作用,当并发的 rpc 服务超过线程池大小时就会出现等待。通常的 rpc 服务有 drop table, create index 等。**建议配置成cpu的虚拟核数,或者可能的create index的最大并发数;经验参数:32。** **`shared_buffer_fixed_pool_size`** 类似nbuffers参数,该参数表示的是表数据的内存池中的buffer数目(单个buffer大小默认是128KB)。 该参数通常配置需要参考并发dml数目,以及内存限制。理论上配置越大越好,因为我们总是希望将尽可能多的数据放入内存中。 根据机器的内存,可以分为3档: | 机器内存 | 配置项数值 | | ---------- | ------------------------------------------------------------ | | 0~32g | shared_buffer_fixed_pool_size = 512(大约每个rg配置64MB, 可同时支撑约500个并发写)
如果实际的并发数较大,偏向OLTP类交易型场景,可以调大该配置 | | 32g ~ 256g | shared_buffer_fixed_pool_size=10240(大约每个rg配置1.2GB) | | 256g以上 | shared_buffer_fixed_pool_size=20480(大约每个rg配置2.4GB | **注**:具体过程中遇到问题时,根据机器的总内存量, 副本数目,并发数,适当调整该配置。 ## Magma 内存规划公式 通常计划将机器30%~50%(magma_reserved_ratio)的内存用于 Magma 配置,检测配置是否合理,可以按照如下公式计算: 以单节点为例: ```yaml Total_Magma_Memory_Size = Size(Btree Buffer Pool) + Size(L0 Buffer Pool) Size(Btree Buffer Pool) = num_ranges_pernode * num_replicates * nbuffers * 16K Size(L0 Buffer Pool) = num_ranges_pernode * shared_buffer_fixed_pool_size * 128K 应该总是满足: Total_Magma_Memory_Size <= Physical_Memory_Size * magma_reserved_ratio ``` 这套公式能帮助我们: - 在nbuffers等内核参数使用经验参数时,反推单个节点上应该配置多少个ranges - 在性能调优等场景里,调整nbuffers等参数时,作为上限参考; ## 元数据集群配置参考 元数据集群通常都是 index 查询,并且客户端 cache 都是以整行 tuple 为单位进行缓存的,所以针对 index 扫描的性能非常重要。调整index表现相关的的配置参数对于元数据集群的性能非常关键。 **配置`magma-topology.yaml`** ```yaml - name: vsc_catalog nodes: m[1~3] port: 6666 num_ranges: 3 num_replicas: 3 data_dir: /disk1/magma_catalog log_dir: replica_locations: "regionA.zoneA:3" leader_preferences: "regionA.zoneA" conf_path: /usr/local/oushu/conf/oushudb/vsc_catalog ``` **配置`magma-site.xml`** ```xml nbuffers 204800 The buffer number of buffer manager. shared_buffer_size_per_table_per_range 4194304 Ap L0 buffer size of per range per table. Unit: Bytes shared_buffer_size_max_per_table_per_range 8388608 Ap L0 max buffer size of per range per table. Unit: Bytes shared_buffer_min_tuples 5000 Ap L0 minimal tuple count per block. shared_buffer_fixed_pool_size 10240 Ap L0 buffer pool size. rpc_server_work_thread_num 32 ``` ## 用户数据集群配置参考 Magma 设计之初为了纯正的 HTAP 而生,并且也一直在朝着这个方向努力。 但是 POC 场景,以及一些特定的环境,性能总是可以通过调整资源配置参数来达到最优。 目前尚未达到一份配置,适用所有场景的境界。通常Magma 用户数据集群区分是偏AP场景,还是偏TP型场景。 **配置`magma-topology.yaml`** ```yaml - name: vsc_default nodes: m[1~5] port: 6666 num_ranges: 40 num_replicas: 3 data_dir: /disk1/vsc_default,/disk2/vsc_default,/disk3/vsc_default,/disk4/vsc_default,/disk5/vsc_default,/disk6/vsc_default,/disk7/vsc_default,/disk8/vsc_default log_dir: replica_locations: "regionA.zoneA:3" leader_preferences: "regionA.zoneA" conf_path: /usr/local/oushu/conf/oushudb/vsc_default ``` **配置`magma-site.xml`** ```xml nbuffers 102400 The buffer number of buffer manager. shared_buffer_size_per_table_per_range 8388608 Ap L0 buffer size of per range per table. Unit: Bytes shared_buffer_size_max_per_table_per_range 16777216 Ap L0 max buffer size of per range per table. Unit: Bytes shared_buffer_min_tuples 10000 Ap L0 minimal tuple count per block. shared_buffer_fixed_pool_size 10240 Ap L0 buffer pool size. rpc_server_work_thread_num 8 ```