更新(ソフトウェアおよびハードウェア)からの重いI / Oのためにデータベースを最適化する方法


20

状況 は非常に頻繁に更新されるpostgresql 9.2データベースがあります。したがって、システムはI / Oにバインドされており、現在別のアップグレードを検討しています。改善を開始する場所についての指示が必要です。

過去3か月間の状況の様子を次の図に示します。

ここに画像の説明を入力してください

ご覧のとおり、更新操作はほとんどのディスク使用率を考慮しています。より詳細な3時間のウィンドウで状況がどのように見えるかの別の写真を次に示します。

ここに画像の説明を入力してください

ご覧のとおり、ピーク書き込み速度は約20MB / sです

ソフトウェア サーバーは、ubuntu 12.04およびpostgresql 9.2を実行しています。更新のタイプは、通常、IDで識別される個々の行で小規模に更新されます。例UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id。可能な限りインデックスを削除して最適化し、サーバー構成(Linuxカーネルとpostgres confの両方)もかなり最適化されています。

ハードウェア ハードウェアは、32GB ECC ram、RAID 10アレイの4x 600GB 15.000 rpm SASディスクを備えた専用サーバーで、BBUとIntel Xeon E3-1245 Quadcoreプロセッサーを搭載したLSI RAIDコントローラーによって制御されます。

ご質問

  • グラフに表示されるパフォーマンスは、この口径のシステム(読み取り/書き込み)にとって妥当ですか?
  • したがって、ハードウェアのアップグレードに重点を置くか、ソフトウェアの詳細な調査(カーネルの調整、confs、クエリなど)を行う必要がありますか?
  • ハードウェアのアップグレードを行う場合、ディスクの数はパフォーマンスにとって重要ですか?

- - - - - - - - - - - - - - - 更新 - - - - - - - - - - ----------------

古い15k SASディスクの代わりに4つのIntel 520 SSDを使用してデータベースサーバーをアップグレードしました。私は同じRAIDコントローラーを使用しています。以下からわかるように、物事はかなり改善されており、ピークI / Oパフォーマンスは約6〜10倍改善されています。 ここに画像の説明を入力してください しかし、新しいSSDの回答とI / O機能によると、20〜50倍の改善が期待されていました。そこで、別の質問に進みます。

新しい質問 現在の構成には、システムのI / Oパフォーマンスを制限しているものがありますか(ボトルネックはどこにありますか)?

私の構成:

/etc/postgresql/9.2/main/postgresql.conf

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.4, localhost'
port = 5432
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = on
checkpoint_timeout = 10min
archive_mode = on
archive_command = 'rsync -a %p postgres@192.168.0.2:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
hot_standby = on
log_line_prefix = '%t '
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
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 = 1920MB
checkpoint_completion_target = 0.7
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 7680MB
max_connections = 400 

/etc/sysctl.conf

# sysctl config
#net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
# Updated according to postgresql tuning
vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
vm.swappiness = 0
vm.overcommit_memory = 2
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 50000000

/etc/sysctl.d/30-postgresql-shm.conf

# Shared memory settings for PostgreSQL
# Note that if another program uses shared memory as well, you will have to
# coordinate the size settings between the two.
# Maximum size of shared memory segment in bytes
#kernel.shmmax = 33554432
# Maximum total size of shared memory in pages (normally 4096 bytes)
#kernel.shmall = 2097152
kernel.shmmax = 8589934592
kernel.shmall = 17179869184
# Updated according to postgresql tuning

の出力 MegaCli64 -LDInfo -LAll -aAll

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 446.125 GB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 446.125 GB
State               : Optimal
Strip Size          : 64 KB
Number Of Drives per span:2
Span Depth          : 2
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
Is VD Cached: No

(1)。列にインデックスが付けられていない場合、HOTを利用できます(git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/…を参照)。(2)。postgresql.org/docs/9.2/static/wal-async-commit.htmlsynchronous_commit = offのドキュメントを読んだ後、で試してください。(3)。構成はどのように見えますか?例えば。このクエリの結果:SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');
bma

@bma私についての警告を追加してみましょうsynchronous_commit「非同期コミットすると、トランザクションは、データベースがクラッシュした場合、最新のトランザクションが失われる可能性があるというコストで、より迅速に完了することができますオプションです。」
dezso

@dezso私が参照していたドキュメントのセクションについて、もっと明確にすべきでした。説明をありがとう。私がそれを持ち出した理由は、高負荷(Hibernateを使用)のサーバーの1つが苦労していたため、非同期コミットに切り替えるという情報に基づいた決定を行い、負荷の40%が事実上消失したためです。ほとんどのシステムにはお勧めしませんが、特定のケースでは、サーバーのアップグレードとアプリケーションの変更の間の時間を節約できます。
bma

回答:


10

ハードウェアのアップグレードを行う場合、ディスクの数はパフォーマンスにとって重要ですか?

はい、ハードディスクとして-SASでさえ-移動に時間がかかるヘッドがあります。

大幅なアップグレードが必要ですか?

SASディスクを強制終了し、SATAに移動します。SATA SSDを差し込みます-Samsung 843Tのようなエンタープライズレベル。

結果?ドライブあたり約60.000(つまり6万)IOPSを実行できます。

これが、SSDがDBスペースのキラーであり、SASドライブよりもはるかに安い理由です。Phyiscalスピニングディスクは、ディスクのIOPS機能に対応できません。

SASディスクは、最初は平凡な選択でした(大きすぎて多くのIOPSを取得できません)使用率の高いデータベース(ディスクが小さいほどIOPSが大きくなります)では、SSDがゲームチェンジャーです。

ソフトウェア/カーネルに関して。適切なデータベースは多くのIOPSを実行し、バッファーをフラッシュします。基本的なACID条件を保証するには、ログファイルを書き込む必要があります。実行できる唯一のカーネルチューニングは、トランザクションの整合性を無効にすることです。部分的にはそれで済ますことができます。ライトバックモードのRAIDコントローラーは、それを実行します-たとえフラッシュされていない場合でもフラッシュされていることを確認します-しかし、BBUは電源が落ちた日に安全であると想定されるため、そうすることができます。カーネルの上位で行うこと-負の副作用に耐えられることをよく知ってください。

最後に、データベースにはIOPSが必要です。ここでは、セットアップが他のいくつかのものと比較してどれだけ小さいかを見て驚くかもしれません。必要なIOPSを取得するためだけに、100台以上のディスクでデータベースを確認しました。しかし、実際には、今日、SSDを購入してサイズを選択します。IOPS機能が非常に優れているため、SASドライブでこのゲームと戦うことは意味がありません。

もちろん、IOPSの数値はハードウェアにとって悪くはありません。私が期待する範囲内で。


6

余裕がある場合は、ライトバック用に構成されたバッテリーバックアップRAMを備えた独自のコントローラー上の個別のRAID 1ドライブペアにpg_xlogを配置します。これは、他のすべてがSSD上にあるときにpg_xlogに回転錆を使用する必要がある場合でも当てはまります。

SSDを使用する場合は、電源障害時にキャッシュされたすべてのデータを保持するためのスーパーキャパシターまたはその他の手段があることを確認してください。

一般に、スピンドルが増えると、I / O帯域幅が増えます。


残念ながら、RAIDコントローラーには4つのhddスロットしかありません。他のすべてのディスクがSSDである場合、なぜpg_xlogsを別のアレイに配置するのですか?
ニールスクリスチャン

2
@NielsKristian私は、ほとんどのシステムでトランザクションログがディスク上で最も頻繁に書き込まれるものだと言ってもいいと思います。また、データの書き込みと基本的に並行して書き込みを行います。ヘッドがpg_xlogまたはデータフォルダーのいずれかにあるため、この2つをHDDで同時に実行することはできません。(深刻な簡略化アラート!)2つのタスクを分離すると、2つの独立したディスク/アレイのIO負荷が分割されます。
dezso

2
アクセスはほぼ完全にシーケンシャルであるため、@dezsoが言ったことに加えて、ハードドライブが..だから時間が最小シーク、WAL専用の記憶のためにOKです
kgrittn

1

Linuxで実行していると仮定して、ディスクIOスケジューラを必ず設定してください。

過去の経験から、noopに切り替えると、かなりのスピードアップが得られます(特にSSDの場合)。

IOスケジューラーの変更は、ダウンタイムなしでオンザフライで実行できます。

すなわち。エコーnoop> / sys / block // queue / scheduler

参照:http : //www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/詳細については。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.