(linux memory file system)Linux 上使用 RAM Disk(把記憶體當硬碟使用) 提高資料讀寫速度-分析log運算用
資料來源:http://www.gtwang.org/2013/01/linux-ram-disk.html
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
這樣看起來就比較像實際的狀況了。
沒有留言:
張貼留言