我正在使用 aws rds Postgres 9.4。我面临 CPU 利用率过高的问题。实例类型是 t2.xlarge (16 gb 内存)。
我一直看到内存使用率非常低,即可用14gb,可用15gb。
但相比之下,CPU 利用率是 100%,有 100 个活动连接。
我已经检查了 pg_stat_activity 和慢查询日志中的所有查询。没有发现任何问题。尽管 CPU 利用率达到 100%,并且我的应用程序即使在活动连接很少的情况下也无法运行。
在如此高的 RAM 条件下,有什么解决方案可以降低高 CPU 利用率?
当 CPU 达到 100% 时,我的写入 IOPS 为 400 次/秒,读取 IOPS 为 8.5 次/秒。
当我的网站流量非常大时,有时我需要处理 300 个并发连接。rds 实例的空闲配置应该是什么?
答案1
有一次我遇到了 AWS RDS 实例的问题,即使将其从 t2.medium 更改为 m3.xlarge,CPU 利用率仍达到 100%。问题出在有些查询卡住了,并持续运行了几个小时,导致 CPU 繁忙。通过控制台触发相同的查询时,输出需要 4-5 秒,这也太长了。虽然从控制台尝试相同的查询可以成功执行,但有时会卡住并持续运行数小时。
以下是我尝试找到问题根源的调试方法
观察系统因素:
PostgreSQL 的一组全面的系统性能指标主要包括:
磁盘空间:您必须为 Postgres 数据分区提供 10% 的磁盘空间,因为在高写入负载下,Postgres 清理过程中磁盘空间可能会发生波动。
CPU使用率 :高 CPU 使用率会降低系统性能,因为它还会显示优化不佳的查询,从而占用大量 CPU 时间。CPU 受限是 Postgres 的最佳情况。
I/O 使用情况 :如果你的 Postgres 运行缓慢,首先测量 IO 等待的 CPU 百分比,该百分比指示机器等待磁盘的时间
**Watch Postgres Factors**
1. 连接总数
max_connections 确定数据库服务器的最大并发事务数,并提供泄漏数据库连接的客户端列表。
命令:
从 pg_stat_activity 中选择 count(*);
2. 各州连接数
连接的四种可能状态为:(a)活动 - 连接当前正在执行事务的查询。
(b)空闲 - 连接未执行事务。(c)事务中空闲 - 连接处于长时间运行的事务中,即未执行查询。(d)事务中空闲(中止) - 由于错误,事务尚未回滚的情况下的连接。
命令:
从 pg_stat_activity GROUP BY 状态中选择状态、计数(*);
3. 等待锁的连接
等待锁的阻塞连接表示具有独占锁的事务执行缓慢。
命令:
从 pg_locks 中选择 count(distinct pid),其中授权=false
4. 最大交易年龄
事务应尽可能短,以便在不到一分钟的时间内执行。长时间运行的事务会阻止 Postgres 清除旧数据,它可能会由于事务 ID (xid) 回绕而关闭数据库。如果输出超过一小时,那么这是一个值得担心的问题,因为查询自该持续时间以来一直在运行,使资源保持繁忙。根据数据库查询的平均响应时间,将连接的最大年龄参数(在应用程序代码中)更改为尽可能低的值,例如 2-3 秒。
命令:
从 pg_stat_activity 中选择 max(now() -xact_start),其中状态为('事务中空闲','活动');
5.检查点间隔
频繁的检查点会导致性能下降。Postgres 将在其日志中显示这些检查点。此外,您还可以在 pg_stat_bgwriter 表中检查频率。
6.查询执行时间
您必须在应用程序级别进行测量。或者,通过定期设置和分析日志查询 log_min_duration_statement=0 或通过监控 pg_stat_statements 模块