標籤: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/)