我々はRocksDBの一部に焦点を当てたプロジェクト:速度リミッター。実際には、他の多くのシステムでは速度リミッターを考えても一般的に使用されています。
RocksDBでは、バックグラウンドの圧縮は、ディスクへの書き込みが多数される、リアルタイムおよびフラッシュ操作で実行されます。あなたは可能リミッターを評価する最大書き込み速度の上限値を制御します。、ので、いくつかのシナリオでは、書き込みバーストの大規模な数は、システムのパフォーマンスに影響を与えリードレイテンシの多くを引き起こす可能性があります。
基本原理レートリミッターがあるトークンバケットアルゴリズム:トークン1 QPS /(アップフル)としてバケツを投げる秒あたりのシステムの数は、のみ処理するトークンを取得するための要求を記述します。何のトークンバケットは、サービス拒否になることはできません場合には(ブロッキング)。これはRocksDB基準で実施することができる、本明細書。
レートリミッタは調整がある次のパラメータを:
- int64_tのrate_bytes_per_sec上部管理限界とフラッシュあたりコンパクションの総書き込み量。あなただけの一般的なパラメータを調整する必要があります。
- int64_tのrefill_period_us:100ミリ秒ごとに1MB /秒でどのくらいの期間、その後、rate_limit_bytes_per_secように補充制御トークン、refill_period_usが100ミリ秒であるのに対し、10メガバイト/秒で、トラフィック。
- int32_t公平:低優先度要求の飢餓を防止するために、高および低優先度の要求を制御するために使用されます。
より詳細な説明はrate_limiter.h直接見ることができます。
1 // フラッシュとコンパクションの書き込み速度を制御するRocksDBインスタンス間で共有することができるRateLimiterオブジェクトを作成します。 2 // @rate_bytes_per_sec:これはあなたがほとんどの時間を設定する唯一のパラメータです。これは、秒あたりのバイト数で圧縮とフラッシュの総書き込み速度を制御します。現在、RocksDBは、例えばWALに書き込み、フラッシュおよび圧密以外のレート制限を強制しません。 3 // @refill_period_us:これはトークンが補充される頻度を制御します。rate_bytes_per_secは10メガバイト/秒に設定されているとrefill_period_usが100ミリ秒に設定されている場合たとえば、その後、1メガバイトは内部で100msごとに補充されます。値が小さいほど、より多くのCPUのオーバーヘッドを紹介しながら、バースト的につながることができ、より大きな値を書き込みます。デフォルトでは、ほとんどの場合のために働く必要があります。 4 // @fairness:RateLimiterが高い-PRI要求と低PRIの要求を受け入れます。低PRIの要求は、通常、HI-PRI要求の賛成でブロックされています。現在、RocksDBは低PRIはフラッシュからの要求するために圧密と高priから要求するために割り当てられます。フラッシュ要求が連続で来る場合は低PRIの要求がブロックされ得ることができます。高PRI要求が飢餓を避けるために存在するにもかかわらず、この公正パラメータ1 /公正偶然助成低PRIが許可を求めています。あなたはデフォルトの10でそれを残すことによって良いことがあります 5 // @mode:モードは制限に対してカウントされ操作の種類を示しています。 6 //@auto_tuned:バックグラウンドI / Oのための最近の需要に応じて、 `[rate_bytes_per_sec、rate_bytes_per_sec / 20]`範囲内でレート制限を動的に調整することができます。 7 のextern RateLimiter * NewGenericRateLimiter( 8 int64_tのをrate_bytes_per_sec、int64_tのrefill_period_us = 100 * 1000年、 9 公平= int32_t 10 、 10 RateLimiter ::モードMode = RateLimiter ::モード:: kWritesOnly、 11 BOOL auto_tuned = 偽)。 12 13 } // 名前空間rocksdb
ここでは、このバンドRocksDBで、ブール値がauto_tunedあるオートチューンレートリミッタモジュール。このrate_bytes_per_sec(上限書き込み速度が)あまりにも大きな効果、手動で調整することが非常に困難であるので、小さすぎては続行できません大量の書き込み操作につながります。したがって、このモジュールRocksDBは自動的に調整するために提供しました。モジュールがオンされると、パラメータrate_bytes_per_sec書き込み速度の意味が定義されてなるの上限値(この場合rate_bytes_per_secを示すであろう上限レート制限を動的に採取される内ウィンドウのを。)。定期的にI / O書き込み量を監視し、このオートチューン、及び対応する増加/減少量上限値は、書き込み後(rate_bytes_per_sec_とrefill_bytes_per_period_リセット)。ここだベンチマークリミッターが効果的に書き込み急激な増加のレベルを減らすことができますショーオートチューンレート。