検索

6.3. VDO スレッドの再分配

download PDF

VDO は、リクエストを処理するときに、さまざまなタスクにさまざまなスレッドプールを使用します。最適なパフォーマンスは、各プールのスレッド数を適切に設定することに依存します。適切なスレッド数は、利用可能なストレージ、CPU リソース、ワークロードの種類によって異なります。VDO の作業を複数のスレッドに分散して、VDO パフォーマンスを向上させることができます。

VDO は、並列処理を通じてパフォーマンスを最大化することを目的としています。利用可能な CPU リソースやボトルネックの根本原因などの要因に応じて、ボトルネックになっているタスクに対してより多くのスレッドを割り当てることで、パフォーマンスを向上できます。スレッド使用率が高い (70 - 80% 以上) と遅延が発生する可能性があります。したがって、スレッド数を増やすことが役立ちます。ただし、スレッド数が多すぎるとパフォーマンスが低下し、追加のコストが発生する可能性があります。

最適なパフォーマンスを得るには、次のアクションを実行します。

  • 予想されるさまざまなワークロードで VDO をテストし、パフォーマンスを評価して最適化します。
  • 使用率が 50% を超えるプールのスレッド数を増やします。
  • 個々のスレッドの使用率が低くても、全体の使用率が 50% を超える場合は、VDO で使用できるコアの数を増やします。

6.3.1. NUMA ノード全体での VDO スレッドのグループ化

NUMA ノードをまたぐメモリーへのアクセスは、ローカルメモリーアクセスよりも遅くなります。コアがノード内の最終レベルのキャッシュを共有する Intel プロセッサーでは、単一ノード内でデータが共有される場合よりもノード間でデータが共有される場合に、キャッシュの問題が顕著になります。多くの VDO カーネルスレッドは排他的なデータ構造を管理する一方、しばしば I/O リクエストに関するメッセージを交換します。VDO スレッドが複数のノードに分散している場合や、スケジューラーがノード間でスレッドを再割り当てする場合、競合が発生する可能性があります。具体的には、複数のノードが同じリソースを求めて競合する可能性があります。

特定のスレッドを同じ NUMA ノードにグループ化することで、VDO のパフォーマンスを向上させることができます。

関連するスレッドの 1 つの NUMA ノードへのグループ化
  • I/O 完了通知 (ackQ) スレッド
  • 上位レベルの I/O 送信スレッド:

    • ダイレクト I/O を処理するユーザーモードスレッド
    • カーネルページキャッシュフラッシュスレッド
デバイスアクセスの最適化
  • デバイスアクセスのタイミングが NUMA ノード間で異なる場合は、ストレージデバイスコントローラーに最も近いノードで bioQ スレッドを実行します。
競合の最小化
  • I/O 送信とストレージデバイスの割り込み処理を、logQ または physQ スレッドと同じノードで実行します。
  • 同じノードで他の VDO 関連の作業を実行します。
  • 1 つのノードがすべての VDO 作業を処理できない場合は、メモリー競合を考慮してスレッドを他のノードに移動します。たとえば、処理に割り込むデバイスと bioQ スレッドを他のノードに移動します。

6.3.2. CPU アフィニティーの設定

VDO スレッドの CPU アフィニティーを調整すると、特定のストレージデバイスドライバーでの VDO パフォーマンスを向上させることができます。

ストレージデバイスドライバーの割り込み (IRQ) ハンドラーが大きな作業を実行し、ドライバーがスレッド化された IRQ ハンドラーを使用しない場合、VDO パフォーマンスを最適化するシステムスケジューラーの機能が制限される可能性があります。

最適なパフォーマンスを得るには、次のアクションを実行します。

  • コアがオーバーロード状態になった場合は特定のコアを IRQ 処理専用にし、VDO スレッドアフィニティーを調整します。%hi 値が他のコアよりも数パーセント以上高い場合、コアはオーバーロード状態になっています。
  • ビジーな IRQ コアでは、kvdo:journalQ スレッドなどのシングルトン VDO スレッドを実行しないようにします。
  • 他のスレッドタイプも、IRQ でビジーなコアでは実行しないようにします (個々の CPU 使用率が高い場合のみ)。
注記

この設定は、システムを再起動すると元に戻ります。

手順

  • CPU アフィニティーを設定します。

    # taskset -c <cpu-numbers> -p <process-id>

    <cpu-numbers> は、プロセスを割り当てる CPU 番号のコンマ区切りのリストに置き換えます。<process-id> は、CPU アフィニティーを設定する実行中のプロセスの ID に置き換えます。

    例6.1 CPU コア 1 および 2 に kvdo プロセスの CPU アフィニティーを設定する例

    # for pid in `ps -eo pid,comm | grep kvdo | awk '{ print $1 }'`
    do
        taskset -c "1,2" -p $pid
    done

検証

  • アフィニティーセットを表示します。

    # taskset -p <cpu-numbers> -p <process-id>

    <cpu-numbers> は、プロセスを割り当てる CPU 番号のコンマ区切りのリストに置き換えます。<process-id> は、CPU アフィニティーを設定する実行中のプロセスの ID に置き換えます。

関連情報

  • taskset(1) の man ページ
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.