我有硬件或软件问题吗?

时间:2012-12-10 23:05:11

标签: performance postgresql ubuntu hardware

间距

我之前发布了有关更新查询的性能问题的问题http://archives.postgresql.org/pgsql-performance/2012-11/msg00289.php。 问题演变成关于我的设置的更一般的讨论,以及我遇到的大量I / O等待。从那时起,我对测量事物已经变得更加熟悉,现在我“只是”需要一些经验丰富的眼睛来判断我应该进入哪个方向 - 我是否有硬件问题或软件问题 - 应该采取什么行动?我带?

我的设置

用例:在夜间我们正在进行大量的数据维护,因此数据库的负载与白天非常不同。但是我们希望能够在白天做一些,就像现在这样对数据库来说太“沉重”了。下面显示的统计数据来自其中一个“繁重”的加载时间。

硬件:

  • 32Gb ram
  • 8核Xeon E3-1245处理器
  • 软件RAID1阵列中的两个SEAGATE ST33000650NS驱动器(统计中称为sdc和sdd)(统计中称为md2)
  • 软件RAID1中的两个INTEL SSDSC2CW240A3 SSD驱动器(统计中称为sda和sdb)(统计中称为md3)

软件:Postgres 9.2在64位ubuntu 12.04上运行,内核为3.2

配置:

# postgresql.conf (a shortlist of everything changed from the default)
data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/etc/postgresql/9.2/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
listen_addresses = '192.168.0.2, localhost'
port = 5432
max_connections = 300
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = off
archive_mode = on
archive_command = 'rsync -a %p postgres@192.168.0.4:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '
datestyle = 'iso, mdy'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 1GB
checkpoint_completion_target = 0.9
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 4MB
checkpoint_segments = 100
shared_buffers = 4GB
checkpoint_timeout = 10min

内核已经像这样进行了调整:

vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
kernel.shmmax = 8589934592
kernel.shmall = 17179869184

pg_xlog文件夹已移至SSD阵列(md3),并已符号链接回postgres目录。

统计信息

这些是我在其中一个时期看到的典型观察/统计数据:

1)在顶层这是我在新遗物中看到的: https://rpm.newrelic.com/public/charts/6ewGRle6bmc

2)当像这样加载数据库时,我看到很多查询的谈话时间长达1000倍,就像没有加载数据库时一样。

3)sudo iostat -dmx(典型用法)

Linux 3.2.0-33-generic (master-db)  12/10/2012  _x86_64_    (8 CPU)


Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     6.52    3.59   26.61     0.22     0.74    65.49     0.01    0.40    0.77    0.35   0.14   0.43
sdb               0.00     8.31    0.03   28.38     0.00     0.97    69.63     0.01    0.52    0.27    0.52   0.15   0.43
sdc               1.71    46.01   34.83  116.62     0.56     4.06    62.47     1.90   12.57   21.81    9.81   1.89  28.66
sdd               1.67    46.14   34.89  116.49     0.56     4.06    62.46     1.58   10.43   21.66    7.07   1.89  28.60
md1               0.00     0.00    0.00    0.00     0.00     0.00     2.69     0.00    0.00    0.00    0.00   0.00   0.00
md0               0.00     0.00    0.11    0.24     0.00     0.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
md2               0.00     0.00   72.99  161.95     1.11     4.06    45.10     0.00    0.00    0.00    0.00   0.00   0.00
md3               0.00     0.00    0.05   32.32     0.00     0.74    47.00     0.00    0.00    0.00    0.00   0.00   0.00

4)sudo iotop -oa(跑步约一分钟左右)

TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
292   be/4 root          0.00 B      0.00 B  0.00 % 99.33 % [md2_raid1]
2815  be/4 postgres     19.51 M     25.90 M  0.00 % 45.49 % postgres: autovacuum worker process   production
32553 be/4 postgres     45.74 M      9.38 M  0.00 % 37.89 % postgres: user production 192.168.0.3(58866) UPDATE
32570 be/4 postgres      6.91 M     35.02 M  0.00 % 16.71 % postgres: user production 192.168.0.3(35547) idle
32575 be/4 postgres      4.06 M     43.90 M  0.00 % 16.62 % postgres: user production 192.168.0.3(35561) SELECT
31673 be/4 postgres      4.14 M     52.16 M  0.00 % 16.24 % postgres: user production 192.168.0.3(39112) idle
32566 be/4 postgres      4.73 M     44.95 M  0.00 % 15.66 % postgres: user production 192.168.0.3(35531) idle
32568 be/4 postgres      4.50 M     33.84 M  0.00 % 14.62 % postgres: user production 192.168.0.3(35543) SELECT
32573 be/4 postgres      3.20 M     34.44 M  0.00 % 13.98 % postgres: user production 192.168.0.3(35559) idle
31590 be/4 postgres      3.23 M     29.72 M  0.00 % 13.90 % postgres: user production 192.168.0.3(50690) idle in transaction
32577 be/4 postgres      5.09 M     25.54 M  0.00 % 13.63 % postgres: user production 192.168.0.3(35563) idle
32565 be/4 postgres      2.06 M     35.93 M  0.00 % 13.41 % postgres: user production 192.168.0.3(35529) SELECT
32546 be/4 postgres      4.48 M     36.49 M  0.00 % 13.39 % postgres: user production 192.168.0.3(56927) UPDATE waiting
32569 be/4 postgres      3.50 M     26.75 M  0.00 % 12.82 % postgres: user production 192.168.0.3(35545) INSERT
31671 be/4 postgres      4.58 M     24.45 M  0.00 % 12.76 % postgres: user production 192.168.0.3(34841) idle in transaction
32551 be/4 postgres      3.26 M     31.77 M  0.00 % 12.06 % postgres: user production 192.168.0.3(58864) idle in transaction
32574 be/4 postgres      5.32 M     32.92 M  0.00 % 11.70 % postgres: user production 192.168.0.3(35560) idle
32572 be/4 postgres      3.00 M     32.66 M  0.00 % 11.66 % postgres: user production 192.168.0.3(35558) UPDATE
32560 be/4 postgres      5.12 M     25.89 M  0.00 % 11.52 % postgres: user production 192.168.0.3(33886) SELECT
32567 be/4 postgres      4.66 M     36.47 M  0.00 % 11.44 % postgres: user production 192.168.0.3(35534) SELECT
32571 be/4 postgres      2.86 M     31.27 M  0.00 % 11.31 % postgres: user production 192.168.0.3(35557) SELECT
32552 be/4 postgres      4.38 M     28.75 M  0.00 % 11.09 % postgres: user production 192.168.0.3(58865) idle in transaction
32554 be/4 postgres      3.69 M     30.21 M  0.00 % 10.90 % postgres: user production 192.168.0.3(58870) UPDATE
  339    be/3 root       0.00 B      2.29 M  0.00 %  9.81 % [jbd2/md2-8]
32576 be/4 postgres      3.37 M     19.91 M  0.00 %  9.73 % postgres: user production 192.168.0.3(35562) idle
32555 be/4 postgres      3.09 M     31.96 M  0.00 %  9.02 % postgres: user production 192.168.0.3(58875) SELECT
27548 be/4 postgres      0.00 B     97.12 M  0.00 %  7.41 % postgres: writer process
31445 be/4 postgres    924.00 K     27.35 M  0.00 %  7.11 % postgres: user production 192.168.0.1(34536) idle
31443 be/4 postgres      2.54 M      4.56 M  0.00 %  6.32 % postgres: user production 192.168.0.1(34508) idle
31459 be/4 postgres   1480.00 K     21.36 M  0.00 %  5.63 % postgres: user production 192.168.0.1(34543) idle
 1801 be/4 postgres   1896.00 K     10.89 M  0.00 %  5.57 % postgres: user production 192.168.0.3(34177) idle
32763 be/4 postgres   1696.00 K      6.95 M  0.00 %  5.33 % postgres: user production 192.168.0.3(57984) SELECT
 1800 be/4 postgres      2.46 M      5.13 M  0.00 %  5.24 % postgres: user production 192.168.0.3(34175) SELECT
 1803 be/4 postgres   1816.00 K      9.09 M  0.00 %  5.16 % postgres: user production 192.168.0.3(34206) idle
32578 be/4 postgres      2.57 M     11.62 M  0.00 %  5.06 % postgres: user production 192.168.0.3(35564) SELECT
31440 be/4 postgres      3.02 M      4.04 M  0.00 %  4.65 % postgres: user production 192.168.0.1(34463) idle
32605 be/4 postgres   1844.00 K     11.82 M  0.00 %  4.49 % postgres: user production 192.168.0.3(40399) idle
27547 be/4 postgres      0.00 B      0.00 B  0.00 %  3.93 % postgres: checkpointer process
31356 be/4 postgres   1368.00 K      3.27 M  0.00 %  3.93 % postgres: user production 192.168.0.1(34450) idle
32542 be/4 postgres   1180.00 K      6.05 M  0.00 %  3.90 % postgres: user production 192.168.0.3(56859) idle
32523 be/4 postgres   1088.00 K      4.33 M  0.00 %  3.59 % postgres: user production 192.168.0.3(48164) idle
32606 be/4 postgres   1964.00 K      6.94 M  0.00 %  3.51 % postgres: user production 192.168.0.3(40426) SELECT
31466 be/4 postgres   1596.00 K      3.11 M  0.00 %  3.47 % postgres: user production 192.168.0.1(34550) idle
32544 be/4 postgres   1184.00 K      4.25 M  0.00 %  3.38 % postgres: user production 192.168.0.3(56861) idle
31458 be/4 postgres   1088.00 K   1528.00 K  0.00 %  3.33 % postgres: user production 192.168.0.1(34541) idle
31444 be/4 postgres    884.00 K      4.23 M  0.00 %  3.27 % postgres: user production 192.168.0.1(34510) idle
32522 be/4 postgres    408.00 K      2.98 M  0.00 %  3.27 % postgres: user production 192.168.0.5(38361) idle
32762 be/4 postgres   1156.00 K      5.28 M  0.00 %  3.20 % postgres: user production 192.168.0.3(57962) idle
32582 be/4 postgres   1084.00 K      3.38 M  0.00 %  2.86 % postgres: user production 192.168.0.5(43104) idle
31353 be/4 postgres      2.04 M      3.02 M  0.00 %  2.82 % postgres: user production 192.168.0.1(34444) idle
31441 be/4 postgres    700.00 K      2.68 M  0.00 %  2.64 % postgres: user production 192.168.0.1(34465) idle
31462 be/4 postgres    980.00 K      3.50 M  0.00 %  2.57 % postgres: user production 192.168.0.1(34547) idle
32709 be/4 postgres    428.00 K      3.23 M  0.00 %  2.56 % postgres: user production 192.168.0.5(34323) idle
  685 be/4 postgres    748.00 K      3.59 M  0.00 %  2.41 % postgres: user production 192.168.0.3(34911) idle
  683 be/4 postgres    728.00 K      3.19 M  0.00 %  2.38 % postgres: user production 192.168.0.3(34868) idle
32765 be/4 postgres    464.00 K      3.76 M  0.00 %  2.21 % postgres: user production 192.168.0.3(58074) idle
32760 be/4 postgres    808.00 K      6.18 M  0.00 %  2.16 % postgres: user production 192.168.0.3(57958) idle
 1912 be/4 postgres    372.00 K      3.03 M  0.00 %  2.16 % postgres: user production 192.168.0.5(33743) idle
31446 be/4 postgres   1004.00 K      2.09 M  0.00 %  2.16 % postgres: user production 192.168.0.1(34539) idle
31460 be/4 postgres    584.00 K      2.74 M  0.00 %  2.10 % postgres: user production 192.168.0.1(34545) idle

5)vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  1 573424 321080  27124 28504352    0    0   143   618    0    4  2  0 91  7
 0  1 573424 320764  27124 28504496    0    0   104 15654 3788 4961  1  0 85 14
 0  1 573424 320684  27124 28504616    0    0   276 12736 4099 5374  0  1 84 15
 0  1 573424 319672  27124 28504900    0    0    80  7746 3624 4949  2  0 82 16
 0  1 573424 319180  27124 28504972    0    0    36 12489 3653 4761  2  0 86 12
 0  1 573424 318184  27132 28505000    0    0     8 10482 3413 4898  0  0 87 13
 0  1 573424 318424  27132 28505016    0    0     0  9564 2746 4290  0  0 87 13
 0  1 573424 318308  27168 28505016    0    0    36 10562 1895 2149  0  0 87 12
 0  3 573424 318208  27168 28505020    0    0    84 18529 3035 3265  1  0 85 14
 0  1 573424 318732  27176 28505080    0    0    84 14574 2986 3231  0  0 84 16
 0  2 573424 317588  27176 28505184    0    0     4  6681 1991 2207  2  1 86 12
 0  1 573424 316852  27176 28505260    0    0    76  7670 2910 3996  2  1 85 13
 0  1 573424 316632  27184 28505256    0    0     0  7186 2661 3740  0  0 87 12
 0  1 573424 316720  27188 28505260    0    0     0  2590 1731 2474  0  0 88 12
 0  1 573424 314252  27192 28505696    0    0   460 11612 1757 2431  0  0 82 18
 0  2 573424 313504  27192 28505724    0    0     0 19656 1775 2099  0  0 83 17
 0  3 573424 313300  27196 28505780    0    0   188  6237 2746 3193  2  0 80 17
 0  2 573424 312736  27200 28506348    0    0   804 18466 5014 6430  2  1 75 23
 2 35 573424 307564  27200 28509920    0    0  3912 16280 14377 15470 14  3 28 56
 0  5 573424 282848  27208 28533964    0    0  7484 27580 22017 25938 17  3 17 63
 1  5 573424 221100  27208 28563360    0    0  2852  3120 19639 28664 12  5 52 31
 0  4 573428 229912  26704 28519184    0    4  1208  5890 13976 20851 13  3 56 28
 0  2 573448 234680  26672 28513632    0   20     0 17204 1694 2636  0  0 71 28
 3  7 573452 220836  26644 28525548    0    4  1540 36370 27928 36551 17  5 50 27
 1  3 573488 234380  26556 28517416    0   36   584 19066 8275 9467  3  2 60 36
 0  1 573488 234496  26556 28517852    0    0    56 47429 3290 4310  0  0 79 20

6)sudo lsof - 很多输出,如果有人有兴趣我可以发布: - )

笔记和想法

正如你所看到的,即使我已经将pg_xlog文件夹移动到SSD阵列(md3),到目前为止最大量的写入仍然会转到常规HDD(md2),这让我很困惑 - 这会是什么? 从stat 3)(iostat)我注意到SSD似乎没有被充分利用的东西 - 也许只是pg_xlog可以移动她吗? 我不知道读/写的数量是否在我的硬件可接受/能力范围内,或者它是否远远超出? 在stat 3)(iotop)中,它表示RAID阵列(md2)是最“等待”的部分,它是否像根本原因一样,或更像是其他瓶颈的症状?

谢谢,花时间查看我的数据! : - )

1 个答案:

答案 0 :(得分:3)

您正在为主数据库存储使用一对7200rpm硬盘驱动器,没有回写缓存(因为您没有电池备份或其他持久写入缓存)。性能永远不会好,并且与该系统的其余部分相比,I / O子系统非常小。

特别是,提交将非常昂贵,并且每次提交所有其他脏数据时都会被刷新。如果您的维护工作产生大量写入,那么每次其他事务提交时,您都会看到这些写入与提交事务中的数据一起刷新到磁盘,从而导致暂停和停顿。

如果有很多出色的维护工作,检查点可能会使整个过程停滞不前。

你没有I / O;你的驱动器看起来几乎无法应对随机I / O负载,并且每秒45 IOs可以提供大约5 MB / s的速度 - 真正糟糕的性能。

考虑选择带有电池备份缓存的硬件RAID控制器,以便您可以在回写缓存模式下运行。除了帮助fsyncs之外,这将使RAID控制器有机会累积写入并在本地化批处理中刷新它们以提高吞吐量,当mdadm被fsync()强制定期刷新时,mdadm无法真正做到这一点。

此外,正如Evgeny Shishkin刚刚在邮件列表中指出的那样,将SSD用于主数据库(如果它适合),以便能够应对高随机I / O速率,并使用HDD进行因为它按顺序写入,所以它们在顺序I / O方面比随机I / O好得多。

更好的是,用具有已知良好的省电安全写回缓存的大型快速SSD替换硬盘(并非所有固态硬盘都可以)。如果用SSD替换硬盘驱动器,则不需要带BBU的RAID控制器,mdadm应该可以正常运行,因为您将从SSD的写回缓存中受益,而不需要在RAID级别使用它。

您需要更改以某种方式存储主数据库的方式以获得不错的结果。我相信你有一个硬件问题 - 一个绝对不足的I / O子系统。