2015年5月29日 星期五

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



http://blogger.gtwang.org/2013/01/linux-ram-disk.html

在 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 與一般硬碟始終存在很大的差異。

沒有留言:

張貼留言

2007 to 2023 HP and Dell Servers Comparison

  HP Gen5 to Gen11  using ChatGPT HP ProLiant Gen Active Years CPU Socket Popular HP CPUs Cores Base Clock Max RAM Capacity Comparable Dell ...