Raspberry Pi 效能改善 – 使用 ZRAM
「少年,你渴望力量嗎?」
「不,我渴望記憶體!」
對於一個小型的網站來說,使用 Raspberry Pi 作為伺服器,其實是一個相當方便的練習對象,因為它實在是很便宜,你可以一次買下 2 塊 Raspberry Pi,一台當作 Production 機器,一台用來做各種實驗;完全不用擔心硬體不同有時後會造成麻煩。
但是(嘆氣),它的記憶體實在是太小了… 1 GB 的記憶體實在不適合跑太複雜的網站(像是 WordPress)
為什麼不使用 SWAP
為了解決這個問題,我們可以使用 SWAP 換置記憶體,來維持記憶體,像是下面這樣:
1 2 3 4 |
$ cat /proc/swaps Filename Type Size Used Priority /dev/mmcblk0p3 partition 442364 239380 -2 |
但是我們要解決的並不單純是記憶體容量的問題,而是流暢度的問題。使用 SD 卡當作 SWAP 只會消耗更多,原本就很吃緊的 I/O 資源。
OK,那為什麼 ZRAM 會比較好?
zram, formerly called compcache, is a Linux kernel module for creating a compressed block device in RAM, i.e. a RAM disk, but with on-the-fly “disk” compression.
根據 Wiki 上的敘述, ZRAM 是一種 RAM Disk 工具,會即時壓縮放進去的資料,來節省記憶體消耗。以我們的情況來說,把一些比較少用的資料壓縮起來,可能比透過緩慢又短命的 SD 卡,來的更加有效率。
我們要做的是:使用 ZRAM 做出一個壓縮過的記憶體空間,然後配合 SWAP 機制,把暫時不會用到的程式,通通放到 ZRAM 之中壓縮起來。
逐步設定
首先檢查一下 zram
核心模駔有沒有載入
1 2 3 |
$ sudo lsmod | grep zram zram 32768 1 |
如果沒有的話就使用 modprobe
將它載入(如果出現錯誤訊息的話,你可能需要重編譯 Kernel)
1 2 |
$ sudo modprobe zram |
接下來確認沒有使用中的 ZRAM
1 2 3 |
$ zramctl (應該是空的) |
設定 ZRAM 大小(先用 free
查出記憶體大小,然後乘 1024)
1 2 3 4 5 6 7 |
$ free -k total used free shared buff/cache available Mem: 934788 532312 85336 93268 317140 218832 $ echo $(( 934788 * 1024 )) | sudo tee /sys/block/zram0/disksize 957222912 |
建立 SWAP
1 2 3 4 |
$ sudo mkswap /dev/zram0 Setting up swapspace version 1, size = 912.9 MiB (957218816 bytes) no label, UUID=ac05098f-124b-4aa7-bf9a-e91e6132a2b5 |
啟用剛才建立的 SWAP(這邊使用 -p 10
參數是為了優先使用 ZRAM)
1 2 |
sudo swapon -p 10 /dev/zram0 |
成功!
1 2 3 4 5 6 7 8 9 |
$ free -h total used free shared buff/cache available Mem: 912M 442M 76M 83M 393M 298M Swap: 1.3G 237M 1.1G $ cat /proc/swaps Filename Type Size Used Priority /dev/zram0 partition 934784 160952 10 |
開機自動設定
首先建立一個 Script,把建立 ZRAM 這件事情打包成一個檔案,放在 /usr/local/sbin/zram_setup.sh
。
1 2 3 4 5 6 7 |
#!/bin/bash memsize=`free | grep -e "^Mem:" | awk '{print $2}'` echo $(( $memsize * 1024 )) | sudo tee /sys/block/zram0/disksize mkswap /dev/zram0 swapon -p 10 /dev/zram0 |
為了在每次開機時都能自動設定,我們要在 Systemd 裡面設定一個服務,放在 /etc/systemd/system/zram_setup.service
。
1 2 3 4 5 6 7 |
[Service] Type=simple ExecStart=/usr/local/sbin/zram_setup.sh [Install] WantedBy=default.target |
然後,為了確保每次都會自動載入 zram
模組,請編輯 /etc/modules
,加入以下的文字:
1 2 |
zram |
重新載入 Systemd 模組
1 2 |
sudo systemctl daemon-reload |
試著啟動看看:
1 2 |
sudo systemctl start zram_setup.service |
檢查一下結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
➜ ~ sudo systemctl status zram_setup.service ● zram_setup.service Loaded: loaded (/etc/systemd/system/zram_setup.service; disabled; vendor preset: enabled) Active: inactive (dead) Jun 25 20:51:02 VPC systemd[1]: Started zram_setup.service. Jun 25 20:51:02 VPC sudo[1627]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/tee /sys/block/zram0/disksize Jun 25 20:51:02 VPC sudo[1627]: pam_unix(sudo:session): session opened for user root by (uid=0) Jun 25 20:51:02 VPC zram_setup.sh[1617]: 3147227136 Jun 25 20:51:02 VPC sudo[1627]: pam_unix(sudo:session): session closed for user root Jun 25 20:51:02 VPC zram_setup.sh[1617]: Setting up swapspace version 1, size = 3 GiB (3147223040 bytes) Jun 25 20:51:02 VPC zram_setup.sh[1617]: no label, UUID=2778a31a-a747-4139-8d28-c44ecf98d82b ➜ ~ cat /proc/swaps Filename Type Size Used Priority /dev/zram0 partition 3073460 0 10 |
沒問題的話就設定成自動啟動
1 2 3 |
➜ ~ sudo systemctl enable zram_setup.service Created symlink from /etc/systemd/system/default.target.wants/zram_setup.service to /etc/systemd/system/zram_setup.service. |