# 调优
## `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
```