afp_lantest

afp_lantest – AFP LAN パフォーマンスおよびディレクトリキャッシュのテストツール

概要

afp_lantest [-34567bcGgKVv] [-A uam] [-h host] [-p port] [-s volume] [-u user] [-w password] [-n iterations] [-f tests] [-F bigfile]

説明

afp_lantest は、ディレクトリキャッシュのパフォーマンスを含めて AFP (Apple Filing Protocol) サーバーの 様々な側面をベンチマークするために設計された包括的な AFP パフォーマンステストツールである。

このツールは、ファイル操作、ディレクトリトラバーサル、キャッシュ効率を測定する一連のテストを実行する。従来のファイルシステムベンチマークに加え、最適化されたディレクトリキャッシュ検証と確率的検証機能の利点を強調する、キャッシュに特化したテストも含まれている。

オプション

-3 : AFP 3.0プロトコルバージョンを使用する

-4 : AFP 3.1プロトコルバージョンを使用する

-5 : AFP 3.2プロトコルバージョンを使用する

-6 : AFP 3.3プロトコルバージョンを使用する

-7 : AFP 3.4プロトコルバージョンを使用する

-A uam : 指定された UAM 名またはエイリアスで認証を選択する。 レガシーの ClearTxt ログインパスには clrtxt、DHCAST128 には dhx、DHX2 には dhx2 を使用する。

-b : デバッグモード

-c : 結果をCSV形式で出力する(デフォルト: 表形式)

-F bigfile : 読み取りテストにはボリュームのルート内の既存のファイルを使用する (ファイルサイズは -g/-G オプションと一致する必要がある)

-f tests : 実行する特定のテストを数字で指定する(例:「134」はテスト 1、3、4 を実行する)

-G : 10ギガビットネットワーク向けに最適化 (ファイルのテストサイズが10GBに増加)

-g : ギガビットネットワーク向けに最適化 (ファイルのテストサイズを1GBに増加)

-h host : サーバーのホスト名またはIPアドレス(デフォルト: localhost)

-K : キャッシュに重点を置いたテストのみを実行する(テスト14~17)

-n iterations : 実行するテスト反復回数(デフォルト: 2)。反復回数が5回を超える場合、外れ値は削除される

-p port : サーバーポート番号(デフォルト: 548)

-s volume : テスト用にマウントするボリューム名

-u user : AFPサーバーの認証用のユーザー名(デフォルト: 現在のuid)

-V : 超詳細出力

-v : 詳細出力

-w password : AFPサーバーの認証用のパスワード

設定

デフォルトでは、テストランナーは ClearTxt を使用する。-A clrtxt は同じレガシーログインパスを明示的に選択する。-A dhx または -A dhx2 を渡すと、対応するネイティブ暗号化 UAM を使用する。選択した UAM は netatalk の afp.conf で設定する:

[Global]
uam list = uams_dhx.so uams_dhx2.so uams_clrtxt.so

利用可能なテスト

以下のテストが利用可能

ほとんどのテストは、2000個のアイテムの共有セットで動作し、各テストのタイミングを比較可能にするために2000ユーザーアクションに正規化されている。テスト3および5~12は、同じ2000ファイル上でパイプラインを形成する(作成、書き込み、読み取り、コピー、サーバーコピー、stat、列挙、ロック、削除)。それらのいずれかを選択すると、テスト3が暗黙的に含まれる。テスト4は同じサイズのディレクトリツリーを作成するため、2つの作成ワークロードは並べて読み取ることができる。

各テストの AFP 操作数は、タイミング領域のみをカバーしており、セットアップおよびクリーンアップ操作(タイミング外としてマークされている)は、タイミングおよびカウントから除外される。

(1) 1つの大きなファイルの書き込み : 持続的な書き込みパフォーマンスを測定する。タイミング: 約100の量子サイズの FPWriteExt コールと最終的な FPCloseFork [103 AFP 操作]。 タイミング外のセットアップ: FPCreateFile、FPGetFileDirParms x2、FPOpenFork、FPGetForkParms。

(2) 1つの大きなファイルの読み込み : 持続的な読み取りパフォーマンスを測定する。タイミング: 約100の量子サイズの FPReadExt コールと最終的な FPCloseFork [102 AFP 操作]。 タイミング外のセットアップ: FPGetFileDirParms、FPOpenFork、FPGetForkParms。

(3) 2000個のファイルの作成 : ファイル作成のパフォーマンスをテストする。タイミング、ファイルごとに: FPCreateFile + FPGetFileDirParms [2 x 2000 = 4,000 AFP 操作]。

(4) 2000個のディレクトリツリーの作成 (20×9×10) : ネストされたディレクトリの作成をテストする(20 × 9 × 10 レベル = 2000 ディレクトリ、 他の 2000アクションテストと整合)。タイミング: ディレクトリごとに FPCreateDir [2,000 AFP 操作]。 タイミング外のクリーンアップ: ディレクトリごとに FPDelete。

(5) 2000個のファイルを開き、1024バイトを書き込み、閉じる : ファイルごとの完全な小さな書き込みライフサイクルをテストする(テスト3を暗黙的に含む)。 タイミング、ファイルごとに: FPOpenFork + FPWrite + FPCloseFork [3 x 2000 = 6,000 AFP 操作]。

(6) 2000個のファイルを開き、1024バイトを読み込み、閉じる : 実際のクライアントがファイルごとに支払う完全な小さな読み取りライフサイクルをテストする。 各オープンおよびクローズによって行われるロック管理を含む(テスト3、4を暗黙的に含む)。 テスト5のタイミング付きのオープン+書き込み+クローズを反映しており、 テスト5が書き込んだ完全な1024バイトを読み戻すため、読み取りと書き込みの結果は直接比較可能である。 タイミング、ファイルごとに: FPOpenFork + FPRead + FPCloseFork [3 x 2000 = 6,000 AFP 操作]。

(7) クライアント側で1000個のファイルをコピーする (R+W) : サーバー側のコピーを行わないファイルマネージャーのように、クライアントが各ファイルのデータを読み取り、 新しいファイルに書き戻すコピーをテストする(テスト3、4を暗黙的に含む)。 1000回のコピー = 1000回の読み取り + 1000回の書き込み、したがって合計は他の2000アクションテストと整合する。 タイミング、ファイルごとに: FPOpenFork + FPRead + FPCloseFork をソースで実行し、 その後、FPCreateFile + FPOpenFork + FPWrite + FPCloseFork をコピーで実行する [7 x 1000 = 7,000 AFP 操作]。 タイミング外のクリーンアップ: コピーごとに FPDelete。

(8) サーバー側で2000個のファイルをコピーする : データがワイヤーを通過しない FPCopyFile をテストする(テスト3、4を暗黙的に含む)。 タイミング、ファイルごとに: FPCopyFile [1 x 2000 = 2,000 AFP 操作]。タイミング外のクリーンアップ: コピーごとに FPDelete。テスト7と比較して、往復の節約を確認する。

(9) 2000個のファイルをStat(lookup+getparams)する : ファイルのルックアップとメタデータクエリのパフォーマンスをテストする(テスト3を暗黙的に含む)。 タイミング、ファイルごとに: 最小限のルックアッププローブと1つの完全なビットマップ FPGetFileDirParms リクエスト [2 x 2000 = 4,000 AFP 操作]。

(10) 2000個のファイルを含むディレクトリを列挙する : 多くのファイルを含むディレクトリの列挙をテストする(テスト3を暗黙的に含む)。タイミング: 2000ファイルのディレクトリに対して40エントリのチャンクで FPEnumerateExt2 を実行する [約51 AFP 操作]。

(11) 2000個のオープンフォークをロックしてからアンロックする : フルオープンフォークテーブルに対するrefnumのルックアップとロックのセットアップをテストする(テスト3を暗黙的に含む)。 タイミング: 各フォークで FPByteRangeLock のロック +アンロック [2 x 2000 = 4,000 AFP 操作]。 タイミング外: FPOpenFork x2000 のセットアップ、FPCloseFork x2000 のクリーンアップ。

(12) 2000個のファイルを削除する : ファイル削除のパフォーマンスをテストする(テスト3を暗黙的に含む)。 タイミング、ファイルごとに: FPDelete [1 x 2000 = 2,000 AFP 操作]。

(13) 1つのフォークで2000個の範囲をバイト範囲ロック/アンロックする : 多くのロックが同時に保持されている場合のフォークごとのバイト範囲ロック追跡をテストする。タイミング: 単一のフォークで異なる範囲に対して FPByteRangeLock のロック x2000 その後アンロック x2000 [4,000 AFP 操作]。 タイミング外: ファイルの作成/書き込み/オープンのセットアップとクリーンアップ。

(14) ディレクトリキャッシュヒット [CACHE] : ディレクトリとファイルのルックアップパフォーマンスをテストする(20ディレクトリ x 100ファイル)。タイミング: ディレクトリごとおよびファイルごとに FPGetFileDirParms [2,020 AFP 操作]。 タイミング外: FPCreateDir/FPCreateFile のセットアップ、FPDelete のクリーンアップ。

(15) 混合キャッシュ操作 [CACHE] : 500個のファイルに対するキャッシュライフサイクルをテストする。 各ファイルに対して4つのユーザーアクション(作成/統計/統計/削除 = 2000アクション; 自己完結)。 タイミング、ファイルごとに: FPCreateFile + FPGetFileDirParms + FPGetFileDirParms + FPDelete、さらに10番目のファイルごとに FPEnumerate [4 x 500 + 50 = 2,050 AFP 操作]。

(16) 深いパスのトラバーサル [CACHE] : 20レベルの深いディレクトリツリーの100回のウォークをテストする。タイミング: 各ウォークごとに各レベルで FPGetFileDirParms [20 x 100 = 2,000 AFP 操作]。 タイミング外: FPCreateDir のセットアップ、FPDelete のクリーンアップ。

(17) キャッシュの検証 [CACHE] : 500個のファイルに対するホットキャッシュの再検証をテストする。 各ファイルに対して4回の繰り返しルックアップ(2000ユーザーアクション)。 タイミング、ファイルごとに: 4回の FPGetFileDirParms メタデータルックアップ [4 x 500 = 2,000 AFP 操作]。 タイミング外: FPCreateFile のセットアップ、FPDelete のクリーンアップ。

キャッシュ重視のテスト

テスト14~17は、netatalkにおけるディレクトリキャッシュのパフォーマンス向上に焦点を当てて設計されている。これらのテストは、最適化されたキャッシュ検証機能と確率的検証機能の恩恵を大きく受けている。これらのキャッシュ重視のテストのみを実行するには、-K オプションを使用してください。

例

すべてのテストをデフォルト設定で実行する

afp_lantest -h server.example.com -u testuser -w password -s TestVolume

キャッシュに重点を置いたテストのみを実行する

afp_lantest -K -h server.example.com -u testuser -w password -s TestVolume

特定のテストを実行する(ファイル操作)

afp_lantest -f 123 -h server.example.com -u testuser -w password -s TestVolume

ギガビットネットワークに最適化されたテストを実行する

afp_lantest -g -h server.example.com -u testuser -w password -s TestVolume

統計分析のために複数の反復を実行する

afp_lantest -n 5 -h server.example.com -u testuser -w password -s TestVolume

IO監視の例

IO監視 (Linuxのみ) には、hidepid=0 で /proc_io にマウントされた proc ファイルシステムが必要である。gid を afp_lantest を実行するユーザーのグループIDに設定する。

例えば、rootとして実行するには、mkdir -p /proc_io && mount -t proc -o hidepid=0,gid=0 proc /proc_io とする。

afp_lantest -n 2 -7 -h 127.0.0.1 -p 548 -u test -w test -s 'File Sharing'
Connecting to host 127.0.0.1:548
IO monitoring: /proc_io is available
Found cnid_dbd process for user 'test': PID 46
Found privilege-dropped afpd process for user 'test': PID 41
IO monitoring enabled (afpd: 41, cnid_dbd: 46)

Run 1 => Writing one large file [103 AFP ops]                                   42 ms for 100 MB (avg. 2496 MB/s)
         IO Operations; afpd: 101 READs, 301 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Reading one large file [102 AFP ops]                                   19 ms for 100 MB (avg. 5518 MB/s)
         IO Operations; afpd: 277 READs, 176 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Creating 2000 files [4,000 AFP ops]                                   444 ms
         IO Operations; afpd: 4000 READs, 6000 WRITEs | cnid_dbd: 4 READs, 4151 WRITEs
Run 1 => Create 2000 dirs tree (20×9×10) [2,000 AFP ops]                       398 ms
         IO Operations; afpd: 2000 READs, 6000 WRITEs | cnid_dbd: 4 READs, 4155 WRITEs
Run 1 => Open, write 1024 bytes, close 2000 files [6,000 AFP ops]              267 ms
         IO Operations; afpd: 6000 READs, 8000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Open, read 1024 bytes, close 2000 files [6,000 AFP ops]               258 ms
         IO Operations; afpd: 8000 READs, 4000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Copying 1000 files client-side (R+W) [7,000 AFP ops]                  363 ms
         IO Operations; afpd: 8000 READs, 8000 WRITEs | cnid_dbd: 2 READs, 2101 WRITEs
Run 1 => Copying 2000 files server-side [2,000 AFP ops]                        503 ms
         IO Operations; afpd: 6000 READs, 8000 WRITEs | cnid_dbd: 4 READs, 4143 WRITEs
Run 1 => Stat (lookup+getparams) 2000 files [4,000 AFP ops]                    155 ms
         IO Operations; afpd: 4000 READs, 4000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Enumerate dir with 2000 files [~51 AFP ops]                             3 ms
         IO Operations; afpd: 49 READs, 49 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Lock then unlock 2000 open forks [4,000 AFP ops]                      155 ms
         IO Operations; afpd: 4000 READs, 4000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Deleting 2000 files [2,000 AFP ops]                                   440 ms
         IO Operations; afpd: 2000 READs, 8000 WRITEs | cnid_dbd: 7 READs, 6186 WRITEs
Run 1 => Byte-range lock/unlock 2000 ranges in one fork [4,000 AFP ops]        157 ms
         IO Operations; afpd: 4000 READs, 4000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Directory cache hits (20 dirs x 100 files) [2,020 AFP ops]             70 ms
         IO Operations; afpd: 2020 READs, 2020 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Mixed cache operations (create/stat/enum/delete) on 500 files [2,     191 ms
         IO Operations; afpd: 2050 READs, 4050 WRITEs | cnid_dbd: 4 READs, 2537 WRITEs
Run 1 => Deep path traversal (20 levels x 100 walks) [2,000 AFP ops]            72 ms
         IO Operations; afpd: 2000 READs, 2000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Run 1 => Cache validation (500 files x 4 lookups) [2,000 AFP ops]               77 ms
         IO Operations; afpd: 2000 READs, 2000 WRITEs | cnid_dbd: 0 READs, 0 WRITEs
Successfully deleted test directory 'LanTest-40'

Netatalk Lantest Results (Averages and standard deviations (±) for all tests, across 2 iterations (default))
============================================================================================================

Test                                                                Time_ms  Time± AFPD_R AFPD_R± AFPD_W AFPD_W± CNID_R CNID_R± CNID_W CNID_W±   MB/s
------------------------------------------------------------------ -------- ------ ------ ------- ------ ------- ------ ------- ------ ------- ------
Writing one large file [103 AFP ops]                                     40    2.2    101     0.0    300     1.0      0     0.0      0     0.0   2500
Reading one large file [102 AFP ops]                                     17    2.2    273     5.0    172     5.0      0     0.0      0     0.0   5882
Creating 2000 files [4,000 AFP ops]                                     407   51.6   4000     0.0   6000     0.0      4     0.0   4138    18.4      0
Create 2000 dirs tree (20×9×10) [2,000 AFP ops]                         375   38.2   2000     0.0   6000     0.0      3     1.4   4150    62.9      0
Open, write 1024 bytes, close 2000 files [6,000 AFP ops]                261    7.8   6000     0.0   8000     0.0      0     0.0      0     0.0      0
Open, read 1024 bytes, close 2000 files [6,000 AFP ops]                 260    2.8   8000     0.0   4000     0.0      0     0.0      0     0.0      0
Copying 1000 files client-side (R+W) [7,000 AFP ops]                    337   37.5   8000     0.0   8000     0.0      3     1.4   2127    18.8      0
Copying 2000 files server-side [2,000 AFP ops]                          448   77.8   6000     0.0   8000     0.0      4     0.0   4137     7.8      0
Stat (lookup+getparams) 2000 files [4,000 AFP ops]                      155    1.0   4000     0.0   4000     0.0      0     0.0      0     0.0      0
Enumerate dir with 2000 files [~51 AFP ops]                               3    1.0     49     0.0     49     0.0      0     0.0      0     0.0      0
Lock then unlock 2000 open forks [4,000 AFP ops]                        153    2.2   4000     0.0   4000     0.0      0     0.0      0     0.0      0
Deleting 2000 files [2,000 AFP ops]                                     416   33.2   2000     0.0   8000     0.0      5     2.2   6187     1.4      0
Byte-range lock/unlock 2000 ranges in one fork [4,000 AFP ops]          155    2.2   4000     0.0   4000     0.0      0     0.0      0     0.0      0
Directory cache hits (20 dirs x 100 files) [2,020 AFP ops]               70    1.0   2020     0.0   2020     0.0      0     0.0      0     0.0      0
Mixed cache operations (create/stat/enum/delete) on 500 files [2,050 AFP ops]      190    1.4   2050     0.0   4050     0.0      4     0.0   2545    11.3      0
Deep path traversal (20 levels x 100 walks) [2,000 AFP ops]              72    0.0   2000     0.0   2000     0.0      0     0.0      0     0.0      0
Cache validation (500 files x 4 lookups) [2,000 AFP ops]                 77    2.8   2000     0.0   2000     0.0      0     0.0      0     0.0      0
------------------------------------------------------------------ -------- ------ ------ ------- ------ ------- ------ ------- ------ ------- ------
Sum of all AFP OPs = 49326                                             3436         56493          70591             23          23284

Aggregates Summary:
------------------------------------------------------------------
Average Time per AFP OP: 63 µs (from per-test medians)
Average AFPD Reads per AFP OP: 1.129
Average AFPD Writes per AFP OP: 1.354
See afp_lantest manpage for more information: https://netatalk.io/manual/en/afp_lantest.1

Dircache Statistics (/var/log/afpd.log):
------------------------------------------------------------------
Jul 12 06:42:28.768144 afpd[41] {dircache.c:2074} (info:AFPDaemon): dircache statistics (ARC): (user: test) entries: 0, ghost_entries: 0, max_entries: 4001 (750 KB), config_max: 65536, lookups: 310256, hits: 281770 (90.8%), ghost_hits: 0 (0.0%), total_hits: (90.8%), misses: 28486 (9.2%), validations: 2819 (1.0%), added: 20305, removed: 20305, expunged: 181, invalid_on_use: 181, evicted: 0, validation_freq: 100

IO監視結果の列

Time(ms) = ミリ秒単位のテスト実行時間
Time±    = テスト実行時間の標準偏差
AFPD_R   = afpd プロセスの IO 読み取り操作
AFPD_R±  = afpd プロセスの IO 読み取り操作の標準偏差
AFPD_W   = afpd プロセスの IO 書き込み操作
AFPD_W±  = afpd プロセスの IO 書き込み操作の標準偏差

CNID_*   = cnid_dbd プロセスの IO 測定値(オプション)

注意: afp_lantest で afpd の読み取り/書き込み IO を測定する場合、afp.conf の log level が default:error に設定されていることを確認すること。

IO監視集計サマリー

集計値は純粋に内在的な指標であり、AFP操作は読み取り、書き込み、および接続関連の操作の混合である。

したがって、測定値はそれ自体のコンテキスト内でのみ意味がある。これらは、それ自体に対する変更を評価する方法を提供するが、他のシステムとの比較のための外部の一貫性や参照点を欠いている。

一般に、1未満の値は効率的な操作を示し(例えば、バッチ処理やキャッシュなどによる)、1を超える値は最適でない操作を示す(例えば、単一の操作の増幅により、追加の下流操作が発生する)。

注意: 総AFP操作は読み取り、書き込み、その他の操作の混合であるため、効果的な1:1 (AFP:IO) 閾値は1と等しくない。正確な閾値は、テストごとにテストウィキに示されている情報を使用して計算し、関連するAFP読み取り/書き込み操作を関連するAFPD_R/AFPD_W値と比較することで求めることができる。

理想的には、コードの変更により集計値が減少することを確認する必要がある。

詳細については、Testing ウィキページ を参照してください。

復帰コード

0 : すべてのテストは成功した

1 : 1つ以上のテストが失敗した

注記

関連項目

afp_speedtest(1), afpd(8), netatalk(8)