AntDB性能调优
适用场景 |
interl |
AMD |
ARM |
|
1.批量运行大数据量查询 2.大量数据排序 |
AntDB4.x |
Y |
Y |
Y |
AntDB5.x |
Y |
Y |
Y |
|
AntDB6.x |
Y |
Y |
Y |
|
1.并发量大 2.小查询多 |
AntDB4.x |
Y |
Y |
|
AntDB5.x |
Y |
Y |
||
AntDB6.x |
Y |
Y |
AntDB4.X以上版本,基于pg9.6内核,支持并行,单个操作可以在多个core处理,因此CPU速度可以通过更多的廉价的cores来弥补。
并且将cpu调优为 性能模式
cpupower frequency-set --governor performance
1.结果集小的数据库,不建议购买大内存。
2.表数据量巨大,以至于全表扫描时,内存不能全部加载的数据库,与其购买大内存或不断扩内存,不如购买IO性能更好的硬盘。
类型 |
指标 |
SATA |
转速:7,200 是标准,部分可达 10K |
SAS |
转速:10 K or 15 K |
SSD |
TP类业务要求SSD磁盘
类型 |
适用场景 |
数据冗余/数据安全 |
Raid10 |
是一种重写的方式, 适合读多于写的环境。 |
至少4块盘,2块盘组成RAID1,再将这2组RAID1组成RAID0。 数据冗余实际按 1:1 冗余。 |
Raid5 |
是一种重读的方式, 读性能有所降低。 |
至少3块盘,每块盘都保留奇偶校验信息,只允许损坏1块盘,则可以恢复数据。如果在损坏1块盘期间,又损坏另一块盘,则是灾难性,数据无法恢复。 |
Raid6 |
是一种较新的磁盘冗余方案,只有在较新的磁盘阵列卡才支持raid6模式。可以像raid5一样提供更大的磁盘空间,同时像raid10一样提供更佳的磁盘读能力。 |
1.普通盘选择deadline模式 echo deadline > /sys/block/sdb/queue/scheduler 2.扇区预读提升至65536 (建议区间 4096 to 65536,一个扇区是0.5KB,也就是块预热 32MB) blockdev --setra 65536 /dev/sdb 注:该设置影响顺序读,在AntDB中有大量全表扫描、或 读取csv文件copy导入 场景 3. 提升调度器请求队列深度 echo 4096 > /sys/block/sdb/queue/nr_requests |
类型 |
说明 |
系统层 |
sync (sync会调用 fsync or fdatasync ) pg 通过 wal_sync_method 参数控制 |
硬盘控制器层 |
a battery-backed write cache(电池支持的回写高速缓存) mode: 1.write-back:快 (注意配合机房UPS电源一起使用)。当 battery 异常,有可能自动切换至 write-though 模式。 2.write-though:性能下降 |
硬盘层 |
做了raid或有控制器的磁盘,建议禁用磁盘本身的回写缓存,尽量使用raid或控制器的回写缓存更安全。 一般 系统回写缓存高达 1G 以上,控制器回写缓存在 128MB 至 512MB 之间,磁盘本身的回写缓存在 8MB 至 32MB 之间。 启用写缓存:hdparm -W 1 /dev/sdc 禁用写缓存:hdparm -W 0 /dev/sdc 显示信息:hdparm -I /dev/sdc |
文件系统层 |
mount时指定-o 选项设置 data=writeback/ordered/journal barrier=0/1 |
综上所述,建议的磁盘配置,
raid阵列(支持a battery-backed write cache)+
启用raid阵列write-back cache +
禁用磁盘本身的write-back cache+
机房UPS不间断电源,
这是一种读写效率最佳 且 数据安全的搭配方案。
在上述建议配置的存储情况下:
data=writeback
barrier=0
否则:
data=ordered
barrier=1
ext4 默认打开barrier。
-o noatime
/etc/sysctl.conf
vm.dirty_background_ratio=5 vm.dirty_expire_centisecs=6000 vm.dirty_writeback_centisecs=500 vm.dirty_ratio=10 |
/etc/sysctl.conf
vm.swappiness=0 优先收缩文件系统缓存,而不是优先进行文件交换swap vm.overcommit_memory=2 vm.overcommit_ratio=90 vm.min_free_kbytes=2048000 vm.drop_caches=3 vm.vfs_cache_pressure=100 vm.zone_reclaim_mode=0 |
--测试cpu速度 select sum(generate_series) from generate_series(1, 100000); sum ------------ 5000050000 (1 row) Time: 72.782 ms select sum(generate_series) from generate_series(1, 1000000); sum -------------- 500000500000 (1 row) Time: 514.764 ms --测试磁盘速度 create table b1 (id int primary key); insert into b1 select generate_series(1, 100000); INSERT 0 100000 Time: 1010.510 ms insert into b1 select generate_series(1, 1000000); INSERT 0 1000000 Time: 4148.271 ms |
1. 分片键尽量选择数据分布均匀、重复率低的字段,建议使用手机号、身份证号等。
2. 单表操作时:
2.1 通过过滤条件能够使操作仅涉及单节点的情况,尽量采用过滤条件字段作为分片键。
如 where phoneNum = xxx,建议phoneNum作为分片键。
2.2 操作必须涉及多节点的情况,分片键建议和条件字段保持一致。
如 select distinct date_no from,建议date_no作为分片键。
如 select stuID,name from xxx order by stuID,建议stuID作为分片键。
2.3 根据多个维度分组操作时,建议采用其中的任意一个维度作为分片键。
如 select from xxx group by a,b,c,d,e ,建议a、b、c、d、e 任意字段均可作为分片键。
2.4 对于继承表,分片键保持与父表一致。
另外,如果子表建了索引,建议父表也建上相同的索引(有助于执行计划减少排序,即便是SQL中没有order by,内部也是有可能需要排序的)。
3. 多表关联操作时:
3.1 为了避免引起数据的重分布,建议数据的分布纬度和查询纬度保持一致。 如 on a.aid = b.bid ,建议表a以aid为分片键,表b以bid为分片键,可以避免引起数据重分布。
在此基础上,尽量满足条件1的要求,使得各节点的数据均匀分布,以使各节点能够在一个比较均衡的时间段内返回结果集
4. 表数据导入后,建议手工执行一次 analyze tabName 的操作。
由于autovacuum触发需要时间间隔,如果在数据导入后,立即执行select 操作,返回结果集会非常慢。
5. 建表原则:小表replication,大表hash
6. 避免一次处理太多的数据
SELECT * FROM EVENTS ORDER BY ID DESC LIMIT 3;
id列没有索引,seq scan,排序,返回结果集
id创建索引后,index scan后直接返回结果集
6.避免内存命中率低
7.避免返回的结果集太大
LIMIT OFFSET
8.避免执行大量的小查询
会引发网络延迟
9. 简化复杂sql
view
with as
10.加快查询效率
加大统计精度 default_statistics_target
复合索引 查询字段a,并按字段b排序 CREATE INDEX t1_a_b_ndx ON t1(a,b);
部分索引
使用继承表
重update的表 设置填充因子 ALTER TABLE t1 SET (fillfactor = 70);
11.参数设置
启动adb的集群计划:
set coordinator all (enable_cluster_plan=on);
set datanode master all(enable_cluster_plan = on);
启动并行
set coordinator all (max_parallel_workers_per_gather = 5);
set coordinator all (max_worker_processes = 16);
排序操作多的局点:适当调高work_mem size,但不要超过96MB,避免内存不足
work_mem = 96MB
hash操作多的局点:适当调高hash_mem_multiplier,提供2倍的work_mem内存计算hash
hash_mem_multiplier = 2
对于有继承表实现分区表的局点:避免扫描所有分区表。
constraint_exclusion = on
对于只有原生分区表的局点:避免原生分区表判断继承表的逻辑,而降低原生分区表的效率
constraint_exclusion = off
写请求多,导致磁盘IO写非常忙的局点:
合并wal flush写请求.
wal_writer_delay = 10ms
commit_siblings = 5