外观
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 localhost2. 监控工具
使用专业监控工具收集和分析系统层面指标。
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: 15sZabbix
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-agent3. 自定义脚本
使用自定义脚本收集系统层面指标。
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_backlog3. 监控工具选择
| 工具名称 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 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:可以使用以下方法:
- 使用
top或htop命令实时查看 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:确保系统层面监控可靠性可以采取以下措施:
- 监控系统本身的资源使用情况
- 配置监控系统的高可用性
- 定期备份监控数据
- 测试告警机制,确保能及时收到告警
- 定期检查监控配置,确保监控指标的准确性
