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


10

我看到的奇怪且极其缓慢的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

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

要查询的表仅包含几个varchar列,其中之一是last_name,该索引已建立索引(实际上lower(last_name)已建立索引)。查询本身很简单:

SELECT * FROM consumer_m WHERE lower(last_name) = 'hoque';

这是说明输出:

                                           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)

另请注意,数据库位于auto_vacuum上,因此未执行明确的清理/分析。


您是否自定义了postgresql.conf?如果CentOS的默认设置与RHEL 5.x相同,则Postgres的内存将很少,这可能会导致大量的磁盘IO。该表上的行有多大?
Thiago Figueiro 2010年

该表可以装入内存,索引也可以装入。它是按这种方式划分的。并且postgresql.conf已被适当地定制(shared_buffers,effective_cache_size等)。即使不是这种情况,我也不会期望性能下降。
ehsanul

Answers:


5

设备的事实/dev/xvdb1表明您正在Xen下运行。如何配置您的存储?是否有潜在的设备争,以及如何做iostat上看

除非您能尽可能消除这种情况,否则我将指出糟糕的性能归咎于旋转陀螺。

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


没有争用。尽管您说的对,这是一台虚拟服务器,但硬盘完全专用于该服务器,并且我一次只运行一个数据库查询,而没有其他密集的服务器操作。存储只是一个旋转的SATA磁盘。请注意,我还有其他几个(单独的)服务器/数据库,它们的设置几乎相同,但是在给定相似的查询/索引的情况下,它们可以在低IO的情况下快速运行。
ehsanul

您可以iostat在dom0的磁盘上运行,只是看图片是否相似吗?您是否可以从两个级别上进行其他一些基本的磁盘基准测试?这至少有助于缩小下一步的范围。
mattdm 2010年

当然。为什么会期望iostat从何处得出差异?应该重要吗?我现在实际上没有直接访问dom0的权限,尽管可以获取。同时,我将尝试fio进行基准测试。
ehsanul

3
一方面:快照可能会导致这种情况
Hubert Kario 2010年

3
您是对的mattdm,出现了争用,出现在dom0上。这是一个沟通问题,我的老板在我不知情的情况下,将一部分硬盘交给了别人管理下的另一台服务器。我觉得它是专用的,因为这就是我们始终设置它的方式。我想这就是为什么仔细检查您的假设总是很重要的原因。谢谢!
ehsanul 2010年

1

以下是一些建议,或多或少是随机的:

  1. 默认情况下,CentOS中不启用自动真空。您必须设置多个设置才能启用它。仔细检查,以便真空程序真正运行。容易错过所需的设置之一。

  2. 请注意,您必须为该查询执行第二个过滤步骤,根据返回的内容,该步骤可能会很昂贵。我会考虑一个索引,例如:

    CREATE INDEX Consumer_m_lower_last ON Consumer_m(lower(last_name));

    它将与您的查询匹配并删除重新检查。

  3. 而且,正如mattdm指出的那样,您不能在虚拟化环境中信任iostat。

  4. 如果您在XEN环境中遇到IO问题,则可能应该检查http://lonesysadmin.net/2008/02/21/elevatornoop/。电梯设置可能会产生影响,但影响并不大。

  5. 基础磁盘是否使用LVM快照?尽管从管理角度来看这非常有用,但它可能会破坏IO性能。如果您使用的块设备是快照,以及已经为该块设备拍摄了快照,则都是如此。


感谢您的建议。索引实际上位于lower(last_name)上,即使我从索引名称中省略了“ lower”。所以我不知道为什么要进行重新检查。/实际上,安装在其上的磁盘使用的是LVM快照,而不是存储数据库的快照。所以我认为不是这样。不过,我会调查您的其他建议!
ehsanul 2010年

1

我怀疑这是PostgreSQL的问题,很可能只是磁盘IO的问题。正如另一个答案中提到的那样,如果这是磁盘IO问题,那么您实际上应该从Dom0进行测量,以便获得所有正在发生的情况的图片。

不久前,我遇到了一个非常类似的问题,事实证明这是磁盘控制器的问题。磁盘访问速度非常慢,导致系统在等待磁盘IO时遇到瓶颈(这显示出很高的平均负载和等待时间,而且还导致等待磁盘的进程比其他方式消耗更多的CPU。事实证明,内核无法正确识别控制器,而是退回到旧式的IDE控制器上,而不是快速安装的控制器。

解决方法是使用

hda=noprobe hda=none 

在/etc/grub.conf中内核字符串的末尾。(当然,添加您拥有的所有磁盘,ala:hdc=noprobe, hdc=none, hdd=...)


谢谢,但事实证明,在这种情况下,它要愚蠢得多。无论如何都要投票。
ehsanul
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.