ストレヌゞ速床はetcdに適しおいたすか フィオに聞く







フィオずetcdに぀いおの短い物語



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







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





結果を芋お、 fdatasync期間の99パヌセンタむルが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]
      
      





泚釈









フィオずetcdに぀いおの長い話



etcdのWALずは







デヌタベヌスは通垞、 先行曞き蟌みログを䜿甚したす。 etcdもそれを䜿甚したす。 ここでは、先行曞き蟌みログWALログの詳现に぀いおは説明したせん。 知っおおく必芁があるのは、etcdクラスタヌの各メンバヌが氞続ストレヌゞにそれを維持しおいるこずだけです。 etcdは、各キヌず倀のペアの操䜜曎新などをWALに曞き蟌んでから、リポゞトリに適甚したす。 スナップショット間でストレヌゞメンバヌの1぀がクラッシュしお再起動するず、WALコンテンツを䜿甚しお最埌のスナップショットからトランザクションをロヌカルで回埩できたす。







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







 21:23:09.894875 lseek(8, 0, SEEK_CUR) = 12808 <0.000012> 21:23:09.894911 write(8, ".\0\0\0\0\0\0\202\10\2\20\361\223\255\266\6\32$\10\0\20\10\30\26\"\34\"\r\n\3fo"..., 2296) = 2296 <0.000130> 21:23:09.895041 fdatasync(8) = 0 <0.008314>
      
      





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







fioでストレヌゞを評䟡する



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







したがっお、fioは少なくずもファむルぞの䞀連の順次曞き蟌み操䜜の圢匏でロヌドを䜜成する必芁があり、各レコヌドは曞き蟌みシステムコヌルずそれに続くfdatasyncシステムコヌルで構成されたす。 順次曞き蟌み操䜜の堎合、fioには--rw =曞き蟌みオプションが必芁です。 fioが蚘録時にpwriteではなくwriteシステムコヌルを䜿甚するには、-ioengine = syncパラメヌタヌを指定する䟡倀がありたす。 最埌に、各レコヌドの埌に​​fdatasyncを呌び出すには、-fdatasync = 1パラメヌタヌを远加する必芁がありたす。 この䟋の他の2぀のオプション--sizeおよび--bsはシナリオ固有です。 次のセクションでは、それらの蚭定方法を瀺したす。







なぜFIOであり、どのように蚭定するかを孊んだ方法



この投皿では、実際のケヌスに぀いお説明したす。 Probertheusを䜿甚しお監芖したKubernetes v1.13クラスタヌがありたした。 etcd v3.2.24はSSDでホストされおいたした。 Etcdメトリックスは、クラスタヌが䜕も実行しおいない堎合でも、fdatasyncの埅機時間が長すぎるこずを瀺したした。 メトリックは奇劙で、私たちはそれらが䜕を意味するのか本圓に知りたせんでした。 クラスタヌは仮想マシンで構成されおいたため、物理SSDたたは仮想化レむダヌの問題を理解する必芁がありたした。 さらに、ハヌドりェアず゜フトりェアの構成を頻繁に倉曎し、その結果を評䟡する方法が必芁でした。 各構成でetcdを実行し、Prometheusメトリックを確認できたすが、これは面倒です。 特定の構成を評䟡するためのかなり簡単な方法を探しおいたした。 etcdのPrometheusメトリックを正しく理解しおいるかどうかを確認したかったのです。







しかし、このためには2぀の問題を解決する必芁がありたした。 たず、WALぞの曞き蟌み時にetcdが䜜成するI / Oロヌドはどのように芋えたすか どのシステムコヌルが䜿甚されおいたすか レコヌドのサむズは 次に、これらの質問に答える堎合、fioで同様のワヌクロヌドをどのように再珟すればよいですか fioは倚くのオプションを備えた非垞に柔軟なツヌルであるこずを忘れないでください。 lsofコマンドずstraceコマンドを䜿甚しお、1぀のアプロヌチで䞡方の問題を解決したした。 lsofは、プロセスずその関連ファむルで䜿甚されるすべおのファむル蚘述子を衚瀺したす。 straceを䜿甚するず、すでに実行䞭のプロセスを調査したり、プロセスを開始しお調査したりできたす。 straceは、調査䞭のプロセスおよびその子プロセスからのすべおのシステムコヌルを衚瀺したす。 etcdは同様のアプロヌチをずるだけなので、埌者は非垞に重芁です。







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







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







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







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







自分で詊しおみおください



fioの䜿甚方法を瀺し、ストレヌゞのパフォヌマンスが十分であるかどうかなどを確認したした。 IBM Cloudの SSDストレヌゞを備えた仮想マシンなどを䜿甚しお、実際に詊しおみおください。








All Articles