[pgsql-jp: 38864] HDD差異だけで更新性能だけこんなに違うのはなぜ?

omi @ ydc.co.jp omi @ ydc.co.jp
2007年 10月 18日 (木) 20:56:17 JST


なごやの尾見です。
初投稿ですが、よろしくお願いします。

DBクラスタを置くHDDの違いによって、postgreの更新系処理の
性能が著しく異なり、原因の究明に行き詰っています。
問題の切り分けにあたり、アドバイスやヒントをいただけると幸いです。

---

当方の実行環境はRHEL5&postgresql8.1.9で、
・DBクラスタ1: /dev/sda10 (内臓SAS)
・DBクラスタ2: /dev/sde1   (外付けDiskArray)
となっています(詳細の環境は文末)。

・同一マシンでの検証
・両ディスク内で、DBクラスタを置くパーティションは同一サイズ(ext3)
・両者のDBクラスタの内容(/var/lib/pgsql以下相当)は同じ
・従って各種パラメータ(GUC)も全て同じ

という条件で、かつディスクの性能差は大差ないのに、
pgbench(TPC-B)の性能差が10倍以上となっています。
外付けの方(/dev/sde1)が、このままでは使いものになりません。
# DBは最終的には共有Diskにおかないと意味がないのです。。。

検証時の測定環境やデータについては文末に詳細を書きましたが、
概略、以下のようなことが判っています。

・参照系(SELECT)は全く問題なく、問題は更新系。
・デバイス直のdd書込みでは、性能差はほとんどなし(sda10==sde1)。
・mount後のFileSystem上へのdd書込みでは, sda10が1.5倍強は速い。
・GUCのfsync_methodは全パターン試したが有意差なし
 (fsync=offならさすがに改善しますが)。
・PAEカーネルを標準に戻しても結果は同じ。
・大容量メモリを疑ってOSブート時にmem=1Gにしてみても結果は同じ。
・pgbenchで '-c 1'にしても、結果は同じ。
・性能差はpgbenchの結果のみならず、実際のAPの更新処理も同様。

--------

疑わしいと思うのは;
・Postgresqlの問題(使用方法も含め)
・カーネルのドライバの問題(またはファーム)

少々気になっているのは、詳細にあるとおり、
pgbench実施中のtopで確認したプロセスの状態として、
---
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P WCHAN     COMMAND
4695 postgres  16   0  276m 4596 3740 D    0  0.1   0:00.01 2 sync_page postmaster
---
のようなものが、/dev/sde1で検証した場合に大量にあること。
State='D'、WCHAN='sync_page'の状態になってます。

/dev/sda10で検証した場合もあるにはありますが、数は少ないし、
sync_pageだけでなく、blockdev_ を実施中のものも散見されます。

fsync=offだと性能が出ることからも、
postgreバックエンドが実行しようとしているsyncが、
カーネル内でI/O待ちで溜まっているのがいかんのでしょう。
そうすると、後者の「カーネルのドライバの問題(またはファーム)」
も疑わしいのですが、dd書き込みで両ディスクはさほど差がないので、
OS以下の問題でもないような。。。
 
そもそも、postgreバックエンドがsyncするのと、
プロンプトでsyncコマンドをたたくのには、
カーネル内の処理の仕方に違いがあるのだろうか。
postgreバックエンドもユーザプロセスである以上、
直接ディスクに働きかけているはずはないし。

------------
さて、以下に検証データと環境情報を載せておきます。

# DBクラスタに使用しているパーティションの
# デバイスファイル名がプロンプトになるようにしてあります。
# pgbenchのデータは、 pgbench -i -s 10 bench、で作成したものです。

■DBクラスタが内臓SAS(/dev/sda10)にある場合

sda10# /etc/init.d/postgresql restart
postgresql サービスを停止中:                               [  OK  ]
postgresql サービスを開始中:                               [  OK  ]

sda10# su - postgres -c 'time pgbench -c 16 -t 256 bench'
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 10
number of clients: 16
number of transactions per client: 256
number of transactions actually processed: 4096/4096
tps = 223.478208 (including connections establishing)
tps = 223.799161 (excluding connections establishing)
mou
real    0m18.397s
user    0m0.119s
sys     0m0.224s

sda10# 上記実行のtopコマンド出力抜粋(Idle Processes toggle off) 
top - 18:09:40 up 16 min,  3 users,  load average: 0.98, 1.01, 0.64
Tasks: 112 total,   4 running, 108 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.3%us,  1.5%sy,  0.0%ni, 65.1%id, 29.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8309172k total,   477984k used,  7831188k free,    20284k buffers
Swap: 10241312k total,        0k used, 10241312k free,   388540k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P WCHAN     COMMAND
 4161 root      15   0  2168 1000  780 R    1  0.0   0:00.03 3 stext     top
 4210 postgres  16   0  5808 1596 1172 R    2  0.0   0:00.31 2 stext     pgbench
 4219 postgres  15   0  276m  11m  10m R    1  0.1   0:00.15 2 semtimedo postmaster
 4223 postgres  15   0  276m  10m 9.8m R    1  0.1   0:00.15 2 semtimedo postmaster
 4214 postgres  15   0  276m  10m 9944 D    2  0.1   0:00.15 0 blockdev_ postmaster
 4226 postgres  15   0  276m  10m   9m D    1  0.1   0:00.14 0 sync_page postmaster


top - 18:09:41 up 16 min,  3 users,  load average: 0.98, 1.01, 0.64
Tasks:  99 total,   1 running,  98 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.3%us,  3.8%sy,  0.0%ni, 65.9%id, 27.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8309172k total,   472576k used,  7836596k free,    20300k buffers
Swap: 10241312k total,        0k used, 10241312k free,   391772k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P WCHAN     COMMAND
 4161 root      15   0  2168 1000  780 R    0  0.0   0:00.03 3 stext     top
 4155 postgres  16   0  276m  60m  59m D    9  0.7   0:00.09 2 get_reque postmaster
 4225 postgres  16   0  276m  11m  10m D    3  0.1   0:00.15 2 blockdev_ postmaster


sda10# /etc/init.d/postgresql restart
postgresql サービスを停止中:                               [  OK  ]
postgresql サービスを開始中:                               [  OK  ]

sda10# su - postgres -c 'time pgbench -S -c 32 -t 1024 bench'
starting vacuum...end.
transaction type: SELECT only
scaling factor: 10
number of clients: 32
number of transactions per client: 1024
number of transactions actually processed: 32768/32768
tps = 21527.586162 (including connections establishing)
tps = 22263.637395 (excluding connections establishing)

real    0m1.534s
user    0m0.184s
sys     0m0.230s

sda10# hdparm -t -T /dev/sda10

/dev/sda10:
 Timing cached reads:   13076 MB in  2.00 seconds = 6545.16 MB/sec
 Timing buffered disk reads:  142 MB in  3.02 seconds =  47.03 MB/sec
sda10#
sda10# time ( dd if=/dev/zero of=/DB/BIG bs=1M count=1024 ; sync )
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.72524 seconds, 227 MB/s

real    0m21.490s
user    0m0.001s
sys     0m1.909s

sda10# time ( dd if=/dev/zero of=/dev/sda10 bs=1M count=1024 ; sync )
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 40.8455 seconds, 26.3 MB/s

real    0m40.898s
user    0m0.000s
sys     0m1.463s


■DBクラスタが外付DiskArray(/dev/sde1)にある場合

sde1# /etc/init.d/postgresql restart
postgresql サービスを停止中:                               [  OK  ]
postgresql サービスを開始中:                               [  OK  ]

sde1# su - postgres -c 'time pgbench -c 16 -t 256 bench'
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 10
number of clients: 16
number of transactions per client: 256
number of transactions actually processed: 4096/4096
tps = 15.657742 (including connections establishing)
tps = 15.659244 (excluding connections establishing)

real    4m21.910s
user    0m0.130s
sys     0m0.320s

 ★★★ 立派な(?)なハードなのに、これはちょっと ★★★

sde1# 上記実行のtopコマンド出力抜粋(Idle Processes toggle off) 
Tasks: 109 total,   1 running, 108 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.0%sy,  0.0%ni, 49.4%id, 50.4%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8309172k total,   251108k used,  8058064k free,    19556k buffers
Swap: 10241312k total,        0k used, 10241312k free,   168648k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P WCHAN     COMMAND
 4634 root      15   0  2164 1000  784 R    0  0.0   0:00.01 3 stext     top
 4686 postgres  16   0  276m 4608 3748 D    0  0.1   0:00.00 2 sync_page postmaster
 4687 postgres  16   0  276m 4452 3596 D    0  0.1   0:00.01 2 sync_page postmaster
 4688 postgres  15   0  276m 4468 3620 D    0  0.1   0:00.00 2 sync_page postmaster
 4689 postgres  16   0  276m 4616 3756 D    0  0.1   0:00.01 2 sync_page postmaster
 4690 postgres  16   0  276m 4840 3984 D    0  0.1   0:00.00 2 sync_page postmaster
 4691 postgres  16   0  276m 4656 3800 D    0  0.1   0:00.01 2 sync_page postmaster
 4693 postgres  16   0  276m 4484 3628 D    0  0.1   0:00.01 2 sync_page postmaster
 4694 postgres  16   0  276m 4588 3728 D    0  0.1   0:00.01 2 sync_page postmaster
 4695 postgres  16   0  276m 4596 3740 D    0  0.1   0:00.01 2 sync_page postmaster
 4696 postgres  16   0  276m 4584 3728 D    0  0.1   0:00.01 2 sync_page postmaster
 4697 postgres  16   0  276m 4608 3752 D    0  0.1   0:00.01 2 sync_page postmaster
 4698 postgres  16   0  276m 4616 3760 D    0  0.1   0:00.00 2 sync_page postmaster
 4699 postgres  16   0  276m 4608 3748 D    0  0.1   0:00.01 2 sync_page postmaster
 4685 postgres  16   0  276m 4680 3824 D    0  0.1   0:00.00 1 sync_page postmaster
 4692 postgres  15   0  276m 4580 3724 D    0  0.1   0:00.01 1 sync_page postmaster
 4700 postgres  15   0  276m 4456 3592 D    0  0.1   0:00.00 1 sync_page postmaster


top - 18:15:22 up 21 min,  2 users,  load average: 1.28, 0.61, 0.54
Tasks: 109 total,   1 running, 108 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 50.0%id, 50.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8309172k total,   251108k used,  8058064k free,    19556k buffers
Swap: 10241312k total,        0k used, 10241312k free,   168648k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P WCHAN     COMMAND
 4634 root      15   0  2164 1000  784 R    0  0.0   0:00.01 3 stext     top
 4686 postgres  16   0  276m 4608 3748 D    0  0.1   0:00.00 2 sync_page postmaster
 4687 postgres  16   0  276m 4452 3596 D    0  0.1   0:00.01 2 sync_page postmaster
 4688 postgres  15   0  276m 4468 3620 D    0  0.1   0:00.00 2 sync_page postmaster
 4689 postgres  16   0  276m 4616 3756 D    0  0.1   0:00.01 2 sync_page postmaster
 4690 postgres  16   0  276m 4840 3984 D    0  0.1   0:00.00 2 sync_page postmaster
 4691 postgres  16   0  276m 4656 3800 D    0  0.1   0:00.01 2 sync_page postmaster
 4693 postgres  16   0  276m 4484 3628 D    0  0.1   0:00.01 2 sync_page postmaster
 4694 postgres  16   0  276m 4588 3728 D    0  0.1   0:00.01 2 sync_page postmaster
 4695 postgres  16   0  276m 4596 3740 D    0  0.1   0:00.01 2 sync_page postmaster
 4696 postgres  16   0  276m 4584 3728 D    0  0.1   0:00.01 2 sync_page postmaster
 4697 postgres  16   0  276m 4608 3752 D    0  0.1   0:00.01 2 sync_page postmaster
 4698 postgres  16   0  276m 4616 3760 D    0  0.1   0:00.00 2 sync_page postmaster
 4699 postgres  16   0  276m 4608 3748 D    0  0.1   0:00.01 2 sync_page postmaster
 4685 postgres  16   0  276m 4680 3824 D    0  0.1   0:00.00 1 sync_page postmaster
 4692 postgres  15   0  276m 4580 3724 D    0  0.1   0:00.01 1 sync_page postmaster


sde1# /etc/init.d/postgresql restart
postgresql サービスを停止中:                               [  OK  ]
postgresql サービスを開始中:                               [  OK  ]

sde1# su - postgres -c 'time pgbench -S -c 32 -t 1024 bench'
starting vacuum...end.
transaction type: SELECT only
scaling factor: 10
number of clients: 32
number of transactions per client: 1024
number of transactions actually processed: 32768/32768
tps = 22199.639581 (including connections establishing)
tps = 23029.899230 (excluding connections establishing)

sde1# hdparm -t -T /dev/sde1

/dev/sde1:
 Timing cached reads:   13144 MB in  2.00 seconds = 6578.23 MB/sec
 Timing buffered disk reads:  270 MB in  3.00 seconds =  89.97 MB/sec

sde1# time ( dd if=/dev/zero of=/DB/BIG bs=1M count=1024 ; sync )
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.90016 seconds, 275 MB/s

real    0m37.200s
user    0m0.002s
sys     0m2.079s


sde1# time ( dd if=/dev/zero of=/dev/sde1 bs=1M count=1024 ; sync )
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 40.7442 seconds, 26.4 MB/s

real    0m40.823s
user    0m0.002s
sys     0m1.476s


■実行環境情報

# uname -a
Linux needswebb 2.6.18-8.1.14.el5PAE #1 SMP Tue Sep 25 11:59:13 EDT 2007 i686 i686 i386 GNU/Linux

# rpm -qa | grep postgresql
postgresql-8.1.9-1.el5
postgresql-odbc-08.01.0200-3.1
postgresql-pl-8.1.9-1.el5
postgresql-jdbc-8.1.407-1jpp.4
postgresql-test-8.1.9-1.el5
postgresql-python-8.1.9-1.el5
postgresql-docs-8.1.9-1.el5
postgresql-libs-8.1.9-1.el5
postgresql-server-8.1.9-1.el5
postgresql-contrib-8.1.9-1.el5

#dmesg(抜粋)
scsi0 : LSI Logic SAS based MegaRAID driver
  Vendor: FUJITSU   Model: MAX3073RC         Rev: 2102
  Type:   Direct-Access                      ANSI SCSI revision: 03
  Vendor: FUJITSU   Model: MAX3073RC         Rev: 2102
  Type:   Direct-Access                      ANSI SCSI revision: 03
  Vendor: FUJITSU   Model: MAX3073RC         Rev: 2102
  Type:   Direct-Access                      ANSI SCSI revision: 03
  Vendor: LSI       Model: MegaRAID SAS RMB  Rev: 1.03
  Type:   Direct-Access                      ANSI SCSI revision: 05
SCSI device sda: 142278656 512-byte hdwr sectors (72847 MB)
sda: Write Protect is off
sda: Mode Sense: 1f 00 00 08
SCSI device sda: drive cache: write back, no read (daft)
SCSI device sda: 142278656 512-byte hdwr sectors (72847 MB)
sda: Write Protect is off
sda: Mode Sense: 1f 00 00 08
SCSI device sda: drive cache: write back, no read (daft)
 sda: sda1 sda2 sda3 sda4 < sda5 sda6 sda7 sda8 sda9 sda10 >
sd 0:2:0:0: Attached scsi disk sda

Fusion MPT SAS Host driver 3.04.02
ACPI: PCI Interrupt 0000:08:00.0[A] -> GSI 16 (level, low) -> IRQ 169
mptbase: Initiating ioc0 bringup
ioc0: SAS1068E: Capabilities={Initiator}
PCI: Setting latency timer of device 0000:08:00.0 to 64
scsi1 : ioc0: LSISAS1068E, FwRev=01120000h, Ports=1, MaxQ=511, IRQ=169
  Vendor: XYRATEX   Model: E5402E            Rev:
  Type:   Direct-Access                      ANSI SCSI revision: 04
SCSI device sde: 39075840 512-byte hdwr sectors (20007 MB)
sde: Write Protect is off
sde: Mode Sense: a7 00 10 08
SCSI device sde: drive cache: write back w/ FUA
SCSI device sde: 39075840 512-byte hdwr sectors (20007 MB)
sde: Write Protect is off
sde: Mode Sense: a7 00 10 08
SCSI device sde: drive cache: write back w/ FUA
 sde: sde1
sd 1:0:0:3: Attached scsi disk sde

# インストール後に変更したGUC
max_connections = 256
shared_buffers = 32768                        # min 16 or max_connections*2, 8KB each
temp_buffers = 8192           # min 100, 8KB each
work_mem = 8192                       # min 64, size in KB
max_fsm_pages = 89600                 # min max_fsm_relations*16, 6 bytes each
wal_sync_method = open_sync           # the default is the first option
wal_buffers = 32                      # min 4, 8KB each
effective_cache_size = 32768          # typically 8KB each

# チューニングの余地はまだだあると思うが、
# 両DBクラスタとも、同じ値を使って検証しているのは間違いないです。

以上です。



pgsql-jp メーリングリストの案内