Linux ディスクキャッシュのチューニング

# 目的
HDD などアクセス速度の遅い記憶媒体へのデータの読み書きを行う際に，メモリ上でのデータのキャッシュ量を調整することで，パフォーマンスチューニングを行う.

# 現状把握

```
# バックグラウンドでライトバックを行うキャッシュサイズの閾値 (物理メモリに占める割合[%])
$ sudo cat /proc/sys/vm/dirty_background_ratio
5

# フォアグラウンドでライトバックを行うキャッシュサイズの閾値 (物理メモリに占める割合[%])
$ sudo cat /proc/sys/vm/dirty_ratio
10

# ライトバックされるまでのキャッシュの保持時間
$ sudo cat /proc/sys/vm/dirty_expire_centisecs
3000

# キャッシュの経過時間を監視する間隔
$ sudo cat /proc/sys/vm/dirty_writeback_centisecs
500
```

# チューニング
`/etc/sysctl.conf` を変更する.

```
$ sudo vi /etc/sysctl.conf
```

```text:/etc/sysctl.conf
...
# 最後の行に追加
vm.dirty_background_ratio=10
vm.dirty_ratio=20
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
```

設定を反映する.

```
$ sudo sysctl -p
```

# 結果

```text:Before
$ nmon
┌nmon─14g─────────────────────Hostname=cl5──────────Refresh= 1secs ───00:32.56─────────────────────────┐
│ Memory Stats ────────────────────────────────────────────────────────────────────────────────────────│
│                RAM     High      Low     Swap    Page Size=4 KB                                      │
│ Total MB     24102.3     -0.0     -0.0  24564.0                                                      │
│ Free  MB       193.3     -0.0     -0.0  24564.0                                                      │
│ Free Percent     0.8%   100.0%   100.0%   100.0%                                                     │
│             MB                  MB                  MB                                               │
│                      Cached= 22254.3     Active=  1246.8                                             │
│ Buffers=   463.8 Swapcached=     0.0  Inactive = 21661.2                                             │
│ Dirty  =     0.2 Writeback =     0.0  Mapped   =    68.1                                             │
│ Slab   =   789.0 Commit_AS =  1180.6 PageTables=    12.9                                             │
│ Network I/O ─────────────────────────────────────────────────────────────────────────────────────────│
│I/F Name Recv=KB/s Trans=KB/s packin packout insize outsize Peak->Recv Trans                          │
│    eth0    92.0    11.2      88.9     82.9  1059.6  137.9    12012.7   320.7                         │
│      lo     0.4     0.4       4.0      4.0   102.8  102.8       10.6    10.6                         │
│ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates─────────────────────────│
│DiskName Busy  Read WriteKB|0          |25         |50          |75       100|                        │
│sdb        0%    0.0    0.0|>                                                |                        │
│sda       99%    0.0  623.4|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW>                        │
│sdc        0%    0.0    0.0|>                                                |                        │
│sdd        0%    0.0    0.0|            >                                    |                        │
│sdd1       0%    0.0    0.0|            >                                    |                        │
│sdd2       0%    0.0    0.0|>                                                |                        │
│sdd3       0%    0.0    0.0|>                                                |                        │
│sdd5       0%    0.0    0.0|>                                                |                        │
│Totals Read-MB/s=0.0      Writes-MB/s=0.6      Transfers/sec=68.9                                     │
│──────────────────────────────────────────────────────────────────────────────────────────────────────│
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

```text:After
$ nmon
┌nmon─14g─────────────────────Hostname=cl5──────────Refresh= 1secs ───00:57.57──────────────────────────┐
│ Memory Stats ─────────────────────────────────────────────────────────────────────────────────────────│
│                RAM     High      Low     Swap    Page Size=4 KB                                       │
│ Total MB     24102.3     -0.0     -0.0  24564.0                                                       │
│ Free  MB       210.4     -0.0     -0.0  24564.0                                                       │
│ Free Percent     0.9%   100.0%   100.0%   100.0%                                                      │
│             MB                  MB                  MB                                                │
│                      Cached= 22126.7     Active=  1584.6                                              │
│ Buffers=   469.5 Swapcached=     0.0  Inactive = 21312.9                                              │
│ Dirty  =     0.1 Writeback =     0.0  Mapped   =    66.6                                              │
│ Slab   =   782.6 Commit_AS =  1163.0 PageTables=    12.9                                              │
│ Network I/O ──────────────────────────────────────────────────────────────────────────────────────────│
│I/F Name Recv=KB/s Trans=KB/s packin packout insize outsize Peak->Recv Trans                           │
│    eth0    73.5    11.5      79.9     83.9   941.5  139.8    12012.7   465.3                          │
│      lo     0.4     0.4       4.0      4.0   102.8  102.8       10.6    10.6                          │
│ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates──────────────────────────│
│DiskName Busy  Read WriteKB|0          |25         |50          |75       100|                         │
│sdb        0%    0.0    0.0|>                                                |                         │
│sda      101%    0.0  683.4|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW>                         │
│sdc        0%    0.0    0.0|>                                                |                         │
│sdd        0%    0.0    0.0|                                                 >                         │
│sdd1       0%    0.0    0.0|                                                 >                         │
│sdd2       0%    0.0    0.0|>                                                |                         │
│sdd3       0%    0.0    0.0|>                                                |                         │
│sdd5       0%    0.0    0.0|>                                                |                         │
│Totals Read-MB/s=0.0      Writes-MB/s=0.7      Transfers/sec=82.9                                      │
│───────────────────────────────────────────────────────────────────────────────────────────────────────│
└───────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

変わった...?

# 参考
* [LinuxTips/メモリのチューニング](https://vok.paburica.com/index.php?LinuxTips%2F%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)
* [Better Linux Disk Caching & Performance with vm.dirty_ratio & vm.dirty_background_ratio](https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/)
* [ディスクキャッシュとは｜disk cache － 意味 / 定義 / 解説 / 説明 ： IT用語辞典](http://e-words.jp/w/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5.html)