【发布时间】:2015-06-09 18:02:45
【问题描述】:
我遇到了一个非常奇怪的PostgreSQL 9.4 行为。当它在一张大桌子上运行UPDATE,或对一张大桌子执行VACUUM 或CLUSTER 时,它似乎会挂起很长时间。事实上,我只是在第二天结束了这个过程。奇怪的是 CPU 处于空闲状态,同时磁盘活动处于 100%但它只报告 4-5 MB/秒的读取和写入(参见 nmap 和 @ 的屏幕截图987654328@).
我的服务器是 24CPU、32GB RAM 和 RAID1 (2 SAS 15K x 2)。通常,当磁盘利用率为 100% 时,它可以提供 120-160 MB/s 的组合读/写,这几乎可以无限期地保持在 >100MB/秒的持续 IO。
系统变得非常缓慢甚至终端命令行。我猜它与共享内存和虚拟内存有关。发生这种情况时,PostgreSQL 会消耗配置的最大共享内存。
我已禁用交换 vm.swappiness=0。我没有玩过vm.dirty_ratio、vm.dirty_background_ratio 等。系统大页面被禁用vm.nr_hugepages=0。
以下是我的postgresql.conf 设置:
shared_buffers = 8200MB
temp_buffers = 12MB
work_mem = 32MB
maintenance_work_mem = 128MB
#-----------------------------------------------------
synchronous_commit = off
wal_sync_method = fdatasync
checkpoint_segments = 32
checkpoint_completion_target = 0.9
#-----------------------------------------------------
random_page_cost = 3.2 # RAIDed disk
effective_cache_size = 20000MB # 32GB RAM
geqo_effort = 10
#-----------------------------------------------------
autovacuum_max_workers = 4
autovacuum_naptime = 45s
autovacuum_vacuum_scale_factor = 0.16
autovacuum_analyze_scale_factor = 0.08
磁盘速度只有 5MB/秒,怎么能达到 100%?即使是最费力的随机读/写例程也应该快一个数量级。它一定与 PostgreSQL 处理映射/共享内存的方式有关。 postgres 9.1 也没有发生这种情况。
我正在尝试自学磁盘/内存行为,但此时我需要专业人士的帮助。
【问题讨论】:
-
我们有一个similar problem
perf top告诉你什么? (请注意,由 Vacuumd 完成的随机 I/O 可能比顺序 I/O 慢几个数量级。将 1 字节写入 1000 个文件意味着 100% 的磁盘使用率和非常低的传输率。)
标签: linux postgresql ubuntu ubuntu-14.04 postgresql-9.4