Skip to content

PostgreSQL 系统层面指标

PostgreSQL 系统层面指标是数据库监控的重要组成部分,包括 CPU 使用率、内存使用、磁盘 I/O、网络等指标。这些指标直接影响数据库的性能和稳定性,需要重点监控。

系统层面指标类型

1. CPU 指标

  • 总体 CPU 使用率:系统总的 CPU 使用率
  • 用户态 CPU 使用率:应用程序使用的 CPU 百分比
  • 系统态 CPU 使用率:操作系统内核使用的 CPU 百分比
  • IO 等待时间:CPU 等待 I/O 操作完成的时间百分比
  • 空闲 CPU 百分比:CPU 空闲时间百分比

2. 内存指标

  • 总内存:系统的物理内存总量
  • 已使用内存:当前已使用的内存量
  • 可用内存:当前可用的内存量
  • 缓存/缓冲区内存:用于文件系统缓存和缓冲区的内存量
  • Swap 使用率:交换分区的使用率
  • Swap 交换速率:Swap 分区的读写速率

3. 磁盘 I/O 指标

  • 磁盘使用率:磁盘分区的使用率
  • 读写速率:磁盘的读/写数据速率
  • IOPS:每秒 I/O 操作数
  • 平均 I/O 延迟:I/O 操作的平均延迟时间
  • I/O 队列长度:等待处理的 I/O 请求队列长度
  • 磁盘繁忙率:磁盘处于活动状态的时间百分比

4. 网络指标

  • 网络吞吐量:网络接口的总数据传输量
  • 网络使用率:网络接口的使用率
  • TCP 连接数:当前活跃的 TCP 连接数
  • 丢包率:网络数据包丢失的百分比
  • 网络延迟:网络数据包的往返延迟时间

指标收集方法

1. 系统命令

使用系统内置命令收集系统层面指标。

bash
# 1. CPU 指标收集
# mpstat - 显示每个 CPU 的使用情况
mpstat 1 5

# top - 实时显示系统资源使用情况
top -bn1

# sar - 系统活动报告
sar -u 1 5

# 2. 内存指标收集
# free - 显示内存使用情况
free -h

# vmstat - 虚拟内存统计
vmstat 1 5

# 3. 磁盘 I/O 指标收集
# iostat - 输入/输出统计
iostat -xdk 1 5

# sar - 磁盘活动报告
sar -d 1 5

# 4. 网络指标收集
# netstat - 网络连接统计
netstat -an | grep ESTABLISHED | wc -l

# ss -  socket 统计
ss -s

# sar - 网络活动报告
sar -n DEV 1 5

# ping - 网络延迟测试
ping -c 10 localhost

2. 监控工具

使用专业监控工具收集和分析系统层面指标。

Prometheus + Node Exporter

yaml
# 1. Node Exporter 配置
# 下载并安装 Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.5.0.linux-amd64.tar.gz
cd node_exporter-1.5.0.linux-amd64
./node_exporter

# 2. Prometheus 配置
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
    scrape_interval: 15s

Zabbix

bash
# 1. 安装 Zabbix Agent
yum install zabbix-agent -y

# 2. 配置 Zabbix Agent
cat > /etc/zabbix/zabbix_agentd.conf << EOF
Server=zabbix-server-ip
ServerActive=zabbix-server-ip
Hostname=db1
EOF

# 3. 启动 Zabbix Agent
systemctl start zabbix-agent
systemctl enable zabbix-agent

3. 自定义脚本

使用自定义脚本收集系统层面指标。

bash
#!/bin/bash
# 系统指标收集脚本

# CPU 使用率
echo "=== CPU Usage ==="
mpstat | tail -n 1

# 内存使用
echo -e "\n=== Memory Usage ==="
free -h

# 磁盘 I/O
echo -e "\n=== Disk I/O ==="
iostat -xdk 1 1

# 网络统计
echo -e "\n=== Network Stats ==="
ss -s

关键指标监控

1. CPU 监控

sql
-- 1. 查看 PostgreSQL 进程的 CPU 使用情况
top -p $(pgrep -d ',' postgres)

-- 2. 监控 CPU 使用率的告警设置
-- 当 CPU 使用率持续 5 分钟超过 80% 时触发告警
-- Prometheus 告警规则示例
ALERT HighCPUUsage
  IF (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
  FOR 5m
  LABELS { severity="warning" }
  ANNOTATIONS {
    summary = "High CPU usage on {{ $labels.instance }}",
    description = "CPU usage is {{ $value }}% for 5 minutes"
  }

2. 内存监控

sql
-- 1. 查看 PostgreSQL 进程的内存使用情况
ps aux --sort=-%mem | grep postgres | head -10

-- 2. 监控内存使用率的告警设置
-- 当可用内存低于 10% 时触发告警
-- Prometheus 告警规则示例
ALERT LowMemory
  IF ((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100) < 10
  FOR 5m
  LABELS { severity="warning" }
  ANNOTATIONS {
    summary = "Low memory on {{ $labels.instance }}",
    description = "Available memory is {{ $value }}% of total memory"
  }

3. 磁盘 I/O 监控

sql
-- 1. 查看 PostgreSQL 数据目录所在磁盘的 I/O 情况
df -h | grep /var/lib/pgsql
iostat -xdk 1 5 $(df -h | grep /var/lib/pgsql | awk '{print $1}')

-- 2. 监控磁盘 I/O 延迟的告警设置
-- 当磁盘平均 I/O 延迟超过 50ms 时触发告警
-- Prometheus 告警规则示例
ALERT HighDiskLatency
  IF avg by(instance, device) (irate(node_disk_read_time_seconds_total[5m]) / irate(node_disk_reads_completed_total[5m])) * 1000 > 50
  FOR 5m
  LABELS { severity="warning" }
  ANNOTATIONS {
    summary = "High disk latency on {{ $labels.instance }} {{ $labels.device }}",
    description = "Average disk read latency is {{ $value }} ms"
  }

4. 网络监控

sql
-- 1. 查看 PostgreSQL 端口的连接情况
netstat -an | grep 5432 | wc -l

-- 2. 监控网络连接数的告警设置
-- 当 TCP 连接数超过 1000 时触发告警
-- Prometheus 告警规则示例
ALERT HighTCPConnections
  IF node_netstat_Tcp_CurrEstab > 1000
  FOR 5m
  LABELS { severity="warning" }
  ANNOTATIONS {
    summary = "High TCP connections on {{ $labels.instance }}",
    description = "Current TCP connections: {{ $value }}"
  }

最佳实践

1. 生产环境监控建议

  • 设置合理的告警阈值:根据系统配置和业务负载设置合适的告警阈值
  • 配置多级别告警:根据问题严重程度设置不同级别的告警(如警告、严重、紧急)
  • 定期分析监控数据:定期分析历史监控数据,识别性能趋势和潜在问题
  • 监控关键路径:重点监控 PostgreSQL 数据目录所在的磁盘、CPU 和内存
  • 设置基线:建立系统正常运行时的指标基线,便于识别异常情况

2. 性能优化建议

bash
# 1. CPU 优化
# 调整进程优先级
renice -n -5 $(pgrep postgres)

# 关闭不必要的服务
systemctl stop unused-service
systemctl disable unused-service

# 2. 内存优化
# 调整操作系统内存参数
echo 1 > /proc/sys/vm/drop_caches

# 调整 PostgreSQL 内存配置
ALTER SYSTEM SET shared_buffers = '2GB';
ALTER SYSTEM SET work_mem = '16MB';
ALTER SYSTEM SET maintenance_work_mem = '256MB';

# 3. 磁盘 I/O 优化
# 使用 SSD 存储
# 配置合适的 RAID 级别
# 优化文件系统挂载选项
mount -o noatime,nodiratime /dev/sdb1 /var/lib/pgsql

# 调整磁盘调度算法
echo deadline > /sys/block/sdb/queue/scheduler

# 4. 网络优化
# 调整 TCP 连接参数
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 5000 > /proc/sys/net/ipv4/tcp_max_syn_backlog

3. 监控工具选择

工具名称适用场景优点缺点
Prometheus + Node Exporter大规模分布式环境开源、灵活、强大的查询语言需要手动配置告警规则
Zabbix企业级监控全面的监控功能、丰富的插件配置复杂、资源消耗大
Nagios简单监控场景轻量级、插件丰富缺乏现代化的可视化界面
Datadog云原生环境易于部署、强大的分析功能商业化产品,成本高
New Relic应用性能监控与应用深度集成、易于使用专注于应用监控,系统监控功能相对简单

常见问题处理

1. CPU 使用率过高

问题:系统 CPU 使用率持续过高,影响数据库性能

解决方法

  • 检查是否有其他进程占用大量 CPU 资源
  • 优化 PostgreSQL 查询,减少 CPU 密集型查询
  • 增加 CPU 资源,升级硬件或扩展服务器
  • 调整 PostgreSQL 配置,如降低 autovacuum 频率

2. 内存不足

问题:系统内存不足,导致频繁使用 swap 分区

解决方法

  • 检查内存使用情况,关闭不必要的服务
  • 调整 PostgreSQL 内存配置,如减少 shared_buffers
  • 增加系统内存,升级硬件
  • 优化应用程序,减少内存使用

3. 磁盘 I/O 瓶颈

问题:磁盘 I/O 延迟过高,导致数据库响应缓慢

解决方法

  • 使用 SSD 存储,提高 I/O 性能
  • 优化查询,减少磁盘 I/O 操作
  • 调整 PostgreSQL 配置,如优化 checkpoint 配置
  • 考虑使用 RAID 10 提高磁盘 I/O 性能
  • 清理磁盘空间,确保有足够的可用空间

4. 网络连接问题

问题:网络连接数过多或网络延迟过高

解决方法

  • 检查是否有网络攻击或异常连接
  • 调整 PostgreSQL 的 max_connections 配置
  • 优化应用程序,减少不必要的连接
  • 检查网络设备,确保网络稳定

常见问题(FAQ)

Q1:如何确定系统层面指标的正常范围?

A1:系统层面指标的正常范围取决于系统配置和业务负载,需要:

  • 建立系统基线:在系统正常运行时收集指标数据,建立基线
  • 参考行业标准:如 CPU 使用率一般应低于 80%,内存使用率应低于 85%
  • 根据业务需求调整:不同业务对系统资源的要求不同

Q2:如何监控 PostgreSQL 进程的资源使用情况?

A2:可以使用以下方法:

  • 使用 tophtop 命令实时查看 PostgreSQL 进程的资源使用
  • 使用 ps 命令查看进程的 CPU 和内存使用情况
  • 使用 pmap 命令查看进程的内存映射
  • 使用专业监控工具如 Prometheus + Node Exporter 进行长期监控

Q3:如何优化系统层面的性能?

A3:系统层面性能优化可以从以下几个方面入手:

  • CPU:优化查询、增加 CPU 资源、调整进程优先级
  • 内存:调整内存配置、优化应用程序、增加物理内存
  • 磁盘 I/O:使用 SSD、优化查询、调整 PostgreSQL 配置
  • 网络:优化网络配置、减少不必要的连接、检查网络设备

Q4:如何配置系统层面指标的告警?

A4:配置系统层面指标告警需要:

  • 选择合适的监控工具,如 Prometheus、Zabbix 等
  • 根据系统基线和业务需求设置合理的告警阈值
  • 配置告警通知方式,如邮件、短信、钉钉、Slack 等
  • 建立告警响应流程,确保及时处理告警

Q5:如何分析系统层面指标的异常情况?

A5:分析系统层面指标异常可以采取以下步骤:

  • 对比当前指标与历史基线,识别异常变化
  • 关联多个指标,分析异常的根本原因
  • 检查系统日志和 PostgreSQL 日志,查找相关错误信息
  • 进行根因分析,确定问题的根本原因
  • 实施解决方案并验证效果

Q6:Node Exporter 和其他监控代理有什么区别?

A6:主要区别如下:

  • Node Exporter:专为 Prometheus 设计,轻量级,支持丰富的系统指标
  • Zabbix Agent:功能全面,但资源消耗较大,配置复杂
  • Nagios Plugins:插件丰富,但缺乏统一的代理
  • Datadog Agent:易于部署,与 Datadog 云服务深度集成

Q7:如何监控多个 PostgreSQL 实例的系统指标?

A7:可以使用以下方法:

  • 使用分布式监控系统,如 Prometheus + Node Exporter + Grafana
  • 在每个 PostgreSQL 实例上部署监控代理
  • 集中管理和可视化所有实例的监控数据
  • 配置统一的告警规则和通知方式

Q8:如何确保系统层面监控的可靠性?

A8:确保系统层面监控可靠性可以采取以下措施:

  • 监控系统本身的资源使用情况
  • 配置监控系统的高可用性
  • 定期备份监控数据
  • 测试告警机制,确保能及时收到告警
  • 定期检查监控配置,确保监控指标的准确性