Skip to content

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存储使用情况的方法:

  1. 使用操作系统工具(df, du, iostat)监控磁盘使用和IO性能
  2. 使用SQL查询pg_tablespace, pg_class等系统视图
  3. 使用监控系统(Prometheus + Grafana, Zabbix)收集和展示存储指标
  4. 配置存储使用告警,及时发现存储不足问题

Q2: 如何优化GaussDB的存储性能?

A2: 优化GaussDB存储性能的方法:

  1. 使用高性能存储设备(SSD, NVMe)
  2. 合理规划表空间和存储布局
  3. 启用表压缩
  4. 对大表进行分区
  5. 优化索引设计,移除不使用的索引
  6. 调整WAL相关参数,优化WAL写入性能

Q3: 如何处理存储不足问题?

A3: 处理存储不足问题的方法:

  1. 清理不再使用的数据和日志
  2. 扩展存储设备容量
  3. 将数据迁移到更大的存储设备
  4. 对大表进行分区或归档
  5. 启用表压缩,减少存储空间占用

Q4: 如何识别大表和无用索引?

A4: 识别大表和无用索引的方法:

  1. 使用pg_total_relation_size函数识别大表
  2. 使用pg_stat_user_indexes视图识别扫描次数为0的索引
  3. 定期分析表和索引使用情况
  4. 使用gs_check工具检查表和索引状态

Q5: 如何监控WAL日志使用情况?

A5: 监控WAL日志使用情况的方法:

  1. 监控WAL日志目录大小
  2. 监控WAL生成速率
  3. 监控pg_stat_archiver视图
  4. 配置WAL相关告警
  5. 定期检查WAL归档情况