在 Linux 上使用 RAM Disk 提高資料讀寫速度

RAM Disk 就是將動態記憶體(Dynamic Random Access Memory,DRAM)經由軟體模擬的方式,拿來當作一般硬碟使用,優點就是讀寫速度很快、壽命也比一般硬碟長,但是缺點是斷電時資料就會消失。由於記憶體的存取速度比傳統硬碟、固態硬碟(SSD)或磁碟陣列的速度更快,因此將記憶體模擬為硬碟後,可以利用其優越的讀寫能力,提升系統執行效率。

RAM Disk 不像傳統硬碟採用馬達與磁片等機械裝置,而是靠電子訊號傳輸,因此在分類上也算是固態硬碟(Solid State Disk),但其讀寫效能卻是一般市售 SSD 無法相比的!相較市面上高速 SSD 可達 500MB/s 的讀寫速度,或者高達 1000MB/s 速度的 PCI Express SSD 磁碟陣列產品,RAM Disk 讀寫速度是前述產品的數倍有餘,而且更為便宜。

RAM Disk 效能會受到軟體、記憶體時脈、晶片組的記憶體通道數而有所不同。扣除軟體差異,記憶體時脈越高則效能越好,而四通道平台又比雙通道來得快一些,但無論如何,記憶體的存取效率還是優於其他的儲存裝置。

在 Linux 中若要使用 RAM Disk,只需要使用 mount 這個指令就可以了,非常簡單!

首先在 /tmp 中建立一個資料夾:
mkdir /tmp/ramdisk
chmod 777 /tmp/ramdisk


接著再使用 mount 指令將 4G 的記憶體掛上去:
mount -t tmpfs -o size=4G tmpfs /tmp/ramdisk/

這裡要使用 -t 參數指定檔案系統類型為 tmpfs,並且使用 -o 參數指定 RAM Disk 大小為 4G。


建立好 RAM Disk 之後,用 df 檢查一下:
df -h

輸出為:
檔案系統        容量  已用  可用 已用% 掛載點
/dev/sda1       116G  8.7G  101G    8% /
udev             16G  4.0K   16G    1% /dev
tmpfs           6.3G  332K  6.3G    1% /run
none            5.0M     0  5.0M    0% /run/lock
none             16G     0   16G    0% /run/shm
tmpfs           4.0G     0  4.0G    0% /tmp/ramdisk

最後一行就是我們剛剛建立的 RAM Disk,容量是 4G,現在就可以把 /tmp/ramdisk 當做一般的硬碟使用了。

接著我們來測試寫入 2G 的資料到 RAM Disk 中,看看效率如何:
dd count=2k bs=1M if=/dev/zero of=/tmp/ramdisk/test2g.img
輸出為
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 3.59279 s, 598 MB/s

接著我們將相同的資料寫入一般的硬碟,跟 RAM Disk 比較看看:
dd count=2k bs=1M if=/dev/zero of=/tmp/test2g.img
輸出為
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 39.76 s, 54.0 MB/s

在寫入速度上確實有很大的差異,接著再來看看讀取速度,從 RAM Disk 中讀取 2G 的資料:
dd count=2k bs=1M if=/tmp/ramdisk/test2g.img of=/dev/null
輸出為
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 1.93749 s, 1.1 GB/s

從一般硬碟中讀取 2G 的資料:
dd count=2k bs=1M if=/tmp/test2g.img of=/dev/null
輸出為
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 2.42428 s, 886 MB/s

這裡有一個奇怪的現象,從一般硬碟中讀取資料的速度很快,這是因為在 Linux 中會使用多餘的記憶體作為檔案的 Cache,所以才會有這麼快的讀取速度,如果想知道實際的硬碟讀取速度,可以強迫系統將 Cache 釋放後,再來讀取:
sudo echo 3 > /proc/sys/vm/drop_caches
dd count=2k bs=1M if=/tmp/test2g.img of=/dev/null

輸出為
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 35.7114 s, 60.1 MB/s

這樣看起來就比較像實際的狀況了。

事實上在前面的硬碟寫入時,也會有 buffer 的問題,Linux 在寫入資料到檔案時,有時候會先將資料放進 buffer 中,沒有馬上寫進硬碟,這樣會比較有效率。所以事實上硬碟的速度沒有那麼快,也就是因為 Linux 系統中有這樣的 buffer 機制,所以在關機或是重新開機時,都會需要把每個硬碟進行 umount,將資料寫入硬碟後才斷電,這也就是為什麼隨身碟或外接硬碟插在 Linux 系統下,要拔起來時一定要正常 umount 完才能拔,否則運氣不好的話,就會把一些資料遺漏在記憶體中,導致資料的損毀。

我想我們在這裡只是做一個大概的測試,不用很精準,如果想很精準的測試出硬碟的寫入速度,可以在 dd 指令後加上 sync,強迫資料寫入硬碟,再計算兩者的的時間,不過不管怎麼做都還是會有誤差,因為系統中一定有其他的 process 在跑,若其他的 process 也有讀寫硬碟的動作,就會影響測試的數據,所以這裡我想就大約看看就好了。

我們把上面測試的數據畫成長條圖來看看,下面這張圖就是 RAM Disk 與硬碟的差異:




很明顯的可以看出 RAM Disk 與一般硬碟的寫入速度相差非常多。

這裡的數據是我用一臺舊電腦測試的,所以效率看起來不高,接著用一臺比較新的電腦測試看看:




這台電腦比較新,硬碟是由四顆實體硬碟串起來做 RAID 5,所以硬碟效能好很多,而記憶體的存取速度也比電腦快,所以整體效能都比舊機器好。在這裡也可以看出來,不管在新舊的電腦上,RAM Disk 與一般硬碟始終存在很大的差異。


參考資料:Linux Screw
本站已經搬家了,欲查看最新的文章,請至 G. T. Wang 新網站