高速書き込み中に読み取り速度が低下する

Linuxプラットフォームで、SSTableが多いと読み取り速度が低下する可能性があります。

DataStax Enterpriseヘルプ・センターでは、トラブルシューティング情報も提供しています。

SSTableが多いと読み取り速度が低下する可能性があります。読み取り速度の低下の原因を特定して修正するには、以下の手順を実行します。

各テーブルのSSTableの総数を特定する
nodetool tablestatsを使用し、その数をチェックします。
各読み取りに探索したSSTableの数を取得する
nodetool tablehistogramsを使用し、その数をチェックします。平均値が2または3を超えている場合、問題が発生する傾向があります。
SSTableが頻繁にフラッシュしていないことを確認する
debug.logenqueuing flushのメッセージをチェックし、サイズおよびフラッシュの頻度をメモします。
  • SlabPoolCleaner スレッドが頻繁に多くの小さなフラッシュをキューに加えている場合は、memtable_cleanup_thresholdの値を増やします。

    memtable_cleanup_thresholdの値は、重い書き込みを受け取るテーブルの数に反比例しなければなりません。

  • スペア・メモリーを利用できる場合は、memtable_heap_space_in_mb (deprecated)またはmemtable_offheap_space_in_mb (deprecated)の増加を検討します。
  • COMMIT-LOG-ALLOCATORスレッドが頻繁にフラッシュをキューに加えている場合は、commitlog_total_space_in_mbの値を増やします。

    COMMIT-LOG-ALLOCATORによりキューに加えられるフラッシュの数は、キューに加えられるフラッシュ総数のうちごく一部でなければなりません。

  • nodetool compactionstatsを使用し、保留中のコンパクションをチェックします。

    フラッシュの頻度が多すぎない場合でも、コンパクションに追従できないことがあります。保留中のコンパクションが多い場合は、コンパクションに追従できません。この数値は、LeveledCompactionStrategyの推定です。

お使いのストレージに対してcompaction_throughput_mb_per_secが適切に設定されていることを確認する
回転式ディスクの場合、compaction_throughput_mb_per_secの値は、デフォルトの値の16 MB/secが選択されます。SSDは、128 MB/sec、またはそれ以上の高い設定を使用できます。
  1. nodetool setcompactionthroughputを使用し、値を一時的に調整します。
  2. iostat -x -t 10を使用し、I/O使用率を確認します。これは、10秒ごとの平均を表示し、タイムスタンプを印刷します。
    • %iowaitが1を超える場合は、ノードがI/Oバウンドの取得を開始していることを示します。
    • await(平均待機時間(ミリ秒))の許容バウンドは、次のとおりです。
      • ほとんどのSSD:10ミリ秒未満。
      • ほとんどの7200 RPM回転式ディスク:200ミリ秒未満。
  3. お使いのシステムで良好なスループットを見つけた後、cassandra.yamlでそれを永続的に設定します。
  4. I/Oが必要なコンパクション・スループットに追従できない場合、おそらくより速いディスクを入手するか、ノードを追加する必要があります。
高いコンパクション・スループットを設定していないがI/O使用率が低く、コンパクションが追従しない場合、コンパクションはCPUバウンドである可能性がある

CompactionExecutorスレッドのコアごとのCPU使用率をチェックします。

スレッドがシングル・コアの100%を使用している場合、コンパクションはCPUバウンドである可能性があります。concurrent_compactorsの値を増やすと、異なるセットのSSTableの複数の同時接続コンパクションを利用できますが、各セットのSSTableのコンパクションは、本質的にシングル・スレッドです。LeveledCompactionStrateg(LCS)を使用している場合は、SizeTieredCompactionStrategy(STCS)に切り替えるか、コンパクション負荷対応を拡張するためにノードを追加する必要があります。

注: (ハイパースレッド・コアではなく)物理的なCPUコアの数を超えて同時接続コンパクターを増やすと、逆効果となる可能性があります。利用可能なすべてのCPUをコンパクションのために使用することは、読み取り/書き込みの処理のために使用できるCPUがなくなることを意味します。コンパクションの遅れを取り戻す一方でリクエストへの対応を継続する場合は、読み取り/書き込み用に1つまたは2つの物理CPUを利用できるように残しておいてください。
ファイル・キャッシュ(ページ・キャッシュ)用に十分なメモリーの空きがあることを確認する

free -mコマンドは、キャッシュに利用できるメモリーの容量を示します。メモリーで作業セットをホットに維持するには、ファイル・キャッシュに利用できる十分なメモリーがあることが必要です。

SizeTieredCompactionStrategyに切り替える
LeveledCompactionStrategy(LCS)を使用しており、上記の手順を実行しても改善されない場合は、SizeTieredCompactionStrategy(STCS)への切り替えを検討します。LCSは、STCSより多くのリソースをコンパクションに使用します。LCSによるコンパクションで遅延しているノードが、STCSの使用に簡単に追従できることが多くあります。