影响数据库性能的因素包含以下几类:
- 硬件:服务器(CPU/内存)、存储(IO性能)、网络(带宽)。
- 系统规模:并发、数据量。
- 软件环境:操作系统及参数配置。
- 数据库:优化器、内核参数、表结构、索引、统计信息等。
当系统整体存在性能问题时,考虑通过系统调优来解决。
系统调优
系统调优流程
数据库系统调优的大致流程如下:
-
整体性能问题诊断,明确调优范围。判断压力是否在数据库?
-
如果压力在数据库层面,排查监控是否有如下问题症状:
- CPU占用高
- IO占用高
- 内存占用高
- 网络异常
- 线程池占满
- 如果压力在数据库层面,排查监控观察到症状后,可以尝试从以下角度解决问题:
- 系统资源不足
- 并发问题
- 数据库配置问题
- 内核资源使用不优
- SQL需要优化
- 如果压力不在数据库层面,可以尝试从以下角度定位问题:
- 应用服务器资源不足
- 应用服务器到数据库之间的网络通信
- 业务处理查询结果慢
资源使用分析
通过TPOPS运维管理平台可以查看对应时间段内数据库的资源使用情况。
如果没有部署运维管理平台,可以通过以下方式来分析资源使用:
- CPU使用:
top
命令查看当前CPU使用情况,sar -u -f /var/log/sa/sa**
查看历史CPU使用情况。 - 内存使用:
free
命令查看当前内存使用情况,sar -r -f /var/log/sa/sa**
查看历史内存使用情况。 - 磁盘IO使用:
iostat -xm 1
命令查看当前磁盘IO使用情况,sar -b -f /var/log/sa/sa**
查看历史磁盘IO使用情况。 - 连接池使用:通过以下SQL查看数据库实时连接池使用情况。
select node_name,session_info
from dbe_perf.global_threadpool_status order by 1;
内存模型
GaussDB数据库内存可以划分为动态内存(dynamic memory)、共享内存(shared memory)、其他内存(other memory)三个部分。
- 参数
max_process_memory
控制GaussDB数据库能够使用的最大服务器内存。 - 参数
work_mem
:内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。一旦work_mem限定的物理内存不够,算子运算数据将写入临时表空间,会带来5到10倍的性能下降。 - 参数
maintenance_work_mem
:维护操作可使用的最大内存,例如VACUMM和CREATE INDEX操作。 - 参数
shared_buffers
:数据库使用的共享内存大小。 - 参数
cstore_buffers
:列存表使用的共享缓冲区大小。 - 执行作业最终可用的内存等于
max_process_memory - shared_memory - cstore_buffers
。
查看数据库内存使用:
--查看内存使用详细信息
select * from pg_total_memory_detail; --查看此视图需要开启内存保护特性
--数据库最大可用内存
show max_process_memory;
--查看各内存组件大小
show work_mem;
show maintenance_work_mem;
show cstore_buffers;
show shared_buffers;
show wal_buffers;
--查看动态内存使用
select contextname,pg_size_pretty(sum(totalsize)),pg_size_pretty(sum(freesize))
from gs_session_memory_detail
group by contextname order by sum(totalsize) desc limit 10;
等待事件
常见的等待事件及其含义:
等待事件 | 含义 |
---|---|
wait cmd | 等待读取网络通信包。当前会话正在等待用户发送数据,当前压力不在数据库 |
wait io | 等待IO完成,可能存在IO异常 |
wait wal sync | 等待WAL日志同步到备库。即提交的事务在等待备机落盘。可能的原因:WAL日志量大、主备机网络异常、备机IO异常 |
wait data sync | 等待完成数据页到备机的同步 |
flush data | 等待向网络中nodename指定节点的plevel对应线程发送数据。可能的原因:数据量大、网络异常 |
logctrl_sleep | 为保障数据库RTO,数据库本身具备流控能力(recovery_time_target)。在压力测试时,可考虑是否关闭流控 |
pooler create conn | 分布式GaussDB内pooler CN正在向DN建立连接。可能的原因:CN到DN网络异常、DN上线程池繁忙、DN到dns服务器延时高 |
wait node | 当前查询正在等待其他节点返回。如果多数查询在等待某个节点,表示该节点可能是瓶颈 |
sort/sort-fetch tuple/sort-write file | 分别表示正在执行sort算子、获取sort元组、sort下盘操作。其他算子Material/HashJoin/HashAgg等类似。对于异常下盘场景,可以评估当前会话增加work_mem,其他场景考虑优化查询 |
gtm xxx | gtm异常事件优先排查CN/DN与GTM主机的网络延时 |
DataFileRead/DataFileWrite | 通常大量出现这两种等待事件可能是IO异常、业务SQL不优 |
tuple/transactionid | 通常大量出现这两种等待事件,业务极大可能有并发更新导致业务整体阻塞。结合系统视图排查造成阻塞的会话 |