NFSv3とディスクI/Oの相関関係の検証

## 背景

NFS（Network File System）はネットワークを介してファイルシステムにアクセスするためのプロトコルです。NFSを使用する際、NFSサーバのパフォーマンスと実際のディスクI/Oのパフォーマンスがどの程度一致するかを理解するために、NFSv3の操作数（nfsstatの値）とディスクI/O操作数（iostatの値）の相関関係を検証してみました。

## 検証環境

- **NFSサーバ**
  - OS: RHEL 9
  - 構成: 1台のHDDを使用
  - ホスト名: nfssv
  - IPアドレス: 192.168.11.48
  - NFS export用ディレクトリ: /srv/nfs
- **NFSクライアント**
  - OS: RHEL 9
  - ホスト名: nfscl
  - IPアドレス: 192.168.11.49
  - NFSサーバマウントポイント: /mnt/nfs

## 設定手順

### NFSサーバの設定

1.**NFSサーバのインストール**

```bash
sudo yum install -y nfs-utils
```

```bash
[root@nfssv ~]# yum install -y nfs-utils
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 1:54:05 前の 2024年07月13日 01時58分43秒 に実施 しました。
依存関係が解決しました。
================================================================================
 パッケージ      Arch    バージョン        リポジトリー                   サイズ
================================================================================
インストール:
 nfs-utils       x86_64  1:2.5.4-25.el9    rhel-9-for-x86_64-baseos-rpms  463 k
依存関係のインストール:
 gssproxy        x86_64  0.8.4-6.el9       rhel-9-for-x86_64-baseos-rpms  114 k
 keyutils        x86_64  1.6.3-1.el9       rhel-9-for-x86_64-baseos-rpms   78 k
 libev           x86_64  4.33-5.el9        rhel-9-for-x86_64-baseos-rpms   56 k
 libnfsidmap     x86_64  1:2.5.4-25.el9    rhel-9-for-x86_64-baseos-rpms   66 k
 libverto-libev  x86_64  0.3.2-3.el9       rhel-9-for-x86_64-baseos-rpms   15 k
 rpcbind         x86_64  1.2.6-7.el9       rhel-9-for-x86_64-baseos-rpms   62 k
 sssd-nfs-idmap  x86_64  2.9.4-6.el9_4     rhel-9-for-x86_64-baseos-rpms   46 k

トランザクションの概要
================================================================================
インストール  8 パッケージ

ダウンロードサイズの合計: 899 k
インストール後のサイズ: 2.1 M
パッケージのダウンロード:
(1/8): keyutils-1.6.3-1.el9.x86_64.rpm          197 kB/s |  78 kB     00:00
(2/8): libverto-libev-0.3.2-3.el9.x86_64.rpm     27 kB/s |  15 kB     00:00
(3/8): libev-4.33-5.el9.x86_64.rpm               98 kB/s |  56 kB     00:00
(4/8): gssproxy-0.8.4-6.el9.x86_64.rpm          506 kB/s | 114 kB     00:00
(5/8): libnfsidmap-2.5.4-25.el9.x86_64.rpm      260 kB/s |  66 kB     00:00
(6/8): nfs-utils-2.5.4-25.el9.x86_64.rpm        1.5 MB/s | 463 kB     00:00
(7/8): rpcbind-1.2.6-7.el9.x86_64.rpm           196 kB/s |  62 kB     00:00
(8/8): sssd-nfs-idmap-2.9.4-6.el9_4.x86_64.rpm  209 kB/s |  46 kB     00:00
--------------------------------------------------------------------------------
合計                                            871 kB/s | 899 kB     00:01
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
  準備中           :                                                        1/1
  インストール中   : libnfsidmap-1:2.5.4-25.el9.x86_64                      1/8
  scriptletの実行中: rpcbind-1.2.6-7.el9.x86_64                             2/8
  インストール中   : rpcbind-1.2.6-7.el9.x86_64                             2/8
  scriptletの実行中: rpcbind-1.2.6-7.el9.x86_64                             2/8
Created symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service → /usr/lib/systemd/system/rpcbind.service.
Created symlink /etc/systemd/system/sockets.target.wants/rpcbind.socket → /usr/lib/systemd/system/rpcbind.socket.

  インストール中   : keyutils-1.6.3-1.el9.x86_64                            3/8
  インストール中   : libev-4.33-5.el9.x86_64                                4/8
  インストール中   : libverto-libev-0.3.2-3.el9.x86_64                      5/8
  インストール中   : gssproxy-0.8.4-6.el9.x86_64                            6/8
  scriptletの実行中: gssproxy-0.8.4-6.el9.x86_64                            6/8
  scriptletの実行中: nfs-utils-1:2.5.4-25.el9.x86_64                        7/8
  インストール中   : nfs-utils-1:2.5.4-25.el9.x86_64                        7/8
  scriptletの実行中: nfs-utils-1:2.5.4-25.el9.x86_64                        7/8
  インストール中   : sssd-nfs-idmap-2.9.4-6.el9_4.x86_64                    8/8
  scriptletの実行中: sssd-nfs-idmap-2.9.4-6.el9_4.x86_64                    8/8
  検証中           : libev-4.33-5.el9.x86_64                                1/8
  検証中           : libverto-libev-0.3.2-3.el9.x86_64                      2/8
  検証中           : keyutils-1.6.3-1.el9.x86_64                            3/8
  検証中           : gssproxy-0.8.4-6.el9.x86_64                            4/8
  検証中           : libnfsidmap-1:2.5.4-25.el9.x86_64                      5/8
  検証中           : nfs-utils-1:2.5.4-25.el9.x86_64                        6/8
  検証中           : rpcbind-1.2.6-7.el9.x86_64                             7/8
  検証中           : sssd-nfs-idmap-2.9.4-6.el9_4.x86_64                    8/8
インストール済みの製品が更新されています。

インストール済み:
  gssproxy-0.8.4-6.el9.x86_64           keyutils-1.6.3-1.el9.x86_64
  libev-4.33-5.el9.x86_64               libnfsidmap-1:2.5.4-25.el9.x86_64
  libverto-libev-0.3.2-3.el9.x86_64     nfs-utils-1:2.5.4-25.el9.x86_64
  rpcbind-1.2.6-7.el9.x86_64            sssd-nfs-idmap-2.9.4-6.el9_4.x86_64

完了しました!
```

2.**iostatとnfsstatのインストール**

```bash
sudo yum install -y sysstat
```

```bash
[root@nfssv nfs]# sudo yum install -y sysstat
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 2:04:04 前の 2024年07月13日 01時58分43秒 に実施 しました。
依存関係が解決しました。
================================================================================
 パッケージ      Arch   バージョン       リポジトリー                     サイズ
================================================================================
インストール:
 sysstat         x86_64 12.5.4-7.el9     rhel-9-for-x86_64-appstream-rpms 485 k
依存関係のインストール:
 lm_sensors-libs x86_64 3.6.0-10.el9     rhel-9-for-x86_64-appstream-rpms  44 k
 pcp-conf        x86_64 6.2.0-2.el9_4    rhel-9-for-x86_64-appstream-rpms  32 k
 pcp-libs        x86_64 6.2.0-2.el9_4    rhel-9-for-x86_64-appstream-rpms 637 k

トランザクションの概要
================================================================================
インストール  4 パッケージ

ダウンロードサイズの合計: 1.2 M
インストール後のサイズ: 3.2 M
パッケージのダウンロード:
(1/4): pcp-conf-6.2.0-2.el9_4.x86_64.rpm        112 kB/s |  32 kB     00:00
(2/4): sysstat-12.5.4-7.el9.x86_64.rpm          1.4 MB/s | 485 kB     00:00
(3/4): lm_sensors-libs-3.6.0-10.el9.x86_64.rpm  113 kB/s |  44 kB     00:00
(4/4): pcp-libs-6.2.0-2.el9_4.x86_64.rpm        2.4 MB/s | 637 kB     00:00
--------------------------------------------------------------------------------
合計                                            2.2 MB/s | 1.2 MB     00:00
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
  準備中           :                                                        1/1
  インストール中   : pcp-conf-6.2.0-2.el9_4.x86_64                          1/4
  インストール中   : pcp-libs-6.2.0-2.el9_4.x86_64                          2/4
  インストール中   : lm_sensors-libs-3.6.0-10.el9.x86_64                    3/4
  インストール中   : sysstat-12.5.4-7.el9.x86_64                            4/4
  scriptletの実行中: sysstat-12.5.4-7.el9.x86_64                            4/4
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /usr/lib/systemd/system/sysstat.service.
Created symlink /etc/systemd/system/sysstat.service.wants/sysstat-collect.timer → /usr/lib/systemd/system/sysstat-collect.timer.
Created symlink /etc/systemd/system/sysstat.service.wants/sysstat-summary.timer → /usr/lib/systemd/system/sysstat-summary.timer.

  検証中           : lm_sensors-libs-3.6.0-10.el9.x86_64                    1/4
  検証中           : sysstat-12.5.4-7.el9.x86_64                            2/4
  検証中           : pcp-conf-6.2.0-2.el9_4.x86_64                          3/4
  検証中           : pcp-libs-6.2.0-2.el9_4.x86_64                          4/4
インストール済みの製品が更新されています。

インストール済み:
  lm_sensors-libs-3.6.0-10.el9.x86_64       pcp-conf-6.2.0-2.el9_4.x86_64
  pcp-libs-6.2.0-2.el9_4.x86_64             sysstat-12.5.4-7.el9.x86_64

完了しました!
```

3.**共有ディレクトリの作成と権限設定**

```bash
sudo mkdir -p /srv/nfs
sudo chown nobody:nobody /srv/nfs
sudo chmod 755 /srv/nfs
```

4.**エクスポート設定**

```bash
sudo vi /etc/exports
```

以下の行を追加：

```plaintext
/srv/nfs *(rw,sync,no_root_squash,no_subtree_check)
```

```bash
[root@nfssv etc]# pwd
/etc
[root@nfssv etc]# cat exports
/srv/nfs *(rw,sync,no_root_squash,no_subtree_check)
```

5.**NFSサーバの起動と有効化**

```bash
sudo systemctl enable nfs-server
sudo systemctl start nfs-server
```

```bash
[root@nfssv etc]# sudo systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service  → /usr/lib/systemd/system/nfs-server.service.
[root@nfssv etc]# sudo systemctl start nfs-server
[root@nfssv etc]# sudo systemctl status nfs-server
● nfs-server.service - NFS server and services
     Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; prese>
    Drop-In: /run/systemd/generator/nfs-server.service.d
             mqorder-with-mounts.conf
     Active: active (exited) since Sat 2024-07-13 03:56:30 JST; 5s ago
       Docs: man:rpc.nfsd(8)
             man:exportfs(8)
    Process: 33946 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SU>
    Process: 33947 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
    Process: 33967 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; the>
   Main PID: 33967 (code=exited, status=0/SUCCESS)
        CPU: 14ms

 7月 13 03:56:30 nfssv systemd[1]: Starting NFS server and s>
 7月 13 03:56:30 nfssv systemd[1]: Finished NFS server and s>
```

6.**NFSバージョンの設定**

NFSv3を使用するため、`/etc/sysconfig/nfs`に以下の行を追加：

```plaintext
RPCNFSDARGS="-N 4 -N 4.1"
```

```bash
[root@nfssv sysconfig]# pwd
/etc/sysconfig
[root@nfssv sysconfig]# cat nfs
RPCNFSDARGS="-N 4 -N 4.1"
```

これにより、NFSv3のみを使用するように設定します。

7.**ファイアウォールの設定**

```bash
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload
```

```bash
[root@nfssv sysconfig]# sudo firewall-cmd --permanent --add-service=nfs
success
[root@nfssv sysconfig]# sudo firewall-cmd --permanent --add-service=rpc-bind
success
[root@nfssv sysconfig]# sudo firewall-cmd --permanent --add-service=mountd
success
[root@nfssv sysconfig]# sudo firewall-cmd --reload
success
```

### NFSクライアントの設定

1.**NFSクライアントのインストール**

```bash
sudo yum install -y nfs-utils
```

```bash
[root@nfscl ~]# sudo yum install -y nfs-utils
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 1:59:56 前の 2024年07月13日 01時58分43秒 に実施 しました。
依存関係が解決しました。
================================================================================
 パッケージ      Arch    バージョン        リポジトリー                   サイズ
================================================================================
インストール:
 nfs-utils       x86_64  1:2.5.4-25.el9    rhel-9-for-x86_64-baseos-rpms  463 k
依存関係のインストール:
 gssproxy        x86_64  0.8.4-6.el9       rhel-9-for-x86_64-baseos-rpms  114 k
 keyutils        x86_64  1.6.3-1.el9       rhel-9-for-x86_64-baseos-rpms   78 k
 libev           x86_64  4.33-5.el9        rhel-9-for-x86_64-baseos-rpms   56 k
 libnfsidmap     x86_64  1:2.5.4-25.el9    rhel-9-for-x86_64-baseos-rpms   66 k
 libverto-libev  x86_64  0.3.2-3.el9       rhel-9-for-x86_64-baseos-rpms   15 k
 rpcbind         x86_64  1.2.6-7.el9       rhel-9-for-x86_64-baseos-rpms   62 k
 sssd-nfs-idmap  x86_64  2.9.4-6.el9_4     rhel-9-for-x86_64-baseos-rpms   46 k

トランザクションの概要
================================================================================
インストール  8 パッケージ

ダウンロードサイズの合計: 899 k
インストール後のサイズ: 2.1 M
パッケージのダウンロード:
(1/8): libverto-libev-0.3.2-3.el9.x86_64.rpm     47 kB/s |  15 kB     00:00
(2/8): keyutils-1.6.3-1.el9.x86_64.rpm          232 kB/s |  78 kB     00:00
(3/8): libev-4.33-5.el9.x86_64.rpm              164 kB/s |  56 kB     00:00
(4/8): gssproxy-0.8.4-6.el9.x86_64.rpm          408 kB/s | 114 kB     00:00
(5/8): libnfsidmap-2.5.4-25.el9.x86_64.rpm      219 kB/s |  66 kB     00:00
(6/8): sssd-nfs-idmap-2.9.4-6.el9_4.x86_64.rpm  217 kB/s |  46 kB     00:00
(7/8): nfs-utils-2.5.4-25.el9.x86_64.rpm        874 kB/s | 463 kB     00:00
(8/8): rpcbind-1.2.6-7.el9.x86_64.rpm           189 kB/s |  62 kB     00:00
--------------------------------------------------------------------------------
合計                                            965 kB/s | 899 kB     00:00
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
  準備中           :                                                        1/1
  インストール中   : libnfsidmap-1:2.5.4-25.el9.x86_64                      1/8
  scriptletの実行中: rpcbind-1.2.6-7.el9.x86_64                             2/8
  インストール中   : rpcbind-1.2.6-7.el9.x86_64                             2/8
  scriptletの実行中: rpcbind-1.2.6-7.el9.x86_64                             2/8
Created symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service → /usr/lib/systemd/system/rpcbind.service.
Created symlink /etc/systemd/system/sockets.target.wants/rpcbind.socket → /usr/lib/systemd/system/rpcbind.socket.

  インストール中   : keyutils-1.6.3-1.el9.x86_64                            3/8
  インストール中   : libev-4.33-5.el9.x86_64                                4/8
  インストール中   : libverto-libev-0.3.2-3.el9.x86_64                      5/8
  インストール中   : gssproxy-0.8.4-6.el9.x86_64                            6/8
  scriptletの実行中: gssproxy-0.8.4-6.el9.x86_64                            6/8
  scriptletの実行中: nfs-utils-1:2.5.4-25.el9.x86_64                        7/8
  インストール中   : nfs-utils-1:2.5.4-25.el9.x86_64                        7/8
  scriptletの実行中: nfs-utils-1:2.5.4-25.el9.x86_64                        7/8
  インストール中   : sssd-nfs-idmap-2.9.4-6.el9_4.x86_64                    8/8
  scriptletの実行中: sssd-nfs-idmap-2.9.4-6.el9_4.x86_64                    8/8
  検証中           : libev-4.33-5.el9.x86_64                                1/8
  検証中           : libverto-libev-0.3.2-3.el9.x86_64                      2/8
  検証中           : keyutils-1.6.3-1.el9.x86_64                            3/8
  検証中           : gssproxy-0.8.4-6.el9.x86_64                            4/8
  検証中           : libnfsidmap-1:2.5.4-25.el9.x86_64                      5/8
  検証中           : nfs-utils-1:2.5.4-25.el9.x86_64                        6/8
  検証中           : rpcbind-1.2.6-7.el9.x86_64                             7/8
  検証中           : sssd-nfs-idmap-2.9.4-6.el9_4.x86_64                    8/8
インストール済みの製品が更新されています。

インストール済み:
  gssproxy-0.8.4-6.el9.x86_64           keyutils-1.6.3-1.el9.x86_64
  libev-4.33-5.el9.x86_64               libnfsidmap-1:2.5.4-25.el9.x86_64
  libverto-libev-0.3.2-3.el9.x86_64     nfs-utils-1:2.5.4-25.el9.x86_64
  rpcbind-1.2.6-7.el9.x86_64            sssd-nfs-idmap-2.9.4-6.el9_4.x86_64

完了しました!
```

2.**iostatとnfsstatのインストール**

```bash
sudo yum install -y sysstat
```

```bash
[root@nfscl ~]# sudo yum install -y sysstat
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 2:04:32 前の 2024年07月13日 01時58分43秒 に実施 しました。
依存関係が解決しました。
================================================================================
 パッケージ      Arch   バージョン       リポジトリー                     サイズ
================================================================================
インストール:
 sysstat         x86_64 12.5.4-7.el9     rhel-9-for-x86_64-appstream-rpms 485 k
依存関係のインストール:
 lm_sensors-libs x86_64 3.6.0-10.el9     rhel-9-for-x86_64-appstream-rpms  44 k
 pcp-conf        x86_64 6.2.0-2.el9_4    rhel-9-for-x86_64-appstream-rpms  32 k
 pcp-libs        x86_64 6.2.0-2.el9_4    rhel-9-for-x86_64-appstream-rpms 637 k

トランザクションの概要
================================================================================
インストール  4 パッケージ

ダウンロードサイズの合計: 1.2 M
インストール後のサイズ: 3.2 M
パッケージのダウンロード:
(1/4): lm_sensors-libs-3.6.0-10.el9.x86_64.rpm  155 kB/s |  44 kB     00:00
(2/4): pcp-conf-6.2.0-2.el9_4.x86_64.rpm         98 kB/s |  32 kB     00:00
(3/4): sysstat-12.5.4-7.el9.x86_64.rpm          1.4 MB/s | 485 kB     00:00
(4/4): pcp-libs-6.2.0-2.el9_4.x86_64.rpm        2.6 MB/s | 637 kB     00:00
--------------------------------------------------------------------------------
合計                                            2.3 MB/s | 1.2 MB     00:00
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
  準備中           :                                                        1/1
  インストール中   : pcp-conf-6.2.0-2.el9_4.x86_64                          1/4
  インストール中   : pcp-libs-6.2.0-2.el9_4.x86_64                          2/4
  インストール中   : lm_sensors-libs-3.6.0-10.el9.x86_64                    3/4
  インストール中   : sysstat-12.5.4-7.el9.x86_64                            4/4
  scriptletの実行中: sysstat-12.5.4-7.el9.x86_64                            4/4
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /usr/lib/systemd/system/sysstat.service.
Created symlink /etc/systemd/system/sysstat.service.wants/sysstat-collect.timer → /usr/lib/systemd/system/sysstat-collect.timer.
Created symlink /etc/systemd/system/sysstat.service.wants/sysstat-summary.timer → /usr/lib/systemd/system/sysstat-summary.timer.

  検証中           : lm_sensors-libs-3.6.0-10.el9.x86_64                    1/4
  検証中           : sysstat-12.5.4-7.el9.x86_64                            2/4
  検証中           : pcp-conf-6.2.0-2.el9_4.x86_64                          3/4
  検証中           : pcp-libs-6.2.0-2.el9_4.x86_64                          4/4
インストール済みの製品が更新されています。

インストール済み:
  lm_sensors-libs-3.6.0-10.el9.x86_64       pcp-conf-6.2.0-2.el9_4.x86_64
  pcp-libs-6.2.0-2.el9_4.x86_64             sysstat-12.5.4-7.el9.x86_64

完了しました!
```

3.**マウントポイントの作成**

```bash
sudo mkdir -p /mnt/nfs
```

```bash
[root@nfscl ~]# sudo mkdir -p /mnt/nfs
```

4.**NFSサーバの共有ディレクトリをマウント**

```bash
sudo mount -t nfs -o vers=3 <NFSサーバのIPアドレス>:/srv/nfs /mnt/nfs
```

```bash
[root@nfscl ~]# sudo mount -t nfs -o vers=3 192.168.11.48:/srv/nfs /mnt/nfs
Created symlink /run/systemd/system/remote-fs.target.wants/rpc-statd.service → /usr/lib/systemd/system/rpc-statd.service.
```

### 試験1: 20GBのファイル1個

1.**試験用のデータセットの準備**

NFSサーバ上の共有ディレクトリに試験用のデータを用意します。

```bash
cd /srv/nfs
dd if=/dev/zero of=testfile bs=1M count=1000
```

```bash
[root@nfssv nfs]# dd if=/dev/zero of=testfile3 bs=1M count=20000
20000+0 レコード入力
20000+0 レコード出力
20971520000 bytes (21 GB, 20 GiB) copied, 13.7196 s, 1.5 GB/s
```

2.**iostatとnfsstatの統計情報収集**

NFSサーバ上でiostatを実行し、統計情報を収集します。

```bash
iostat -dx 5 > iostat_output.txt
```

NFSクライアント上でnfsstatを実行し、試験前の統計情報を収集します。

```bash
nfsstat -c > nfsstat_output_pre.txt
```

```bash
[root@nfscl work]# nfsstat -c > nfsstat_output_pre.txt
[root@nfscl work]# cat nfsstat_output_pre.txt
Client rpc stats:
calls      retrans    authrefrsh
6          0          6

Client nfs v3:
null             getattr          setattr          lookup           access
1        16%     2        33%     0         0%     0         0%     0         0%
readlink         read             write            create           mkdir
0         0%     0         0%     0         0%     0         0%     0         0%
symlink          mknod            remove           rmdir            rename
0         0%     0         0%     0         0%     0         0%     0         0%
link             readdir          readdirplus      fsstat           fsinfo
0         0%     0         0%     0         0%     0         0%     2        33%
pathconf         commit
1        16%     0         0%
```

3.**tarによる試験**

NFSクライアント上でtarによるデータコピー試験を実施します。

```bash
[root@nfscl ~]# (cd /mnt/nfs; tar cvfp - testfile) | (cd /root/work; tar xvfp -)
testfile
testfile
```

4.**iostatとnfsstatの統計情報収集**

NFSサーバ上で実行中のiostatを停止します。
NFSクライアント上でnfsstatを実行し、試験後の統計情報を収集します。

```bash
nfsstat -c > nfsstat_output_post.txt
```

### 試験2: 10MBのファイル2000個・1000個のディレクトリ

1.**試験用のデータセットの準備**

NFSサーバ上の共有ディレクトリに試験用のデータを用意します。

```bash
[root@nfssv work]# cat create_dir.sh
#!/bin/bash

# ベースディレクトリの作成
BASE_DIR="/srv/nfs"
mkdir -p "${BASE_DIR}"

# ディレクトリ構成とファイルの作成
for i in $(seq 1 10); do
    for j in $(seq 1 10); do
        for k in $(seq 1 1); do
            DIR="${BASE_DIR}/dir_${i}/subdir_${j}/subsubdir_${k}"
            mkdir -p "${DIR}"

            for l in $(seq 1 20); do
                FILE="${DIR}/file_${i}_${j}_${k}_${l}.dat"
                dd if=/dev/zero of=${FILE} bs=1M count=10
            done
        done
    done
done

echo "ディレクトリ構成およびファイルの作成が完了しました。"
[root@nfssv work]# sh create_dir.sh
10+0 レコード入力
10+0 レコード出力
10485760 bytes (10 MB, 10 MiB) copied, 0.00475464 s, 2.2 GB/s
省略
ディレクトリ構成およびファイルの作成が完了しました。
```

2.**iostatとnfsstatの統計情報収集**

NFSサーバ上でiostatを実行し、統計情報を収集します。この試験後まで実行したままとします。

```bash
iostat -dx 5 > iostat_output.txt
```

NFSクライアント上でnfsstatを実行し、試験前の統計情報を収集します。

```bash
nfsstat -c > nfsstat_output_pre.txt
```

3.**tarによる試験**

NFSクライアント上でtarによるデータコピー試験を実施します。

```bash
[root@nfscl work]# (cd /mnt/nfs; tar cvfp - *) | (cd /root/work; tar xvfp -)
dir_1/
dir_1/subdir_1/
dir_1/subdir_1/subsubdir_1/
dir_1/subdir_1/subsubdir_1/file_1_1_1_1.dat
dir_1/
dir_1/subdir_1/
dir_1/subdir_1/subsubdir_1/
dir_1/subdir_1/subsubdir_1/file_1_1_1_1.dat
dir_1/subdir_1/subsubdir_1/file_1_1_1_2.dat
省略
```

4.**iostatとnfsstatの統計情報収集**

NFSサーバ上で実行中のiostatを停止します。
NFSクライアント上でnfsstatを実行し、試験後の統計情報を収集します。

```bash
nfsstat -c > nfsstat_output_post.txt
```

## 結果の解析

1.**iostatの解析**

iostat`の出力からIOPSを計算するには、`iostat`コマンドの出力の各列の意味を理解する必要があります。`iostat -dx`の出力は以下のような列から構成されます：

- **Device**: デバイス名
- **rrqm/s**: リード要求のマージされた回数
- **wrqm/s**: ライト要求のマージされた回数
- **r/s**: 1秒あたりのリード要求数
- **w/s**: 1秒あたりのライト要求数
- **rsec/s**: 1秒あたりのリードセクタ数
- **wsec/s**: 1秒あたりのライトセクタ数
- **avgrq-sz**: 平均要求サイズ
- **avgqu-sz**: 平均キューサイズ
- **await**: I/O操作の平均待ち時間（ミリ秒）
- **svctm**: I/O操作の平均サービス時間（ミリ秒）
- **%util**: デバイス使用率（%）

iostatの先頭行には、以下の内容が出力されています。

```plaintext
Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
```

iostat_output.txt`を確認し、試験中のIOPSを計算します。

```bash
grep 'sda' iostat_output.txt | awk '{print $1, $2, $3, $4, $5, $6, $7, $8}'
```

### 試験1の場合

```bash
[root@nfssv work]grep 'sda' iostat_output.txt | awk '{print $1, $2, $3, $4, $5, $6, $7, $8}'}'
sda 9.97 332.35 0.01 0.08 0.18 33.34 19.73
sda 104.00 13276.80 0.00 0.00 0.39 127.66 0.00
sda 2634.20 337177.60 0.00 0.00 0.53 128.00 1.00
sda 2643.00 337651.20 0.00 0.00 0.56 127.75 2.80
sda 2721.20 348288.00 0.00 0.00 0.55 127.99 0.00
sda 2708.00 346624.00 0.00 0.00 0.57 128.00 0.00
sda 2697.20 345124.00 1.20 0.04 0.57 127.96 0.20
sda 2828.20 362009.60 0.00 0.00 0.53 128.00 0.20
sda 2761.80 353510.40 0.00 0.00 0.54 128.00 0.60
sda 2794.80 357708.80 0.00 0.00 0.52 127.99 0.00
sda 2734.00 349977.60 0.00 0.00 0.51 128.01 0.20
sda 2823.20 361344.00 0.00 0.00 0.51 127.99 0.00
sda 2706.00 346368.00 0.00 0.00 0.55 128.00 0.20
sda 1851.40 236935.20 0.00 0.00 0.54 127.98 0.00
```

IOPSはリード要求数(r/s)とライト要求数(w/s)の合計です。
iostatは5秒毎の平均値となるため、合計IOPSは170561.00となります。

```plaintext
104.00 + 2635.20 + 2645.80 + 2721.20 + 2708.00 + 2697.40 + 2828.40 + 2762.40 + 2794.80 + 2734.20 + 2823.20 + 2706.20 + 1851.40 = 34112.20
34112.20 * 5 = 170561.00
````

### 試験2の場合

```bash
[root@nfssv work]grep 'sda' iostat_output.txt | awk '{print $1, $2, $3, $4, $5, $6, $7, $8}'}
sda 17.74 2111.33 0.00 0.01 0.52 119.04 4.97
sda 2486.40 311296.00 0.00 0.00 0.55 125.20 1.20
sda 2418.40 302662.40 0.00 0.00 0.56 125.15 8.80
sda 2458.00 307504.00 0.00 0.00 0.57 125.10 1.40
sda 2669.60 333891.20 0.00 0.00 0.55 125.07 0.00
sda 2723.00 340774.40 0.00 0.00 0.53 125.15 0.00
sda 2704.40 338211.20 0.00 0.00 0.55 125.06 0.00
sda 2730.20 341494.40 0.00 0.00 0.53 125.08 1.80
sda 2753.80 344524.80 0.00 0.00 0.53 125.11 0.00
sda 2683.00 335712.00 0.00 0.00 0.54 125.13 0.00
sda 2705.20 338519.20 0.00 0.00 0.53 125.14 0.20
sda 2688.00 336153.60 0.00 0.00 0.54 125.06 0.00
sda 2765.40 345962.40 0.00 0.00 0.52 125.10 0.20
```

IOPSはリード要求数(r/s)とライト要求数(w/s)の合計です。
iostatは5秒毎の平均値となるため、合計IOPSは171108.55となります。

```plaintext
22.71 + 0.00 + 0.00 + 0.00 + 0.00 + 2487.60 + 2427.20 + 2459.40 + 2669.60 + 2723.00 + 2704.40 + 2732.00 + 2753.80 + 2683.00 + 2705.40 + 2688.00 + 2765.60 = 34221.71
34221.71 * 5 = 171108.55
````

2. **nfsstatの解析**

`nfsstat_output.txt`を確認し、試験中のNFS操作数を計算します。
nfsstatの結果は増加カウンタのため、試験前後の各項目の値の差分を取ることでリクエスト数が得られます。

### 試験1の場合

```bash
[root@nfscl work]# cat nfsstat_output_pre.txt
Client rpc stats:
calls      retrans    authrefrsh
26993      0          26994

Client nfs v3:
null             getattr          setattr          lookup           access
1         0%     12        0%     0         0%     2         0%     5         0%
readlink         read             write            create           mkdir
0         0%     26970    99%     0         0%     0         0%     0         0%
symlink          mknod            remove           rmdir            rename
0         0%     0         0%     0         0%     0         0%     0         0%
link             readdir          readdirplus      fsstat           fsinfo
0         0%     0         0%     0         0%     0         0%     2         0%
pathconf         commit
1         0%     0         0%

[root@nfscl work]# cat nfsstat_output_post.txt
Client rpc stats:
calls      retrans    authrefrsh
204299     0          204301

Client nfs v3:
null             getattr          setattr          lookup           access
1         0%     14        0%     0         0%     3         0%     7         0%
readlink         read             write            create           mkdir
0         0%     204271   99%     0         0%     0         0%     0         0%
symlink          mknod            remove           rmdir            rename
0         0%     0         0%     0         0%     0         0%     0         0%
link             readdir          readdirplus      fsstat           fsinfo
0         0%     0         0%     0         0%     0         0%     2         0%
pathconf         commit
1         0%     0         0%
```

readが 204271 - 26970 = 177301増加していることが分かります。

### 試験2の場合

```bash
[root@nfscl work]# cat nfsstat_output_pre.txt
Client rpc stats:
calls      retrans    authrefrsh
6          0          6

Client nfs v3:
null             getattr          setattr          lookup           access      
1        16%     2        33%     0         0%     0         0%     0         0%
readlink         read             write            create           mkdir       
0         0%     0         0%     0         0%     0         0%     0         0%
symlink          mknod            remove           rmdir            rename      
0         0%     0         0%     0         0%     0         0%     0         0%
link             readdir          readdirplus      fsstat           fsinfo      
0         0%     0         0%     0         0%     0         0%     2        33%
pathconf         commit
1        16%     0         0%

[root@nfscl work]# cat nfsstat_output_post.txt
Client rpc stats:
calls      retrans    authrefrsh
196218     0          196216

Client nfs v3:
null             getattr          setattr          lookup           access      
1         0%     2298      1%     0         0%     2         0%     2211      1%
readlink         read             write            create           mkdir       
0         0%     191492   97%     0         0%     0         0%     0         0%
symlink          mknod            remove           rmdir            rename      
0         0%     0         0%     0         0%     0         0%     0         0%
link             readdir          readdirplus      fsstat           fsinfo      
0         0%     0         0%     211       0%     0         0%     2         0%
pathconf         commit
1         0%     0         0%
```

readが191492 - 0 = 191492増加していることが分かります。

## まとめと考察

### まとめ
試験1の場合、合計IOPSが170561.00の場合に、NFSv3のreadリクエスト数は177301増加していることが分かりました。つまり、IOPSとnfsstatのreadリクエスト数はほぼ同程度発生していることになります。

試験2の場合、合計IOPSが171108.55の場合に、NFSv3のreadリクエスト数は191492増加していることが分かりました。つまり、IOPSの1.2倍程度nfsstatのreadリクエスト数が発生していることになります。

### 考察
現時点でのデータに基づいて、IOPSとnfsstatのreadリクエスト数がほぼ同じであることが確認されたため、今回のシチュエーションにおいてはこれらの値がほぼ同じと判断しても良いでしょう。しかし、以下の点に注意が必要です。

・他のワークロードや環境設定で同じ結果が得られるとは限りません。異なるワークロードや設定で追加のテストを行い、一貫性を確認することが重要です。
・キャッシュの影響やNFSオーバーヘッドを考慮し、NFSとディスクI/Oのパフォーマンスを定期的にモニタリングし、必要に応じて調整を行うことが推奨されます。