ページフォルト

この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® VTune™ Profiler Performance Analysis Cookbook」の「Page Faults」の日本語参考訳です。


バージョン: 2020 (最終更新日: 2021 年 4 月 16 日)

このレシピでは、インテル® VTune™ プロファイラーのマイクロアーキテクチャー全般、システム概要、メモリー消費解析を使用して、ページフォルトがターゲット・アプリケーションのパフォーマンスに与える影響を特定して測定する方法を説明します。

コンテンツ・エキスパート: Vitaly Slobodskoy (英語)

「ページフォルト」は、実行中のプログラムがプロセスの仮想アドレス空間にマップされていないメモリーページにアクセスしたときに発生します。マッピングは、メモリー位置へのアクセスにかかる時間を短縮するため、トランスレーション・ルックアサイド・バッファー (TLB) をキャッシュとして使用して、メモリー管理ユニット (MMU) により処理されます。TLB ミスが発生すると、ページが実際にマップされていないプロセスにアクセスすることがあります。または、ページフォルト例外を発行して、ストレージデバイスからページコンテンツをロードする必要があります。ページフォルトは仮想メモリーを処理するための一般的なメカニズムですが、ページサイズが大きくなるためにアプリケーションのパフォーマンスに大きな影響を与えることがあります。

使用するもの

以下は、パフォーマンス解析シナリオで使用するハードウェアとソフトウェアのリストです。

  • アプリケーション: matrix アプリケーション。製品の <install-dir>/samples/en/C++ ディレクトリーに含まれています。このレシピでは、src/multiply.h の NUM 値を 2048 から 8192 に変更して行列のサイズを変更し、/linux ディレクトリーから make を実行して matrix アプリケーションをリビルドします。
  • パフォーマンス解析ツール: インテル® oneAPI ベース・ツールキット > インテル® VTune™ プロファイラー > マイクロアーキテクチャー全般、システム概要、メモリー消費解析タイプ

    • バージョン 2020 から、インテル® VTune™ Amplifier の名称がインテル® VTune™ プロファイラーに変わりました。
    • インテル® VTune™ プロファイラー・パフォーマンス解析クックブックのほとんどのレシピは、異なるバージョンのインテル® VTune™ プロファイラーにも適用できます。バージョンにより、わずかな調整が必要になる場合があります。
    • 最新バージョンのインテル® VTune™ プロファイラーは以下から入手できます。
  • オペレーティング・システム: Ubuntu* 18.04.1 LTS 64 ビット
  • CPU: インテル® Core™ i7-6700K プロセッサー

マイクロアーキテクチャー全般解析を使用して TLB ミスを特定する

アプリケーションのハードウェア・リソースの使用状況について詳細な情報を取得するには、マイクロアーキテクチャー全般解析を実行します。

  1. インテル® VTune™ プロファイラーを起動します。

    デフォルトでは、インテル® VTune™ プロファイラーは sample (matrix) プロジェクトを開きます。


    このプロジェクトが NUM=8192 で matrix アプリケーションを起動するように設定されていることを確認してください。設定されていない場合、新しいプロジェクトを作成してください。

  2. [ようこそ] ページの [Configure Analysis… (解析の設定…)] ボタンをクリックします。

    [Configure Analysis (解析の設定)] ウィンドウが表示されます。

  3. [HOW (どのように)] ペインで、下矢印ボタンをクリックして [Microarchitecture (マイクロアーキテクチャー)] 解析グループから [Microarchitecture Exploration (マイクロアーキテクチャー全般)] を選択します。
  4. [Start (開始)] ボタンをクリックして、解析を実行します。

    インテル® VTune™ プロファイラーがデータを収集し、アプリケーション・レベルの統計を含む [Summary (サマリー)] ウィンドウを開きます。

TLB ミスに起因するバックエンド依存問題を調べます。

[DTLB Overhead (DTLB オーバーヘッド)] メトリックは TLB ミスのパフォーマンス・ペナルティーを推定します。ほとんどのオーバーヘッドは、セカンドレベル TLB (STLB) にヒットしたファーストレベル (DTLB) のミスをカウントする [Load STLB Hit (ロード STLB ヒット)] メトリックによるものです。ハードウェア・ページウォークを実行するサイクルの一部を表す [Load STLB Miss (ロード STLB ミス)] メトリックの値は大きくありません。これらのメトリックは、ページフォルト例外内で費やされた時間を考慮していないことに注意してください。そのため、マイクロアーキテクチャー全般解析は TLB 関連の問題の診断には役立ちますが、アプリケーションの経過時間に対するページフォルト例外の影響は推定できません。

システム概要解析を使用してカーネル・アクティビティーをトレースする

ページフォルトは、Linux* カーネルによりキャッチされた割り込みがトリガーとなります。Linux* カーネル内で費やされた正確な CPU 時間を測定するには、より詳細な解析が必要です。[Hardware Tracing (ハードウェア・トレース)] モードのシステム概要解析は、インテル® Processor Trace テクノロジーを使用して、CPU コアのすべてのリタイアした分岐命令をキャプチャーします。特に、この解析により、割り込みを含むすべてのカーネル・アクティビティーの正確なトレースが可能になります。

[Launch Application (アプリケーションを起動)] ターゲット設定を使用しても、この解析はシステム全体のデータ収集を実行します。

大量の分岐命令のため、この解析は多くのローデータを収集します。コマンドラインから解析を起動して、データ収集範囲を最初の 3 秒間に制限できます。

vtune -collect system-overview -knob collecting-mode=hw-tracing -d 3 -r matrix-so ./matrix


vtune コマンドライン・インターフェイスを起動する前に、製品のインストール・ディレクトリーから source env/vars.sh コマンドを実行して環境変数を設定してください。

インテル® VTune™ プロファイラー GUI で結果を開きます。

vtune-gui ./matrix-so

結果を開いたら、[Platform (プラットフォーム)] タブに切り替え、ドロップダウン・メニューを使用して matrix プロセスで収集したデータをフィルタリングします。

オーバータイム・ビューを提供する [Timeline (タイムライン)] ペインから、ほとんどの CPU 時間が multiply 関数を実行する matrix モジュール内で費やされていることが分かります。この関数は継続的に実行されず、通常、数ミリ秒で中断され、最大の割り込みがページフォルトにより発生しています。

グリッドビューから、サンプル・アプリケーションが Linux* カーネル内で費やした時間は 6.1% であり、439K のカーネルエントリーがアプリケーション実行の最初の 3 秒以内に発生していることが分かります。この問題を解決するため、ヒュージページを使用することを検討します。

メモリー消費解析を使用して割り当てメモリーの量を計算する

ヒュージページに切り替えるには、必要なページを定義します。このために、アプリケーションが割り当てるメモリーの量を計算します。matrix のような単純なアプリケーションでは、ソースコードを調べるだけでかまいません。より複雑なアプリケーションでは、[Memory Consumption (メモリー消費)] 解析を使用することを検討してください。この解析は、正確な割り当てメモリーのサイズを提供し、ヒュージページを使用する必要があるオブジェクトを識別します。

  1. [Configure Analysis (解析の設定)] をクリックして matrix プロジェクトの設定を開きます。
  2. [HOW (どのように)] ペインで、下矢印ボタンをクリックして [Hotspots (ホットスポット)] 解析グループから [Memory Consumption (メモリー消費)] を選択します。
  3. [Minimal dynamic memory object size to track (追跡する最小動的メモリー・オブジェクト・サイズ)] オプションの値を 1 に変更します。
  4. [Start (開始)] ボタンをクリックして、解析を実行します。

    インテル® VTune™ プロファイラーがデータを収集し、アプリケーション・レベルの統計を含む [Summary (サマリー)] ウィンドウを開きます。

  5. [Bottom-up (ボトムアップ)] タブをクリックします。[Allocation Size (割り当てサイズ)] カラムを右クリックして、[Show Data As (データを表示)] > [Counts (カウント)] をバイト表現に選択します。

  6. グリッドを再度右クリックして [Select All (すべて選択)] を選択して (または Ctrl + A キーを押して)、合計割り当てサイズを確認します。

    アプリケーションは 2147557472 バイト割り当てています。

ヒュージページを使用してページフォルトを軽減する

デフォルトでは、ページサイズは 4KB です。ヒュージページでは、デフォルトのページサイズは 2MB で、1GB まで増やすことができます。libhugetlbfs (英語) を使用すると、ヒュージページに簡単に切り替えることができます。

まず、必要な 2MB ページの数を計算する必要があります。サンプルの matrix アプリケーションは 2147557472 バイト割り当てています。つまり、2147557472 / 2097152 = 1025 の 2MB ページが必要になります (切り上げ)。

ヒュージページに切り替えるには、次の操作を行います。

  1. ページの数を設定します。
    sudo hugeadm --pool-pages-min 2Mb:1025
    
  2. 次の内容で matrix.sh スクリプトを作成します。
    #!/bin/bash
    LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes ./matrix
    
  3. スクリプトを実行可能にします。
    chmod u+x ./matrix.sh
    
  4. システム概要解析を再度実行します。
    vtune -collect system-overview -knob collecting-mode=hw-tracing -d 3 -r matrix-so-hp ./matrix.sh
    
  5. インテル® VTune™ プロファイラー GUI で結果を開きます。
    vtune-gui ./matrix-so-hp
    

[Platform (プラットフォーム)] ビューを確認します。カーネル CPU 時間が 3.3% 短縮され、カーネルモードのエントリーが 8.1 倍削減されました。

ヒュージページに切り替えることにより、コードを変更することなく、matrix アプリケーションの所要時間が 106.4 秒から 100.5 秒に (約 5%) 短縮されました。

関連情報

ハードウェア問題のマイクロアーキテクチャー全般解析
システム概要解析
メモリー消費解析


製品および性能に関する情報

1 性能は、使用状況、構成、その他の要因によって異なります。詳細については、http://www.intel.com/PerformanceIndex/ (英語) を参照してください。

関連記事