Linux下tempfs及/dev/shm原理與應用

來源:互聯網
上載者:User

標籤:linux   檔案系統   tempfs   shm   

引言:

在linux或unix中使用df命令查看檔案系統會發現類似如下資訊(ubuntu12.04)

其中有一部分是tmpfs檔案系統,掛在/rum下,還有個 none檔案系統掛在/run/shm下。

什麼是tmpfs?

tmpfs是Linux/Unix系統上的一種基於記憶體的檔案系統。tmpfs可以使用您的記憶體或swap分區來隱藏檔。由此可見,temfs主要儲存暫存的檔案。

linux核心中的VM子系統負責在後台管理虛擬記憶體資源Virtual Memory,即RAM和swap資源,透明地將RAM頁移動到交換分區或從交換分區到RAM頁,tmpfs檔案系統需要VM子系統的頁面來隱藏檔。tmpfs自己並不知道這些頁面是在交換分區還是在RAM中;做這種決定是VM子系統的工作。tmpfs檔案系統所知道的就是它正在使用某種形式的虛擬記憶體。

tmpfs基於記憶體,因而速度是相當的,另外tmpfs使用的VM資源是動態,當刪除tmpfs中檔案,tmpfs 檔案系統驅動程式會動態地減小檔案系統並釋放 VM 資源,當然在其中建立檔案時也會動態分配VM資源。另外,tmpfs不具備持久性,重啟後資料不保留,原因很明顯,它是基於記憶體的。

編譯核心時,啟用“Virtual memory file system support”就可以使用tmpfs,linux kernel從2.4以後都開始支援tmpfs。目前主流的linux系統預設已啟用tmpfs,如Redhat。

什麼是/dev/shm?

看到dev大家都使知道它是一個裝置檔案。使用tmpfs檔案系統,在Redhat/CentOS等linux發行版中預設大小為實體記憶體的一半。如我的虛擬機器裝的是CentOS6.0,分配記憶體為1G,所以/dev/shm為500M左右。

[[email protected] tmp]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda3             8.8G  4.0G  4.5G  48% /

tmpfs                 499M   88K  499M   1% /dev/shm

/dev/sda1              97M   43M   50M  47% /boot

tmpfs是基於記憶體的檔案系統,建立時不需要使用mkfs等初始化。如我想把/dev/shm tmpfs大小改為512M.

ps:而我的系統裡

none->/dev/shm
即系統的虛擬記憶體。Windows中叫緩衝。


#vi /etc/fstab

tmpfs       /dev/shm    tmpfs  defaults   0   0

更改為

tmpfs       /dev/shm    tmpfs  defaults,size=512m   0    0

[[email protected] tmp]# mount -o remount /dev/shm

[[email protected] tmp]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda3             8.8G  4.0G  4.5G  48% /

tmpfs                 512M   88K  512M   1% /dev/shm

/dev/sda1              97M   43M   50M  47% /boot

怎麼樣,變成512M啦,使用很方便吧,哈哈。

當然在生產環境中你可以把記憶體加大些,反正現在記憶體很便宜啦,為了提高效能也需要將/dev/shm加大。如:

mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm

nr_innodes指定索引節點數,nodiratime  man中解釋如下:

nodiratime  Do  not  update directory inode access times on this filesystem.

不更新目錄被訪問時inode中的記錄資訊,noatime同理,好處你懂的。


tmpfs應用

tmpfs是基於記憶體的,速度是不用說的,硬碟和它沒法比。

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

另外如果在網站營運中好好利用tmpfs,將有意想不到的收穫。

我們先在/dev/shm建一個tmp目前,並與/tmp綁定。

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

[[email protected] shm]# chmod 1777 /dev/shm/tmp  //注意一下許可權

[[email protected] shm]# mount –bind /dev/shm/tmp /tmp

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

drwxrwxrwt 2 root root 40 Aug 29 23:58 /tmp

當然您也可以不綁定,直接mount在現有的安裝點上使用tmpfs,如:

#umount   /tmp

#mount  tmpfs  /tmp   -t tmpfs   -o size=512M


也很方便吧,不需要使用mkfs等命令建立。


以下/tmp使用tmpfs檔案系統。

(1)將squid的緩衝目錄cache_dir放到/tmp下

cache_dir ufs /tmp 256 16 256

重啟一下squid服務,這樣緩衝目錄都放在了tmpfs檔案中了,速度不用說吧。

(2)將php的session檔案放在/tmp下

通過phpinfo測試檔案查看你的php session儲存位置,如果不在/tmp下,修改php.ini檔案,修改如下:

session.save_path = “/tmp”

當然如果您的網站訪問量比較大,可/tmp下設定分層目錄存放session,文法如下:

session.save_path=”N;/save_path”,N 為分級的級數,save_path 為開始目錄。

(3)將服務的socket檔案放在/tmp下

如nginx.socket和mysql.sock

網上的此類文檔太少,本人研究也不夠深入,歡迎大家在評論中與我交流你的看法。(http://blog.51osos.com/linux/linux-temfs-dev-shm/)




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.