天天看點

RamDisk ramfs tmpfs 詳解

一 什麼是RamDisk Ram:記憶體,Disk:磁盤,在Linux中可以将一部分記憶體當作分區來使用,稱之為RamDisk。對于一些經常被通路、并且不會被更改的檔案,可以将它們通過RamDisk放在記憶體中,能夠明顯地提高系統性能。RamDisk工作于虛拟檔案系統(VFS)層,不能格式化,但可以建立多個RamDisk。雖然現在硬碟價錢越來越便宜,但對于一些我們想讓其通路速度很高的情況下,RamDisk還是很好用的。 如果對計算速度要求很高,可以通過增加記憶體來實作,使用ramdisk技術。一個A RamDisk就是把記憶體假設為一個硬碟驅動器,并且在它的上面存儲檔案。假設有幾個檔案要頻繁的使用,如果将它們加到記憶體當中,程式運作速度會大幅度提高,因為記憶體的讀寫速度遠高于硬碟。劃出部分記憶體提高整體性能,不亞于更換新的CPU。像Web伺服器這樣的計算機,需要大量讀取和交換特定的檔案。是以,在Web伺服器上建立RamDisk會大大提高網絡讀取速度。   二 如何使用RamDisk

格式化一個ramdisk并把他加到一個目錄上。列出所有可用的ramdisk用“ls -al /dev/ram*”。這就會列出你現有可用的ramdisk。這些ramdisk并不搶奪記憶體,除非進行格式化的一類操作。這裡有一個使用ramdisk的例子。

# create a mount point:

mkdir /tmp/ramdisk0

# create a filesystem:

mke2fs /dev/ram0

# mount the ramdisk:

mount /dev/ram0 /tmp/ramdisk0

這三個指令将為ramdisk建立一個目錄,格式化ramdisk(建立檔案系統),并且加載這個ramdisk到"/tmp/ramdisk0". 現在你可以将這個目錄看成一個虛拟的分區。使用它就象使用其它的目錄一樣。

如果對ramdisk的格式化失敗,那就是你的核心不支援ramdisk。其核心配置選項是 CONFIG_BLK_DEV_RAM .

ramdisk的預設大小是 4Mb=4096 blocks. 在你進行mke2fs的時候你可以看到你的ramdisk的大小。mke2fs /dev/ram0 将産生類适于以下的資訊:

mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09

Linux ext2 filesystem format

Filesystem label=

1024 inodes, 4096 blocks

204 blocks (4.98%) reserved for the super user

First data block=1

Block size=1024 (log=0)

Fragment size=1024 (log=0)

1 block group

8192 blocks per group, 8192 fragments per group

1024 inodes per group

執行df -k /dev/ram0 你實際用了多少空間:

>df -k /dev/ram0

Filesystem   1k-blocks   Used Available Use% Mounted on

/dev/ram0         3963     13       3746    0% /tmp/ramdisk0

那麼麻煩是什麼呢?在系統重新啟動的時候,将重新整理這個區域。不要将任何沒有拷貝的資料放在這個區域。如果你對這個目錄進行了修改,并且需要保留這些修改,采取一些辦法進行備份。   三改變RamDisks 的大小

要想使用RamDisk你必須或是得到核心的支援或是以子產品的形式将他加載到系統中。其中核心的配置選項是 CONFIG_BLK_DEV_RAM . 把ramdisk編譯成一個可加載的子產品的好處是你可以在加載是重新确定ramdisk的大小。

第一個辦法。在lilo.conf檔案中加入:

ramdisk_size=10000 (or ramdisk=10000 for old kernels)

這樣在你使用lilo指令和重新啟動計算機之後,ramdisk的預設大小将會是10M。這是一個/etc/lilo.conf檔案的例子:

boot=/dev/hda

map=/boot/map

install=/boot/boot.b

prompt

timeout=50

image=/boot/vmlinuz

label=linux

root=/dev/hda2

read-only

ramdisk_size=10000

确切的說,我隻是使用了9M多的空間,檔案系統也将占用一定空間。

當你以子產品的形式編譯ramdisk時,你可以在加載的時候決定ramdisk的大小。這也可以通過修改/etc/conf.modules 的選項設定來做到。

options rd rd_size=10000

或是在指令行中指定參數給ismod:

insmod rd rd_size=10000

以下是介紹如何使用這樣的子產品的例子:

解除安裝ramdisk,umount /tmp/ramdisk0 .

解除安裝子產品(再上一節所提到的過程中自動加載), rmmod rd

加載ramdisk子產品并且把它的大校設為20M,insmod rd rd_size=20000

建立一個檔案系統, mke2fs /dev/ram0

加載ramdisk, mount /dev/ram0 /tmp/ramdisk0 四 RamDisk的優缺點 RamDisk就是将記憶體模拟為硬碟空間。無論什麼時候你使用RamDisk,實際上你是在使用記憶體而不是硬碟。在這一點上既有優點又有缺點。最基本的,最大的優點是你是在使用記憶體,你所做的一切都會快一些,因為硬碟的速度較記憶體慢。最大的缺點是如果你改變了資料庫伺服器的内容并且重新啟動機器時,所做的一切改動都将丢失。

什麼是ramfs?

ramfs是一個簡單的檔案系統,它是基于ram的動态檔案系統的一種Linux硬碟緩沖機制。

一般的在Linux上所有的檔案都被緩沖在記憶體中。記憶體中的資料頁在回寫後仍然會儲存在記憶體中以防再次使用,但是回寫後的資料會被辨別為clean,這樣系統就可以用這些内容幹别的事情了。同樣的,檔案資料再被回寫後也被表識為clean,但是并沒有在記憶體中擦除知道虛拟記憶體對他再次配置設定。一個相似的機制也同樣适用于目錄。

對于ramfs,它沒有回寫位址。檔案寫入ramfs中後和平時一樣配置設定目錄和頁,但是他們回寫不了。這就意味着他們的記憶體永遠也不能被辨別為clean,是以他們在期待回收記憶體的時候不會被虛拟記憶體釋放。

需要填充到ramfs的代碼很少,因為大部分的工作都被Linux已有的緩存機制做了。基本上,你就如同挂載檔案系統。基于此,ramfs在memuconfig不是一個可選項,由于他可以節省的空間可

以忽略。

ramfs and ramdisk

比較老的ramdisk在記憶體區外配置設定一個綜合的塊,用它作為檔案系統的回寫堆。這個塊的是固定大小的,是以挂載的檔案系統也是固定的。而且額外的開銷也很大。

和ramfs對比,ramdisk浪費了空間,讓cpu做了不必要的工作,弄髒了cpu的緩存。總之,ramfs 相對來說比較簡單。

另外一個原因,ramfs被半廢除的原因是對回環的提出。回環提供了一個更靈活和友善的方式去産生一個塊裝置,用拷貝檔案代替了拷貝記憶體大塊。

ramfs and tmpfs

ramfs的一個确定是你可以一直向裡面寫資料,直到記憶體被填滿。虛拟記憶體不能釋放他因為它沒有回寫位址。是以,隻有root使用者才可以被允許通路ramfs.

ramfs的衍生物tmpfs,tmpfs産生一個大小受限,可以将資料寫入交換空間的機制。一般使用者也可以通路tmpfs.

rootfs是一個ramfs的特殊執行個體,他在2.6系統中呈現。你不能解除安裝rootfs就如同你不能殺死init程序。他很小也很簡單去檢查确定的清單不能為空。

如果config_tmpfs選項被啟動了,roofs将使用tmpfs代替ramfs。如果要強制使用ramfs,可以再核心的指令行使用參數rootfstype=ramfs.

what is initramfs?

2.6 linux 核心中包含了一個gzipped “cpio”格式的目錄項,在核心boot階段被加載到rootfs裡面。在被加載完成後,核心檢查rootfs中是否有init檔案,如果有,就用PID為1來執行他。init檔案實作定位和挂載真正的根裝置。如果沒有Init程式,核心将檢查其他的變量,如“/sbin/init”.

參考資料:http://askubuntu.com/questions/296038/what-is-the-difference-between-tmpfs-and-ramfs

首先ramfs和tmpfs做相同的事情但是有一些差異。ramfs 是動态的,其最大的值就是ram的空間值。

tmp不是動态增長的,在加載tmpfs時可以說明加載大小。tmpfs使用交換分區,而ramfs沒使用。

tmpfs的用途

例如:

Oracle 中的Automatic Memory Management特性就使用了/dev/shm。

LINUX中可以把一些程式的臨時檔案放置在tmpfs中,利用tmpfs比硬碟速度快的特點提升系統性能。

調整tmpfs大小大緻有以下三種方法:

1.直接挂載到需要的目錄--比如系統的臨時目錄-可以根據實際需要挂載某個程式的臨時檔案的目錄

[[email protected] ~]# mount -t tmpfs -o size=20m tmpfs /tmp

[[email protected] ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 16G 10G 4.7G 69% /

/dev/sda1 99M 21M 74M 22% /boot

tmpfs 502M 0 502M 0% /dev/shm

tmpfs 20M 0 20M 0% /tmp

由于沒有挂載之前/tmp目錄下的檔案也許正在被使用,是以挂載之後系統也許有的程式不能正常工作。可以寫入/etc/fstab,這樣重新開機後也有效。

2./etc/fstab檔案來修改/dev/shm的容量(增加size=100M選項即可),修改後,重新挂載即可:

[[email protected] ~]# cat /etc/fstab

LABEL=/ / ext3 defaults 1 1

LABEL=/boot /boot ext3 defaults 1 2

tmpfs /dev/shm tmpfs defaults,size=600M 0 0

tmpfs /tmp tmpfs defaults,size=25M 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

LABEL=SWAP-sda3 swap swap defaults 0 0

/dev/sda5 swap swap defaults 0 0

[[email protected] ~]# mount -a --測試/etc/fstab無錯誤,重新開機OS系統

[[email protected] ~]$ df -h --重新開機後的資訊如下,tmpfs檔案系統的對應條目已經改變為配置的

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 16G 10G 4.7G 69% /

/dev/sda1 99M 21M 74M 22% /boot

tmpfs 600M 0 600M 0% /dev/shm

tmpfs 25M 0 25M 0% /tmp

3./dev/shm建一個tmp目前,并與/tmp綁定。 --這方法有點煩瑣,不如方法1友善快捷。

[[email protected] ~]# mkdir /dev/shm/tmp

[[email protected] ~]# chmod 1777 /dev/shm/tmp

[[email protected] ~]# mount --bind /dev/shm/tmp /tmp -注意mount --bind 這裡bind前是兩個-

[[email protected] ~]# ls -ld /tmp

drwxrwxrwt 2 root root 40 Dec 8 12:15 /tmp

[[email protected] ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 16G 10G 4.7G 69% /

/dev/sda1 99M 21M 74M 22% /boot

tmpfs 600M 0 600M 0% /dev/shm

tmpfs 600M 0 600M 0% /tmp ----可以看到/tmp使用到了 /dev/shm的空間。

繼續閱讀