1. 程式人生 > >linux記憶體檔案系統之指南

linux記憶體檔案系統之指南

記憶體檔案系統使用及示例:ramdisk, ramfs, tmpfs 
第一部分
在Linux中可以將一部分記憶體mount為分割槽來使用,通常稱之為RamDisk。 
RamDisk有三種實現方式: 
第一種就是傳統意義上的,可以格式化,然後載入。 
這在Linux核心2.0/2.2就已經支援,其不足之處是大小固定,之後不能改變。 
為了能夠使用Ramdisk,我們在編譯核心時須將block device中的Ramdisk支援選上,它下面還有兩個選項,一個是設定Ramdisk的大小,預設是4096k;另一個是initrd的支援。 
如果對Ramdisk的支援已經編譯進核心,我們就可以使用它了: 
檢視一下可用的RamDisk,使用ls /dev/ram* 
首先建立一個目錄,比如test,執行mkdir /mnt/test; 
然後對/dev/ram0 建立檔案系統,執行mke2fs /dev/ram0; 
最後掛載 /dev/ram0,執行mount /dev/ram /mnt/test,就可以象對普通硬碟一樣對它進行操作了。

更詳細的內容可以參考: http://www.linuxfocus.org/ChineseGB/November1999/article124.html                                                 http://www.vanemery.com/Linux/Ramdisk/ramdisk.html

另兩種則是核心2.4才支援的,通過Ramfs或者Tmpfs來實現: 
它們不需經過格式化,用起來靈活,其大小隨所需要的空間而增加或減少。

Ramfs顧名思義是記憶體檔案系統,它它處於虛擬檔案系統(VFS)層,而不像ramdisk那樣基於虛擬在記憶體中的其他檔案系統(ex2fs)。

因而,它無需格式化,可以建立多個,只要記憶體足夠,在建立時可以指定其最大能使用的記憶體大小。 
如果你的Linux已經將Ramfs編譯進核心,你就可以很容易地使用Ramfs了。建立一個目錄,載入Ramfs到該目錄即可: 
                  # mkdir  /testRam 
                  # mount -t ramfs none /testRAM 
預設情況下,Ramfs被限制最多可使用記憶體大小的一半。可以通過maxsize(以kbyte為單位)選項來改變。 
                  # mount -t ramfs none /testRAM -o maxsize=2000 (建立了一個限定最大使用記憶體為2M的ramdisk)

Tmpfs是一個虛擬記憶體檔案系統,它不同於傳統的用塊裝置形式來實現的Ramdisk,也不同於針對實體記憶體的Ramfs。 
  Tmpfs可以使用實體記憶體,也可以使用交換分割槽。在Linux核心中,虛擬記憶體資源由實體記憶體(RAM)和交換分割槽組成,這些資源是由核心中的虛擬記憶體子系統來負責分配和管理。 
  Tmpfs向虛擬記憶體子系統請求頁來儲存檔案,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在記憶體中還是在交換分割槽中。同Ramfs一樣,其大小也不是固定的,而是隨著所需要的空間而動態的增減。 
   使用tmpfs,首先你編譯核心時得選擇"虛擬記憶體檔案系統支援(Virtual memory filesystem support)" 。 
  然後就可以載入tmpfs檔案系統了: 
            # mkdir -p /mnt/tmpfs 
            # mount tmpfs /mnt/tmpfs -t tmpfs 
  同樣可以在載入時指定tmpfs檔案系統大小的最大限制: 
           # mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

使用df -aT命令可以看到有個/dev/shm目錄,該目錄的檔案系統是tmpfs的,因此這個目錄下的檔案訪問是非常快的,但是其大小可能不同機器都不一樣,而且每次重啟後文件也就丟失了。

第二部分
LINUX下我所接觸過的記憶體檔案系統有三個:

(1)ramdisk,使用前需要先建立檔案系統,並且調整檔案系統大小比較麻煩,需要修改核心引導引數並重新啟動作業系統,在繁雜多變的應用與需要 7X24不間斷執行的系統來說,並不是一個可以接受的選擇.好處是自2.0版本起核心便支援(這也算好處?嗯,確實算,如果你手頭真有這樣的系統的話)

(2)ramfs,使用前不需要去建立檔案系統了,直接通過mount的方式即可掛載上來用,需要的時候可以使用"mount -o remount,maxsize=..."這種方式來調整大小.

(3)tmpfs,同ramfs在表面上基本上一樣啦,不同於ramfs針對"實體記憶體",tmpfs是在虛擬記憶體下分配空間的,也就是說tmpfs例項中儲存的檔案既可能存在於實體記憶體中,也可能存在於交換分割槽中,具體存在哪裡,是由"虛擬記憶體子系統"來排程的.

純效能角度講,ramfs會在程序佔用記憶體使用較多的情況下會優於tmpfs,在沒有交換分割槽或程序佔用記憶體較小而不發生swap行為的情況下,兩者效能不會有差異(這個結論沒有實測過,我"想當然"用猜的)

基本情況介紹完畢,下面介紹tmpfs的應用,(沒辦法,我手頭機器記憶體不是那麼寬裕...)

0,根據需要建立掛載目錄,例:

mkdir -p $DIR_TMP;

1,掛載

mount my_tmpfs $DIR_TMP -t tmpfs -o size=512m

my_tmpfs這個名字需要起,一個標識而已,會出現在df 的Filesytem一列,起個別致點的名字比較容易被自己寫的其它監控指令碼找到,如果非要起個none或tmpfs之類的名字的話...反正系統預設掛載的tmpfs都比較喜歡用這兩個名字,好壞自己琢磨吧.

成功以後自己用df 看一下就知道了,寫監控指令碼時可以用"df -t tmpfs|grep ^my_tmpfs"來找到這一行.

2,調整

應用中如果感覺不合適,隨時可以用mount命令調整

mount $DIR_TMP -o remount,size=1024m,nr_inodes=100k

nr_inodes為最大節點數,如果你的$DIR_TMP使用df命令檢視明明有空間,卻無法建立新檔案(例如touch一個新檔案),可能是檔案節點用到上限了,可以用"df -i"命令來檢視,如果是有空間但節點達到上限,就需要用nr_inodes來調整了.

其它可以調整的引數:
mode,uid,gid,
        uid和gid就不多說了,不知道的回家補基礎,mode也不多說了,取值是3個八進位制數字,表示許可許可權,不知道這個的也回家...
其它引數,參見mount命令的man page之OPTIONS一節中"-o"引數的說明.

3,解除安裝

umount $DIR_TMP

4,其它

mount 命令的man page中對tmpfs提及不多,詳細一些的文件,請參閱核心文件Documentation/filesystems/tmpfs.txt(核心原始碼目錄內)

當任何目錄有 mount, 然後有程式使用/掛在那個目錄上的話, 就沒有辦法 umount 掉,  umount 時會出現 Device is busy 的訊息,解決方法

fuser -m -v -i -k 目錄路徑 # 會問你是不是要把相關的程序kill掉, 選 y 就會 kill 掉

  1. 淺談Linux記憶體管理機制

    經常遇到一些剛接觸Linux的新手會問記憶體佔用怎麼那麼多?在Linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統佔用了,表面感覺是記憶體不夠用了,其實不然.這是Linux記憶體管理的一個優秀特性,在這 ...

  2. linux記憶體管理

    一.Linux 程序在記憶體中的資料結構 一個可執行程式在儲存(沒有調入記憶體)時分為程式碼段,資料段,未初始化資料段三部分:    1) 程式碼段:存放CPU執行的機器指令.通常程式碼區是共享的,即其它執行程 ...

  3. Spark入門實戰系列--10.分散式記憶體檔案系統Tachyon介紹及安裝部署

    [注]該系列文章以及使用到安裝包/測試資料 可以在<傾情大奉送--Spark入門實戰系列>獲取 .Tachyon介紹 1.1 Tachyon簡介 隨著實時計算的需求日益增多,分散式記憶體計算 ...

  4. Linux及檔案系統基本介紹

    Linux及檔案系統基本介紹 1   網際網路行業現狀 在伺服器端市場: 超級計算機 2014年11月的資料顯示前500系統中的485個系統都在執行著 Linux 的釋出系統,而僅僅只有一臺執行著 Wi ...

  5. Linux記憶體管理原理

    本文以32位機器為準,串講一些記憶體管理的知識點. 1. 虛擬地址.實體地址.邏輯地址.線性地址 虛擬地址又叫線性地址.linux沒有采用分段機制,所以邏輯地址和虛擬地址(線性地址)(在使用者態,核心態邏 ...

  6. linux記憶體分配

    在linux的記憶體分配機制中,優先使用實體記憶體,當實體記憶體還有空閒時(還夠用),不會釋放其佔用記憶體,就算佔用記憶體的程式已經被關閉了,該程式所佔用的記憶體用來做快取使用,對於開啟過的程式.或是讀取剛存取過 ...

  7. [20150925]Linux之檔案系統與SHELL

    Linux之檔案系統與SHELL 檔案系統介紹 ext2/ext3/ext4 Ext2是GNU/Linux系統中標準的檔案系統.這是Linux中使用最多的一種檔案系統,它是專門為Linux設計的,擁有 ...

  8. 檔案系統管理 之 Linux 建立檔案系統及掛載檔案系統流程詳解

    閱讀此文,必須具備知識點:<Linux 檢視磁碟分割槽.檔案系統.使用情況的命令和相關工具介紹><例項解說 fdisk 使用方法><合理規劃您的硬碟分割槽><Fe ...

  9. 瞭解linux記憶體管理機制(轉)

    今天瞭解了下linux記憶體管理機制,在這裡記錄下,原文在這裡http://ixdba.blog.51cto.com/2895551/541355 根據自己的理解畫了張圖: 下面是轉載的內容: 一 物理 ...

隨機推薦

  1. stm32新建工程詳細步驟

    記得好早以前為了建一個keil的工程折騰了好久,在這裡寫寫基本的Keil工程建立方法,以防自己以後再忘記: 新建工程 儲存工程 選擇器件 在這邊新建資料夾,然後就是新增程式程式碼到裡面去了.其中一些檔案 ...

  2. IDEA中maven搭建Spring+SpringMVC+mybatis專案

    一.介紹 使用IDEA搭建maven web專案,整合框架Spring+SpringMVC+mybatis 專案結構圖:

  3. java web工程 資料庫操作報驅動類找不到的錯誤

    這幾天在進行資料庫的操作,寫好資料庫操作類後,用測試類測試成功通過,但是部署到tomcat後,從頁面訪問就會報異常. 最後終於發現是tomcat使用了連線池的資料連線方式. 解決方法是把jdbc ja ...

  4. CodeForces 450B 矩陣

    A - Jzzhu and Sequences Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  5. python中獲取當前所有的logger

    獲得當前所有logger的列表的程式如下: import logging for name in logging.Logger.manager.loggerDict.keys(): logger = ...

  6. &lt;一道題&gt;abc+cba=1333,求滿足條件的abc的值,隱含條件a!=0,c!=0

    這類東西,無非就是窮舉法.見下面程式碼: #include <stdio.h> #include <stdlib.h> /* *abc + cba = 1333 * *a = ? ...

  7. 《如何將windows上的軟體包或檔案上傳到linux服務上》

    昨天晚上朋友讓我幫他簡單的搭建個環境,他公司讓他做款軟體測試溫度的,他自己搞的是嵌入式,在公司擔任的是軟體工程師,應屆畢業生.也可能他們搞嵌入式的對這個linux系統不太熟,不會把windows上的軟 ...

  8. LR_問題_控制器不能使用定義的負載生成器

    問題描述 在controller 中設定了面向目標的方案後 執行提示 The target you defined cannot be reached.the LoadRunner Controlle ...

  9. MySQL CURDATE() 函式

    定義和用法 CURDATE() 函式返回當前的日期. 語法 CURDATE() 例項 例子 1 下面是 SELECT 語句: SELECT NOW(),CURDATE(),CURTIME() 結果類似 ...

  10. 轉(NLP必讀)

    如果你剛接觸自然語言處理並對她感興趣,最好讀幾本這方面的書籍,除了能讓你知道自然語言處理各個領域是幹什麼的外,還能培養一下NLP的感覺.以下四本書是我讀研期間閱讀和接觸過的,如果您還有好書推薦,歡迎補 ...