shared_buffers:用于缓存表和索引数据的内存区域,是PostgreSQL内存优化的关键参数。建议设置为系统物理内存的25%-40%(如8GB内存可设为2-3.2GB),避免过大导致系统内存不足或过小无法有效缓存。
work_mem:每个查询操作(如排序、哈希表)使用的最大内存量。需根据查询复杂度和并发量调整,建议设置为16-256MB(如简单查询设为32MB,复杂分析查询设为64MB)。过大会导致内存溢出,过小会增加磁盘I/O。
maintenance_work_mem:执行维护操作(如VACUUM、CREATE INDEX、ALTER TABLE)的内存大小。建议设置为512MB-数GB(如1GB),提升维护操作效率,减少对正常查询的影响。
effective_cache_size:PostgreSQL预估操作系统文件系统缓存的大小,用于优化查询计划(如判断是否使用索引)。建议设置为系统物理内存的50%-75%(如8GB内存可设为4-6GB),帮助优化器做出更优决策。
限制max_connections:默认值(通常100)过高易导致内存耗尽(每个连接约消耗10MB内存)。建议根据内存调整(如8GB内存可设为50-100),并通过连接池(如PgBouncer、Pgpool-II)复用连接,降低实际连接数。例如,PgBouncer的default_pool_size=50可支撑2000+应用线程,TPS提升4倍。
清理闲置连接:使用pg_stat_activity视图查看闲置连接(state='idle'),通过SELECT pg_terminate_backend(pid)终止非关键闲置连接,释放内存。
设置连接超时:通过idle_in_transaction_session_timeout参数自动终止空闲事务(如设为10分钟),避免长时间占用连接资源。
VACUUM操作:回收已删除或更新行的死元组空间,避免表膨胀。建议开启autovacuum(默认开启),并根据负载调整参数(如autovacuum_vacuum_cost_limit=200、autovacuum_naptime=1min),定期清理高频更新的表。
ANALYZE操作:更新表统计信息,帮助查询优化器制定更优计划。autovacuum会自动触发,也可手动执行ANALYZE table_name,确保统计信息准确。
重建索引:定期重建碎片化索引(如使用REINDEX TABLE table_name或REINDEX INDEX index_name),提升查询性能,减少索引扫描的资源消耗。
使用EXPLAIN分析查询:通过EXPLAIN或EXPLAIN ANALYZE查看查询计划,识别全表扫描、排序、哈希操作等性能瓶颈(如未使用索引的全表扫描),针对性优化。
优化SQL语句:避免SELECT *(只查询必要列)、减少子查询和复杂JOIN(如拆分为多个简单查询)、使用分页(LIMIT/OFFSET)处理大数据量查询,降低内存占用。
创建合适索引:为高频查询条件(如WHERE、JOIN、ORDER BY子句)的列创建索引(如B-Tree索引用于等值查询、GIN索引用于全文搜索),提升查询速度,减少全表扫描的内存消耗。
使用SSD存储:SSD的随机读写速度远快于HDD,可显著减少数据访问延迟,降低磁盘I/O对内存的压力(如将数据目录放在SSD上)。
调整内核参数:
vm.swappiness(如设为10-20),减少系统内存换页频率,避免频繁磁盘I/O;vm.overcommit_memory=2,防止PostgreSQL因内存超额申请而崩溃;vm.dirty_background_ratio(如设为5)和vm.dirty_ratio(如设为10),优化后台写操作,减少磁盘I/O峰值。内置工具:通过pg_stat_activity查看当前活动连接和查询,pg_stat_statements捕捉慢查询(需开启track_activities=on、track_statements=on),pg_stat_bgwriter监控后台写操作(如检查点、WAL写入)。
第三方工具:使用pgAdmin(图形化监控)、pgBadger(日志分析)、Prometheus+Grafana(实时监控)等工具,持续跟踪内存、CPU、磁盘I/O等资源占用,及时发现并解决问题。