MacOSX 簡単にブラウザのキャッシュをRamDiskにあてる


以前、[TmpDiskを使ったRamDiskの適用方法](https://qiita.com/yassy/items/074f4f42c559f47083f3)を投稿したのですが、
最近になって
・Terminal のコマンドから一発でシンプルに作成可能な事
・AutoMatorなんて使わなくても簡単に起動登録できる事
がわかりました。


**※実行は自己責任にてお願いします**
**※2021/4/13 APFSについての記述とベンチマーク例を追加しました**

# 目的

ブラウザのキャッシュをRamDiskにあてることで、
SSDへのアクセスが減り、
以下のことが期待できます。

- SSDの寿命が伸びる
- 動作環境への負荷が減る
- GoogleChromeのキャッシュを割り当てたら、動作が快適に感じるかも？

とはいえ、どちらも体感は変わらないです。

システムのメモリをディスクとして割り当てる為、
メモリに余裕のある環境が対象となります。

# 測定

一例ですが、
単純な数値として、AmorphousDiskMark 3.1 で SSD と RamDisk を
それぞれ測定すると、こんな感じになります。

※ MacMini Late2020
※ 左から、SSD、RamDisk(HFS+)、RamDisk(APFS)
![Screen Shot 2021-04-13 at 2.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29099/66db9e80-d672-c610-8db7-b12d8cb73011.png)
※ QD = QueueDepth (一度に発行するコマンド数)

# RamDisk を作成する


これは、それぞれ一行で実現可能でした。
[参考サイト](https://blog.macsales.com/46348-how-to-create-and-use-a-ram-disk-with-your-mac-warnings-included/)

```bash
# HFS+ の場合
diskutil erasevolume HFS+ ${DISK_NAME} `hdiutil attach -nomount ram://${DISK_SIZE}`
# APFS の場合
diskutil partitionDisk `hdiutil attach -nomount ram://${DISK_SIZE}` 1 apfs ${DISK_NAME} ${DISK_SIZE}
```

**DISK_NAME** は **RAMDisk** とかで、わかりやすくて良いと思いますが、
**DISK_SIZE** は [参考サイト](https://blog.macsales.com/46348-how-to-create-and-use-a-ram-disk-with-your-mac-warnings-included/)にあるように、以下のようになります。

|DISK_SIZE|数値|
|:-:|:-:|:-:|
|512MB|1048576|
|1GB|2097152|
|2GB|4194304|

```bash:例
# 2GBのRAMDiskを作成する (HFS+)
diskutil erasevolume HFS+ RAMDisk `hdiutil attach -nomount ram://4194304`

# 2GBのRAMDiskを作成する (APFS)
diskutil partitionDisk `hdiutil attach -nomount ram://4194304` 1 apfs RAMDisk 4194304
```

# 起動時設定の登録
再起動後も、自動でRAMDiskが有効になるようにします。

### 1.シェルスクリプトの作成

以下のようなスクリプトを作成します。
この例では、**GoogleChromeのキャッシュ**をRAMDiskに割り当てています。
**ブラウザのキャッシュフォルダの場所は、バージョンによって変わる可能性があります*

```bash:setup-mac-ramdisk.command
DISK_SIZE=4194304
DISK_NAME=RAMDisk

# create and mount RAMDisk
# HFS+
diskutil erasevolume HFS+ ${DISK_NAME} `hdiutil attach -nomount ram://${DISK_SIZE}`
# APFS
# diskutil partitionDisk `hdiutil attach -nomount ram://${DISK_SIZE}` 1 apfs ${DISK_NAME} ${DISK_SIZE}

# create links to RAMDisk
function symbolic_link(){
  rm -rf "$1"
  rm -rf "$2"
  mkdir -p "$2"
  ln -s "$2" "$1"
}

# Chrome_Cache
SRC=${HOME}/Library/Caches/Google/Chrome
DST=/Volumes/${DISK_NAME}/Caches/Chrome
symbolic_link "${SRC}" "${DST}"

```


### 2.ログイン項目に登録

*作成したスクリプトには、おそらく権限を与えておく必要があります。*
*chmod 744 setup-mac-ramdisk.command*

**System Preferences** より、
**ユーザーとグループ** を選択。

**ログイン項目** タブの **+** ボタンを押して
1. で作成したスクリプトファイル *(ここではsetup-mac-ramdisk.command)* を選択します。

![RamDisk Command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29099/2024e41e-5234-4de8-9e5b-5e48081ac310.png)



そうすると、再起動後は下のようなターミナルが起動されるようになります。
![起動時.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29099/4be66e29-437f-c673-bddd-4e88ea16af52.png)

大体すぐに終わる印象ですが、
**[プロセスが完了しました]** と表示されたら、
RAMDiskの準備は完了しているので、そのターミナルは閉じて大丈夫です。


# RAMDisk に割り当てる

対象が GoogleChrome くらいしかなくて、ちょっと残念な気もするので、
スクリーンショットの保存先でも変えてみます。

```bash
# スクリーンショットの保存先を、RAMDiskに割り当てる
defaults write com.apple.screencapture location /Volumes/RAMDisk;killall SystemUIServer
```
このコマンドをTerminalで一度実行すれば、適用されます。