ブロックサイズについて


11

私の質問はPostgresを対象としていますが、回答はデータベースの背景から得られたもので十分かもしれません。

私の仮定は正しいですか:

  • ディスクのブロックサイズは固定ですか?
  • RAIDコントローラーは異なるブロックサイズを持つことができますか?1つのRAIDブロックが複数の実ディスクブロックに分割されますか?
  • ファイルシステムには独立したブロックサイズもあり、RAIDブロックサイズに分割されますか?
  • Postgresは固定の8kブロックで動作します。ここでファイルシステムのブロックサイズへのマッピングはどのように行われますか?Postgres 8kブロックはファイルシステムによってバッチ処理されていますか?

システムをセットアップするとき、すべてのブロックを8kにするのが最善ですか?または、設定は重要ではありませんか?クラッシュした場合に、いくつかの「間違った」ブロックサイズ設定がデータの整合性を危険にさらす可能性があるかどうかも疑問に思っていましたか?たぶん、Postgres 8kブロックを複数のディスクブロックに分割する必要がある場合はどうでしょうか。

または、何も一緒にバッチ処理されないため、定義されたブロックサイズ間のすべての不一致によってディスク領域が失われますか?

回答:


16

ディスクセクター

ディスクのセクタサイズは固定されており、最近のディスクでは通常512バイトまたは4096バイトです。これらのディスクには、512バイトのセクターをエミュレートするモードもあります。ディスクにはさまざまなセクター数のトラックがあります。ディスクの外側に近いトラックは、指定されたビット密度のためのより多くの余地があるため、より多くのセクターを持っています。これにより、ディスク領域をより効率的に使用できます。通常、トラックは、最近のディスクでは1,000 512バイトセクターのようなものになります。

一部のフォーマット構造は、secotrsにエラー修正情報を含めることもできます。これは、520または528バイトセクターで低レベルフォーマットされているディスクに現れます。この場合、セクターにはまだ512バイトのユーザーデータがあります。WindowsもLinuxもこれを直接サポートしていませんが、i5OS(IBM iSeries)およびさまざまなSANコントローラーはサポートしています。

通常、セクター/ヘッド/トラックは論理ブロックアドレスに変換されます。下位互換性の歴史的な問題により、オペレーティングシステム(特にIDEおよびSATAディスク上)から見たジオメトリ(ヘッドxセクターxトラック)は通常、その物理構造とほとんど関係がありません。

RAIDストライプサイズ

RAIDコントローラーは、ストライピング(RAID-5またはRAID-10など)を使用してアレイのストライプサイズを持つことができます。アレイに(例として)128kストライプがある場合、各ディスクには128kの連続したデータがあり、次のデータセットは次のディスク上にあります。通常、ディスクの1回転あたり約1つのストライプが得られると予想できるため、ストライプサイズが特定のワークロードのパフォーマンスに影響を与える可能性があります。

パーティションの調整

ディスクパーティションは、RAIDストライプと正確に位置合わせされている場合とされていない場合があり、位置合わせされていない場合、分割読み取りによりパフォーマンスが低下する可能性があります。一部のシステム(Windows 2008サーバーなど)では、ディスクボリュームのストライプサイズに合わせてパーティションが自動的に構成されます。一部(Windows 2003サーバーなど)はサポートしていません。そのためには、ストライプアライメントをサポートするパーティションユーティリティを使用する必要があります。

ファイルシステムのブロックサイズ

ファイルシステムは、特定のサイズのチャンクでストレージブロックを割り当てます。通常、これは構成可能です。たとえば、NTFSは(IIRC)4Kから64Kのアロケーションユニットをサポートします。パーティションとファイルシステムブロックのRAIDストライプへのミスアライメントにより、単一のファイルシステムブロックの読み取りで複数のディスクアクセスが生成され、ファイルシステムブロックがRAIDストライプと正しくアライメントされていれば、1つだけ必要になります。

データベースブロックサイズ

データベースは、特定のブロックサイズでテーブルまたはインデックスに領域を割り当てます。SQL Serverの場合、これは8Kであり、多くのシステムでは8Kがデフォルトです。Oracleなどの一部のシステムでは、これは構成可能であり、PostgreSQLではビルド時のオプションです。ほとんどのシステムでは、テーブルへのスペース割り当ては通常、より大きなチャンクで行われ、ブロックはそれらのチャンク内に割り当てられます。

ファイルシステムとデータアロケーションブロックのミスアラインメントは、単一のブロック書き込みに対して複数のI / Oを生成する可能性があり、これによりパフォーマンスが低下する可能性があります。

I / Oチャンキング

通常、DBMSは実際には複数のブロックのチャンクでI / Oを実行します。たとえば、SQL Serverでは、すべてのI / Oは8ブロックのチャンクで行われ、合計で64kです)。Oracleでは、これは構成可能です。PostgreSQLのドキュメントを簡単に調べても、PostgreSQLがこれを行うかどうかの具体的な説明は明らかになっていないため、このプラットフォームでどのように機能するかはわかりません。

I / Oチャンクがファイルシステムのブロックサイズよりも大きい場合、またはRAIDストライプの境界と整合していない場合、DBからのディスク書き込みにより複数のディスク書き込みが発生し、パフォーマンスが低下する可能性があります。

ディスク容量の使用

ディスク領域が浪費されることはありません。データベースI / Oは、ディスク上で1つ以上の物理I / O操作を使用して完了します。ただし、I / Oを正しく調整しないと、非効率になり、データベースの速度が低下します。調整が必要な主なものは次のとおりです。

  • RAIDストライプとパーティション-パーティションはRAIDストライプ境界で始まる必要があります。

  • ファイルシステムI / O割り当てとRAIDストライプ/パーティション境界-RAIDストライプ境界は、ファイルシステムアロケーションユニットに合わせる必要があり、ファイルシステムアロケーションユニットサイズの倍数である必要があります。

  • ディスク書き込みサイズとファイルシステムアロケーションユニットサイズ。データベースI / O操作とファイルシステムI / O操作の間には1対1の関係があるはずです。

ミスアライメントは、他の場合よりも大きなデータ整合性の問題を引き起こしません。データベースとファイルシステムには、ファイルシステムの操作がアトミックであることを確認するためのメカニズムがあります。通常、ディスククラッシュはデータの損失につながりますが、データの整合性の問題にはなりません。


とてもいい答えです。私はあなたに1つの賛成票しか与えられないのは残念です...
Franz Kafka

もう1つだけ質問:整列について正確に言うと、どういう意味ですか?それは小さいブロックサイズの倍数ですか?たとえば、32kは8kに揃えられますか?それとも他の要因が関係していますか?
フランツカフカ

@FranzKafka-いいえ、何か(通常はディスクパーティション)が、整列する必要のあるものの整数倍ではない場所で始まるときを意味します。たとえば、128KのRAIDストライプサイズがあり、パーティションが「ブロック0」から128Kの倍数で開始しない場合、2つの物理割り当てユニットに分割される論理読み取りを行うことができます。パフォーマンスのペナルティ。
ConcernedOfTunbridgeWells 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.