

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EFS パフォーマンスのヒント
<a name="performance-tips"></a>

Amazon EFS を使用する場合は、次のパフォーマンスのヒントに留意してください。

## 平均 I/O サイズ
<a name="efs-perf-avg-io-size"></a>

Amazon EFS は分散型であるため、可用性、耐久性、およびスケーラビリティが高いレベルで実現されています。分散型のアーキテクチャによって、それぞれのファイル操作のレイテンシーオーバーヘッドも小さくなります。このオペレーションあたりのレイテンシーの影響で、オーバーヘッドがより多くのデータ量に分散されるため、通常は平均 I/O サイズの増加に応じて全体のスループットが向上します。

## 高いスループットと IOPS を必要とするワークロードの最適化
<a name="recs-intensive-workloads"></a>

高いスループットと IOPS を必要とするワークロードには、汎用パフォーマンスモードとエラスティックスループットで構成されたリージョンファイルシステムを使用します。

**注記**  
頻繁にアクセスされるデータに対して最大読み取り IOPS を実現にするには、ファイルシステムでエラスティックスループットを使用する必要があります。

最高レベルのパフォーマンスを実現するには、アプリケーションまたはワークロードを以下のように設定して並列化を活用する必要があります。

1. 使用中のクライアントの数と少なくとも同じ数のディレクトリを使用して、すべてのクライアントとディレクトリにワークロードを均等に分散します。

1. 個々のスレッドを個別のデータセットやファイルに配置することで、競合を最小限に抑えます。

1. 10 個以上の NFS クライアントにワークロードを分散し、1 つのマウントターゲットで 1 クライアントあたり少なくとも 64 スレッドにします。

## 同時接続
<a name="efs-perf-sim-connections"></a>

Amazon EFS ファイルシステムは、最大数千の Amazon EC2 およびその他の AWS コンピューティングインスタンスに同時にマウントできます。より多くのインスタンス間でアプリケーションの並列化が可能である場合、コンピューティングインスタンス全体でファイルシステムのスループットレベルを向上させることができます。

## リクエストモデル
<a name="efs-perf-request-model"></a>

ファイルシステムへの非同期書き込みを有効にすることにより、保留中の書き込みオペレーションは、非同期で Amazon EFS に書き込まれる前に、Amazon EC2 インスタンスでバッファリングされます。非同期書き込みは、通常レイテンシーが低くなります。非同期書き込みを実行するとき、カーネルはキャッシュの追加のメモリを使用します。

同期書き込みが有効になっているファイルシステム、またはキャッシュをバイパスするオプション (たとえば、`O_DIRECT`) を使用してファイルを開く場合、Amazon EFS に対して同期リクエストが発行されます。各オペレーションはクライアントと Amazon EFS の間のラウンドトリップを通過します。

**注記**  
選択したリクエストモデルでは、整合性 (複数の Amazon EC2 インスタンスを使用している場合) と速度にトレードオフがあります。同期書き込みを使用すると、次のリクエストを処理する前に各書き込みリクエストトランザクションを完了できるため、データ整合性が高まります。非同期書き込みを使用すると、保留中の書き込みオペレーションをバッファリングすることでスループットが向上します。

## NFS クライアントマウント設定
<a name="efs-perf-nfs-client-mnt-settings"></a>

[EFS ファイルシステムをマウントする](mounting-fs.md) および [Linux でのマウントに関する考慮事項](mounting-fs-mount-cmd-general.md) で説明されている推奨マウントオプションを使用していることを確認します。

Amazon EC2 インスタンスにファイルシステムをマウントする場合、Amazon EFS はネットワークファイルシステムバージョン 4.0 および 4.1 (NFSv4) プロトコルをサポートします。NFSv4.1 は、NFSv4.0 (1,000 ファイル/秒未満) と比較して、並列小ファイル読み取りオペレーション (10,000 ファイル/秒以上) のパフォーマンスが向上しています。macOS Big Sur を実行している Amazon EC2 macOS インスタンスでは、NFSv4.0 のみがサポートされています。

次のマウントオプションは使用しないでください。
+ `noac`、`actimeo=0`、`acregmax=0`、`acdirmax=0` — これらのオプションは属性キャッシュを無効にするため、パフォーマンスに非常に大きな影響を与えます。
+ `lookupcache=pos`、`lookupcache=none` — これらのオプションはファイル名検索キャッシュを無効にします。これはパフォーマンスに非常に大きな影響を与えます。
+ `fsc` — このオプションはローカルファイルキャッシュを有効にしますが、NFS キャッシュの一貫性は変更されず、レイテンシーも短縮されません。

**注記**  
ファイルシステムをマウントする際には、NFS クライアントの読み取りバッファと書き込みバッファのサイズを 1 MB に増やすことを検討してください。

## スモールファイルのパフォーマンスを最適化する
<a name="optimize-open-close"></a>

ファイルの再オープンを最小限に抑え、並列処理を増やし、可能な限り参照ファイルをバンドルすることで、小容量ファイルのパフォーマンスを向上させることができます。
+ サーバーとの往復回数を最小限に抑えます。

  後にワークフローで必要になる場合、不必要にファイルを閉じないでください。ファイル記述子を開いたままにしておくと、キャッシュ内のローカルコピーに直接アクセスできます。ファイルのオープン、クローズ、メタデータのオペレーションは、通常、非同期的に行うことも、パイプラインを介して行うこともできません。

  小さいファイルの読み取りまたは書き込みでは、2 回のラウンドトリップが余分に必要になります。

  1 回のラウンドトリップ (ファイルを開く、ファイルを閉じる) には、メガバイトのバルクデータの読み取りまたは書き込みと同じくらいの時間がかかる場合があります。計算ジョブの開始時に入力ファイルまたは出力ファイルを 1 回開き、ジョブの実行中ずっと開いたままにしておくほうが効率的です。
+ 並列処理を使用すると、ラウンドトリップタイムの影響を軽減できます。
+ 参照ファイルを `.zip` のファイルにまとめます。アプリケーションによっては、ほとんど読み取り専用の小さな参照ファイルを大量に使用している場合があります。これらを `.zip` のファイルにバンドルすると、1 回のオープン/クローズの往復で多数のファイルを読み取ることができます。

  `.zip` 形式では、個々のファイルにランダムにアクセスできます。

## ディレクトリパフォーマンスの最適化
<a name="optimize-directories"></a>

同時に変更される非常に大きなディレクトリ (10 万ファイル以上) に対して一覧表示 (**ls**) を実行すると、Linux NFS クライアントが応答を返さずにハングアップすることがあります。この問題は Amazon Linux 2 カーネル 4.14、5.4、5.10 に移植されたカーネル 5.11 では修正されています。

可能であれば、ファイルシステムのディレクトリ数を 10,000 未満に抑えることをお勧めします。可能な限りネストされたサブディレクトリを使用します。

ディレクトリを一覧表示する際は、ファイル属性はディレクトリ自体に保存されていないため、必要ない場合には取得を避けます。

## NFS を最適化する read\$1ahead\$1kb サイズ
<a name="efs-perf-optimize-nfs-read-ahead"></a>

NFS `read_ahead_kb` 属性は、シーケンシャル読み取りオペレーション中に Linux カーネルが先読みまたはプリフェッチするキロバイト数を定義します。

5.4.\$1 より前のバージョンの Linux カーネルでは、`read_ahead_kb` の値は、`NFS_MAX_READAHEAD` に `rsize` の値 (マウントオプションで設定されたクライアント設定の読み取りバッファサイズ) を乗じて設定されます。[推奨されるマウントオプション](mounting-fs-mount-cmd-general.md)を使用する場合、この式は `read_ahead_kb` を15MBに設定します。

**注記**  
Linux カーネルバージョン 5.4.\$1 以降、Linux NFS クライアントは、デフォルトの `read_ahead_kb` の値である 128 KB を使用します。この値を 15 MB に増やすことをお勧めします。

`amazon-efs-utils` バージョン 1.33.2 以降で利用可能な Amazon EFS マウントヘルパーは、ファイルシステムをマウントした後、`read_ahead_kb` の値を 15 \$1 `rsize`、または 15 MB に自動的に変更します。

Linux カーネル 5.4 以降では、マウントヘルパーを使用してファイルシステムをマウントしない場合は、パフォーマンスを向上させるために `read_ahead_kb` を手動で 15 MB に設定することを検討してください。ファイルシステムをマウントした後、次のコマンドを使用して `read_ahead_kb` 値をリセットできます。コマンドを使用する前に、次の値を置き換えます。
+ `read-ahead-value-kb` を希望するサイズ (キロバイト単位) に置き換えます。
+ ファイルシステムのマウントポイントで `efs-mount-point` を置き換えます。

```
device_number=$(stat -c '%d' efs-mount-point)
((major = ($device_number & 0xFFF00) >> 8))
((minor = ($device_number & 0xFF) | (($device_number >> 12) & 0xFFF00)))
sudo bash -c "echo read-ahead-value-kb > /sys/class/bdi/$major:$minor/read_ahead_kb"
```

たとえば、次の例では、 `read_ahead_kb` サイズを 15 MB に設定します。

```
device_number=$(stat -c '%d' efs)
((major = ($device_number & 0xFFF00) >> 8))
((minor = ($device_number & 0xFF) | (($device_number >> 12) & 0xFFF00)))
sudo bash -c "echo 15000 > /sys/class/bdi/$major:$minor/read_ahead_kb"
```