外观
GaussDB 存储指标
磁盘使用指标
磁盘空间使用
总磁盘空间:存储设备的总容量
- 监控方法:使用操作系统工具(df命令)
- 示例:bash
# 查看磁盘空间使用情况 df -h /data/gaussdb - 正常范围:根据存储设备大小而定
已用磁盘空间:已使用的磁盘容量
- 监控方法:使用操作系统工具(df命令)或查询pg_tablespace_size函数
- 示例:bash
# 查看已用磁盘空间 df -h /data/gaussdb | grep -v Filesystem | awk '{print $3}' - 正常范围:通常应小于总容量的80%
可用磁盘空间:剩余的可用磁盘容量
- 监控方法:使用操作系统工具(df命令)
- 示例:bash
# 查看可用磁盘空间 df -h /data/gaussdb | grep -v Filesystem | awk '{print $4}' - 告警阈值:通常设置为总容量的20%
磁盘使用率
整体磁盘使用率:磁盘的整体使用百分比
- 监控方法:使用操作系统工具(df命令)
- 计算公式:(已用空间 / 总空间) * 100%
- 示例:bash
# 查看磁盘使用率 df -h /data/gaussdb | grep -v Filesystem | awk '{print $5}' - 正常范围:通常应小于80%
- 告警阈值:通常设置为80%
分区磁盘使用率:各个分区的使用百分比
- 监控方法:使用操作系统工具(df命令)
- 示例:bash
# 查看所有分区的磁盘使用率 df -h - 正常范围:通常应小于80%
IO性能指标
IO吞吐量
磁盘读取速率:每秒从磁盘读取的数据量
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看磁盘读取速率 iostat -x -k 1 5 - 指标:rkB/s字段
- 正常范围:根据存储设备性能而定
磁盘写入速率:每秒写入磁盘的数据量
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看磁盘写入速率 iostat -x -k 1 5 - 指标:wkB/s字段
- 正常范围:根据存储设备性能而定
总IO速率:每秒总IO数据量
- 监控方法:使用操作系统工具(iostat命令)
- 计算公式:读取速率 + 写入速率
- 正常范围:根据存储设备性能而定
IO延迟
平均读取延迟:读取操作的平均延迟时间
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看平均读取延迟 iostat -x 1 5 - 指标:r_await字段
- 正常范围:通常应小于10ms
平均写入延迟:写入操作的平均延迟时间
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看平均写入延迟 iostat -x 1 5 - 指标:w_await字段
- 正常范围:通常应小于10ms
平均IO延迟:所有IO操作的平均延迟时间
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看平均IO延迟 iostat -x 1 5 - 指标:await字段
- 正常范围:通常应小于10ms
IOPS
读取IOPS:每秒读取操作次数
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看读取IOPS iostat -x 1 5 - 指标:r/s字段
- 正常范围:根据存储设备性能而定
写入IOPS:每秒写入操作次数
- 监控方法:使用操作系统工具(iostat命令)
- 示例:bash
# 查看写入IOPS iostat -x 1 5 - 指标:w/s字段
- 正常范围:根据存储设备性能而定
总IOPS:每秒总IO操作次数
- 监控方法:使用操作系统工具(iostat命令)
- 计算公式:读取IOPS + 写入IOPS
- 示例:bash
# 查看总IOPS iostat -x 1 5 - 指标:tps字段
- 正常范围:根据存储设备性能而定
表空间指标
表空间大小
表空间总大小:各个表空间的总容量
- 监控方法:查询pg_tablespace_size函数
- 示例:sql
-- 查看表空间总大小 SELECT spcname AS 表空间名, pg_size_pretty(pg_tablespace_size(spcname)) AS 大小 FROM pg_tablespace; - 正常范围:根据表空间配置而定
表空间已用大小:各个表空间的已使用容量
- 监控方法:查询pg_tablespace_size函数和pg_total_relation_size函数
- 示例:sql
-- 查看表空间已用大小 SELECT spcname AS 表空间名, pg_size_pretty(SUM(pg_total_relation_size(relid))) AS 已用大小 FROM pg_tablespace JOIN pg_class ON reltablespace = pg_tablespace.oid GROUP BY spcname; - 正常范围:通常应小于表空间总大小的80%
表空间使用率
- 表空间使用率:各个表空间的使用百分比
- 监控方法:计算已用大小与总大小的比值
- 计算公式:(已用大小 / 总大小) * 100%
- 示例:sql
-- 计算表空间使用率 SELECT spcname AS 表空间名, pg_size_pretty(pg_tablespace_size(spcname)) AS 总大小, pg_size_pretty(SUM(pg_total_relation_size(relid))) AS 已用大小, ROUND((SUM(pg_total_relation_size(relid))::numeric / pg_tablespace_size(spcname)) * 100, 2) AS 使用率 FROM pg_tablespace JOIN pg_class ON reltablespace = pg_tablespace.oid GROUP BY spcname; - 正常范围:通常应小于80%
- 告警阈值:通常设置为80%
表空间增长速率
- 表空间日增长:表空间每日增长的容量
- 监控方法:定期收集表空间大小数据,计算日增长率
- 示例:sql
-- 计算表空间日增长 SELECT spcname AS 表空间名, pg_size_pretty(pg_tablespace_size(spcname) - yesterday_size) AS 日增长 FROM ( SELECT spcname, pg_tablespace_size(spcname) AS today_size, LAG(pg_tablespace_size(spcname)) OVER (PARTITION BY spcname ORDER BY collect_time) AS yesterday_size FROM tablespace_size_history WHERE collect_time >= NOW() - INTERVAL '2 days' ) AS growth WHERE yesterday_size IS NOT NULL; - 正常范围:根据业务增长情况而定
表和索引存储指标
表大小
表数据大小:表中数据的大小
- 监控方法:查询pg_table_size函数
- 示例:sql
-- 查看表数据大小 SELECT schemaname, tablename, pg_size_pretty(pg_table_size(schemaname || '.' || tablename)) AS 数据大小 FROM pg_tables ORDER BY pg_table_size(schemaname || '.' || tablename) DESC; - 正常范围:根据表的数据量而定
表索引大小:表中索引的大小
- 监控方法:查询pg_indexes_size函数
- 示例:sql
-- 查看表索引大小 SELECT schemaname, tablename, pg_size_pretty(pg_indexes_size(schemaname || '.' || tablename)) AS 索引大小 FROM pg_tables ORDER BY pg_indexes_size(schemaname || '.' || tablename) DESC; - 正常范围:通常应小于表数据大小的2倍
表总大小:表数据和索引的总大小
- 监控方法:查询pg_total_relation_size函数
- 示例:sql
-- 查看表总大小 SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS 总大小 FROM pg_tables ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC; - 正常范围:根据表的数据量和索引情况而定
大表识别
- 大表定义:通常指大小超过100GB的表
- 监控方法:查询pg_total_relation_size函数
- 示例:sql
-- 识别大表(大小超过100GB) SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS 大小 FROM pg_tables WHERE pg_total_relation_size(schemaname || '.' || tablename) > 100 * 1024 * 1024 * 1024 ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC; - 优化建议:考虑对大表进行分区或归档
索引使用率
- 索引扫描次数:索引被扫描的次数
- 监控方法:查询pg_stat_user_indexes视图
- 示例:sql
-- 查看索引扫描次数 SELECT schemaname, tablename, indexname, idx_scan FROM pg_stat_user_indexes ORDER BY idx_scan DESC; - 优化建议:移除扫描次数为0的索引
WAL日志存储指标
WAL日志大小
WAL日志目录大小:WAL日志目录的总大小
- 监控方法:使用操作系统工具(du命令)
- 示例:bash
# 查看WAL日志目录大小 du -sh /data/gaussdb/pg_wal - 正常范围:根据wal_keep_segments参数和WAL生成速率而定
WAL日志文件大小:单个WAL日志文件的大小
- 监控方法:使用操作系统工具(ls命令)
- 示例:bash
# 查看WAL日志文件大小 ls -lh /data/gaussdb/pg_wal/000000010000000000000001 - 正常大小:通常为16MB
WAL生成速率
WAL每小时生成量:每小时生成的WAL日志量
- 监控方法:定期检查WAL日志目录大小
- 示例:bash
# 计算WAL每小时生成量 wal_size=$(du -s /data/gaussdb/pg_wal | awk '{print $1}') # 与之前记录的大小比较 - 正常范围:根据数据库写入负载而定
WAL归档速率:每小时归档的WAL日志量
- 监控方法:检查归档目录大小或使用pg_stat_archiver视图
- 示例:sql
-- 查看WAL归档统计 SELECT * FROM pg_stat_archiver; - 正常范围:与WAL生成速率匹配
存储性能优化
存储设备优化
使用高性能存储:
- 对于频繁访问的数据,使用SSD或NVMe存储
- 示例:bash
# 将表空间迁移到SSD CREATE TABLESPACE high_perf_tbs LOCATION '/ssd/gaussdb/data'; ALTER TABLE important_table SET TABLESPACE high_perf_tbs;
存储分层:
- 热数据:存储在高性能存储上
- 温数据:存储在普通存储上
- 冷数据:存储在归档存储上
表空间优化
合理规划表空间:
- 将不同类型的数据存储在不同的表空间
- 示例:sql
-- 创建不同类型的表空间 CREATE TABLESPACE data_tbs LOCATION '/data/gaussdb/data'; CREATE TABLESPACE index_tbs LOCATION '/data/gaussdb/index'; CREATE TABLESPACE log_tbs LOCATION '/data/gaussdb/log';
定期清理表空间:
- 删除不再使用的表和索引
- 示例:sql
-- 删除不再使用的表 DROP TABLE unused_table; -- 删除不再使用的索引 DROP INDEX unused_index;
表优化
使用表压缩:
- 对于大表,启用表压缩
- 示例:sql
-- 创建压缩表 CREATE TABLE compressed_table ( id serial primary key, data text ) WITH (compression = on); -- 压缩现有表 ALTER TABLE large_table SET (compression = on); VACUUM FULL large_table;
表分区:
- 对大表进行分区,提高查询性能和管理效率
- 示例:sql
-- 创建分区表 CREATE TABLE partitioned_table ( id serial primary key, data_date date ) PARTITION BY RANGE (data_date); -- 创建分区 CREATE TABLE partitioned_table_2023 PARTITION OF partitioned_table FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
常见问题(FAQ)
Q1: 如何监控GaussDB的存储使用情况?
A1: 监控GaussDB存储使用情况的方法:
- 使用操作系统工具(df, du, iostat)监控磁盘使用和IO性能
- 使用SQL查询pg_tablespace, pg_class等系统视图
- 使用监控系统(Prometheus + Grafana, Zabbix)收集和展示存储指标
- 配置存储使用告警,及时发现存储不足问题
Q2: 如何优化GaussDB的存储性能?
A2: 优化GaussDB存储性能的方法:
- 使用高性能存储设备(SSD, NVMe)
- 合理规划表空间和存储布局
- 启用表压缩
- 对大表进行分区
- 优化索引设计,移除不使用的索引
- 调整WAL相关参数,优化WAL写入性能
Q3: 如何处理存储不足问题?
A3: 处理存储不足问题的方法:
- 清理不再使用的数据和日志
- 扩展存储设备容量
- 将数据迁移到更大的存储设备
- 对大表进行分区或归档
- 启用表压缩,减少存储空间占用
Q4: 如何识别大表和无用索引?
A4: 识别大表和无用索引的方法:
- 使用pg_total_relation_size函数识别大表
- 使用pg_stat_user_indexes视图识别扫描次数为0的索引
- 定期分析表和索引使用情况
- 使用gs_check工具检查表和索引状态
Q5: 如何监控WAL日志使用情况?
A5: 监控WAL日志使用情况的方法:
- 监控WAL日志目录大小
- 监控WAL生成速率
- 监控pg_stat_archiver视图
- 配置WAL相关告警
- 定期检查WAL归档情况
