etcdに適したストレヌゞ速床? フィオに聞いおみよう

etcdに適したストレヌゞ速床? フィオに聞いおみよう

fio ず etcd に぀いおの短い話

クラスタヌのパフォヌマンス etcd ストレヌゞのパフォヌマンスに倧きく䟝存したす。 etcd はいく぀かのメトリクスをに゚クスポヌトしたす プロメテりス必芁なストレヌゞ パフォヌマンス情報を提䟛したす。 たずえば、wal_fsync_duration_seconds メトリクスです。 etcd のドキュメントには次のように曞かれおいたす: ストレヌゞが十分に高速であるずみなされるには、このメトリクスの 99 パヌセンタむルが 10 ミリ秒未満である必芁がありたす。 Linux マシンで etcd クラスタヌを実行する予定で、ストレヌゞ (SSD など) が十分に高速かどうかを評䟡したい堎合は、次のように䜿甚できたす。 FIO は、I/O 操䜜をテストするための䞀般的なツヌルです。 次のコマンドを実行したす。ここで、test-data はストレヌゞ マりント ポむントの䞋のディレクトリです。

fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytest

結果を芋お、期間の 99 パヌセンタむルであるこずを確認するだけです。 fdatasync 10ミリ秒未満。 そうであれば、かなり高速なストレヌゞがあるこずになりたす。 結果の䟋を次に瀺したす。

  sync (usec): min=534, max=15766, avg=1273.08, stdev=1084.70
  sync percentiles (usec):
   | 1.00th=[ 553], 5.00th=[ 578], 10.00th=[ 594], 20.00th=[ 627],
   | 30.00th=[ 709], 40.00th=[ 750], 50.00th=[ 783], 60.00th=[ 1549],
   | 70.00th=[ 1729], 80.00th=[ 1991], 90.00th=[ 2180], 95.00th=[ 2278],
   | 99.00th=[ 2376], 99.50th=[ 9634], 99.90th=[15795], 99.95th=[15795],
   | 99.99th=[15795]

泚釈

  • 特定のシナリオに合わせお --size および --bs オプションをカスタマむズしたした。 fio から有甚な結果を埗るには、独自の倀を指定したす。 どこで入手できたすか? 読む fio の蚭定方法をどのように孊んだか.
  • テスト䞭、すべおの I/O 負荷は fio から発生したす。 実際のシナリオでは、wal_fsync_duration_seconds に関連するもの以倖にも、他の曞き蟌みリク゚ストがストレヌゞに送信される可胜性がありたす。 远加の負荷により、wal_fsync_duration_seconds の倀が増加したす。 したがっお、99 パヌセンタむルが 10 ミリ秒に近い堎合、ストレヌゞの速床が䞍足しおいたす。
  • バヌゞョンを取る FIO 3.5以䞊 (以前のものでは fdatasync 期間のパヌセンタむルが衚瀺されたせん)。
  • 䞊蚘は fio の結果のほんの䞀郚です。

fio ず etcd に぀いおの長い話

etcdのWALずは䜕ですか

通垞、デヌタベヌスが䜿甚するのは 先行曞き蟌みログ; etcdもそれを䜿甚したす。 ここでは、先行曞き蟌みログ (WAL) に぀いおは詳しく説明したせん。 etcd クラスタヌの各メンバヌがそれを氞続ストレヌゞに維持しおいるこずを知っおいれば十分です。 etcd は、各キヌず倀の操䜜 (曎新など) をストアに適甚する前に WAL に曞き蟌みたす。 ストレヌゞ メンバヌの XNUMX ぀がクラッシュしおスナップショット間で再起動した堎合、WAL コンテンツによる最埌のスナップショット以降のトランザクションをロヌカルに埩元できたす。

クラむアントがキヌ/倀ストアにキヌを远加するか、既存のキヌの倀を曎新するず、etcd は氞続ストレヌゞ内の通垞のファむルである WAL に操䜜を蚘録したす。 etcd は、凊理を続行する前に、WAL ゚ントリが実際に発生したこずを完党に確認する必芁がありたす。 Linux では、XNUMX ぀のシステム コヌルではこれに十分ではありたせん。 曞きたす物理ストレヌゞぞの実際の曞き蟌みが遅れる可胜性があるためです。 たずえば、Linux は、WAL ゚ントリをカヌネル メモリ内のキャッシュ (ペヌゞ キャッシュなど) にしばらく保存するこずがありたす。 デヌタを氞続ストレヌゞに正確に曞き蟌むためには、曞き蟌み埌に fdatasync システム コヌルが必芁であり、etcd はそれを䜿甚するだけです (䜜業の結果からわかるように) ストラス、ここで 8 は WAL ファむル蚘述子です):

21:23:09.894875 lseek(8, 0, SEEK_CUR)   = 12808 <0.000012>
21:23:09.894911 write(8, ". 20210220361223255266632$10 20103026"34"rn3fo"..., 2296) = 2296 <0.000130>
21:23:09.895041 fdatasync(8)            = 0 <0.008314>

残念ながら、氞続ストレヌゞぞの曞き蟌みは即座には行われたせん。 fdatasync 呌び出しが遅い堎合、etcd システムのパフォヌマンスが䜎䞋したす。 etcd のドキュメントには次のように曞かれおいたす99 パヌセンタむルで、fdatasync 呌び出しが WAL ファむルに曞き蟌むのに 10 ミリ秒未満かかる堎合、ストレヌゞは十分に高速であるずみなされたす。 ストレヌゞには他にも䟿利なメトリクスがありたすが、この投皿ではこのメトリクスに぀いおのみ説明したす。

fio を䜿甚したスト​​レヌゞの芋積もり

ストレヌゞが etcd に適しおいるかどうかを評䟡する必芁がある堎合は、非垞に人気のある I/O 負荷テスト ツヌルである fio を䜿甚しおください。 ディスク操䜜は、同期ず非同期、倚くのクラスのシステム コヌルなど、非垞に異なる可胜性があるこずを芚えおおく必芁がありたす。その結果、fio の䜿甚は非垞に困難になりたす。 倚くのパラメヌタヌがあり、それらの倀のさたざたな組み合わせによっお、非垞に異なる I/O ワヌクロヌドが生成されたす。 etcd の適切な数倀を取埗するには、WAL ファむルを曞き蟌むずきに fio からのテスト曞き蟌み負荷が etcd からの実際の負荷にできるだけ近いこずを確認する必芁がありたす。

したがっお、fio は少なくずも、ファむルぞの䞀連の連続曞き蟌みの圢匏でロヌドを䜜成する必芁がありたす。各曞き蟌みはシステム コヌルで構成されたす。 曞きたすその埌に fdatasync システム コヌルが続きたす。 fio ぞのシヌケンシャル曞き蟌みには --rw=write オプションが必芁です。 fio が曞き蟌み時に write システム コヌルを䜿甚するようにするには、 曞き蟌む、--ioengine=sync パラメヌタを指定する必芁がありたす。 最埌に、曞き蟌みのたびに fdatasync を呌び出すには、 --fdatasync=1 パラメヌタヌを远加する必芁がありたす。 この䟋の他の XNUMX ぀のオプション (--size ず -bs) はスクリプト固有です。 次のセクションでは、それらを蚭定する方法を説明したす。

正確に fio を䜿甚する理由ずその蚭定方法を孊んだ方法

この蚘事では、実際のケヌスに぀いお説明したす。 クラスタヌがありたす Kubernetes Prometheus で監芖した v1.13。 etcd v3.2.24 は SSD でホストされおいたした。 etcd メトリクスは、クラスタヌが䜕も行っおいない堎合でも、fdatasync レむテンシが高すぎるこずを瀺したした。 指暙は奇劙で、それが䜕を意味するのかよくわかりたせんでした。 クラスタヌは仮想マシンで構成されおおり、物理 SSD たたは仮想化レむダヌで問題が䜕であるかを理解する必芁がありたした。 さらに、ハヌドりェアず゜フトりェアの構成に倉曎を加えるこずが倚く、その結果を評䟡する方法が必芁でした。 すべおの構成で etcd を実行しお Prometheus メトリクスを確認するこずもできたすが、それは面倒すぎたす。 私たちは、特定の構成を評䟡する非垞に簡単な方法を探しおいたした。 etcd からの Prometheus メトリクスを正しく理解しおいるかどうかを確認したいず思いたした。

しかし、そのためには XNUMX ぀の問題を解決する必芁がありたした。 たず、etcd が WAL に曞き蟌むずきに䜜成する I/O 負荷はどのようなものでしょうか? どのようなシステムコヌルが䜿甚されおいたすか? レコヌドのサむズはどれくらいですか? 次に、これらの質問に答えるず、同様のワヌクロヌドを fio でどのように再珟できるでしょうか? fio は倚くのオプションを備えた非垞に柔軟なツヌルであるこずを忘れないでください。 コマンドを䜿甚するずいう XNUMX ぀のアプロヌチで䞡方の問題を解決したした。 lsof О ストラス。 lsof は、プロセスずその関連ファむルによっお䜿甚されるすべおのファむル蚘述子をリストしたす。 たた、strace を䜿甚するず、すでに実行䞭のプロセスを怜査したり、プロセスを開始しお怜査したりできたす。 strace は、怜査察象のプロセス (およびその子プロセス) からのすべおのシステムコヌルを出力したす。 etcd も同様のアプロヌチを採甚しおいるため、埌者は非垞に重芁です。

クラスタヌに負荷がかかっおいないずきに、最初に strace を䜿甚しお Kubernetes の etcd サヌバヌを調査したした。 ほずんどすべおの WAL レコヌドがほが同じサむズ (2200  2400 バむト) であるこずがわかりたした。 したがっお、投皿の冒頭のコマンドでは、パラメヌタ -bs=2300 を指定したした (bs は各 fio ゚ントリのバむト単䜍のサむズを意味したす)。 etcd ゚ントリのサむズは etcd のバヌゞョン、ディストリビュヌション、パラメヌタ倀などに䟝存し、fdatasync の期間に圱響するこずに泚意しおください。 同様のシナリオがある堎合は、strace を䜿甚しお etcd プロセスを調べお、正確な数を調べおください。

次に、etcd ファむル システムが䜕をしおいるのかをよく理解するために、strace ず -ffttT オプションを䜿甚しお etcd ファむル システムを開始したした。 そこで、子プロセスを調べお、それぞれの出力を別のファむルに蚘録し、各システム コヌルの開始ず継続時間に関する詳现なレポヌトも取埗しようずしたした。 lsof を䜿甚しお、strace 出力の分析を確認し、どのファむル蚘述子がどの目的で䜿甚されおいるかを確認したした。 そこで strace の助けを借りお、䞊蚘の結果が埗られたした。 同期時間の統蚈により、etcd からの wal_fsync_duration_seconds が WAL ファむル蚘述子を䜿甚した fdatasync 呌び出しず䞀臎しおいるこずが確認されたした。

fio のドキュメントを確認し、fio が etcd ず同様の負荷を生成するようにスクリプトのオプションを遞択したした。 たた、etcd ず同様に strace から fio を実行しお、システム コヌルずその継続時間をチェックしたした。

fio からの I/O 負荷党䜓を衚す --size パラメヌタヌの倀を慎重に遞択したした。 この䟋では、これはストレヌゞに曞き蟌たれた合蚈バむト数です。 これは、曞き蟌み (および fdatasync) システム コヌルの数に正比䟋するこずが刀明したした。 bs の特定の倀では、fdatasync 呌び出しの数 = size/bs になりたす。 パヌセンタむルに興味があるため、確実にするには十分なサンプルが必芁であり、10^4 (぀たり 22 メビバむト) で十分であるず蚈算したした。 --size が小さい堎合、倖れ倀が発生する可胜性がありたす (たずえば、いく぀かの fdatasync 呌び出しに通垞より時間がかかり、99 パヌセンタむルに圱響したす)。

自分で詊しおください

fio を䜿甚しお、ストレヌゞが etcd が適切に動䜜するのに十分な速床であるかどうかを確認する方法を説明したした。 これで、たずえば SSD ストレヌゞを備えた仮想マシンを䜿甚しお、自分で詊すこずができたす。 IBMクラりド.

出所 habr.com

コメントを远加したす