Centos 5.5 上使用简单 PostgreSQL 8.4.4 查询的 IO 速度极慢

ehs*_*nul 10 postgresql performance hard-drive iostat

我看到的奇怪且极其缓慢的 IO 模式是这样的(输出iostat -dxk 1 /dev/xvdb1):

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.99  0.99     7.92     3.96    12.00     1.96 2206.00 502.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.99  0.00     3.96     0.00     8.00     0.99 2220.00 1004.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.99  0.99  0.00     7.92     0.00    16.00     1.14 2148.00 1004.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     2.01    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  1.00  1.00     4.00     8.00    12.00     2.01 1874.00 502.00 100.40
Run Code Online (Sandbox Code Playgroud)

我不知道为什么磁盘利用率和等待这么高,读/写率这么低。这可能是什么原因?

被查询的表只有几个varchar列,其中之一是last_name,它是被索引的(实际上lower(last_name)是被索引的)。查询本身很简单:

SELECT * FROM consumer_m WHERE lower(last_name) = 'hoque';
Run Code Online (Sandbox Code Playgroud)

这是解释输出:

                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on consumer_m  (cost=2243.90..274163.41 rows=113152 width=164)
   Recheck Cond: (lower((last_name)::text) = 'hoque'::text)
   ->  Bitmap Index Scan on consumer_m_last_name_index  (cost=0.00..2215.61 rows=113152 width=0)
         Index Cond: (lower((last_name)::text) = 'hoque'::text)
Run Code Online (Sandbox Code Playgroud)

另请注意,数据库位于 auto_vacuum 上,因此未执行显式真空/分析。

mat*_*tdm 5

事实上,您的设备/dev/xvdb1意味着您正在 Xen 下运行。你的存储是如何配置的?是否存在对底层设备的争用,以及如何iostat看待

除非你能尽可能地消除这种情况,否则我将指出糟糕的表现归咎于旋转的旋转器。

基本上,解决此类性能问题的总体方法是考虑可能出现瓶颈的所有层,然后设计测试以消除每一层,直到隔离问题为止。

  • 一方面:快照可以创建这样的情况 (3认同)
  • 你是对的 mattdm,有争用,出现在 dom0 上。是通讯问题,我的老板在我不知情的情况下,将部分硬盘交给了其他人管理的另一台服务器。我的印象是它是专注的,因为我们总是这样设置它。我想这就是为什么仔细检查你的假设总是很重要的。谢谢! (3认同)