
在 gentoo 的 /etc/fstab 有這一段:
代碼: |
# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for # POSIX shared memory (shm_open, shm_unlink). # (tmpfs is a dynamically expandable/shrinkable ramdisk, and will # use almost no memory if not populated with files) # Adding the following line to /etc/fstab should take care of this: none /dev/shm tmp fsdefaults 0 0 |
簡單的說 tmpfs 是一套以使用記憶體為基礎的檔案系統,不同於 ramdisk 的最大差別在於, ramdisk 雖然也使用記憶體..但它的行為屬於 Block device ,所以使用前必須先 format ( mkfs ) ,而 tmpfs 使用上就很方便囉.. 直接 mount 即可,例如把系統的 /tmp 改為 tmpfs ,您只要在 /etc/fstab 加入底下這段即可:
代碼: |
tmpfs /tmp tmpfs size=100m,mode=1777 0 0 |
其中 size 的單位為 mega byte ,請依照您的記憶體容量作適度調整,當您這麼做之後任何放在 /tmp 底下的檔案都將佔掉記憶體的容量!
tmpfs 的最大好處自然是速度快囉!但請留意因為是使用記憶體空間,所以重新開機後資料將全部消失!
巧用tmpfs加速你的linux服務器
預設系統就會掛載/dev/shm ,它就是所謂的tmpfs,有人說 ramdisk(虛擬磁碟),但兩者不一樣。像虛擬磁碟一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分割區來儲存資料。而且傳統的虛擬磁碟是個區塊裝置(block device),並需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個檔案系統,而不是區塊裝置;您只是安裝它,它就可以使用了。
tmpfs有以下優勢:
1。動態檔案系統的大小,
2。tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 檔案系統會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。
3。tmpfs 資料在重新啟動之後不會保留,因為虛擬記憶體本質上就是揮發性的。所以有必要做一些腳本(手稿 script)做諸如掛載,繫結(Binding)的操作。
好了講了一些大道理,大家看的煩了吧,還是講講我的應用吧:)
首先在/dev/shm建個 tmp 資料夾,然後與實際 /tmp 繫結
# mkdir /dev/shm/tmp
# chmod 1777 /dev/shm/tmp
# mount --bind /dev/shm/tmp /tmp
1。squid的緩衝記憶體目錄設置
# vi /etc/squid/squid.conf
修改成
cache_dir ufs /tmp 256 16 256
這裡的第一個256表示使用256M記憶體,我覺得高性能LINUX雙效防火牆HOWTO使用 ramdisk 的方法還不如直接使用 tmpfs,至少每次啟動不用 mkfs,還可以動態改變大小。
然後重新啟動一下服務,ok,現在所有的squid緩衝記憶體檔案都保存倒 tmpfs 檔案系統裡了,很快哦。
2。對php性能的最佳化
對於一個存取量大的以apache+php的網站,可能tmp下的暫存檔案都會很多,比如seesion或者一些緩衝檔案,那麼你可以把它保存到tmpfs檔案。
保存seesion的方法很簡單了只要修改 php.ini 就行了,由於我已經把 /dev/stm/tmp 與 /tmp 繫結,所以不改寫也行,至於php程序產生的緩衝檔案那只能改自己的php程序了:)
希望我的這個方法,能對你有所啟發。
init script:
#! /bin/sh
#
# mounttmpdir Mount /tmp after mounvirtfs exec-ed
#
# Version: @(#)mounttmpdir 0.01 24-Dec-2004 antony shen
#
# Script needs to be robust and continue when parts fail,
# so we're not setting the "-e" flag.
#set -e
PATH=/lib/init:/bin:/sbin
if [ -d /dev/shm ]
then
if [ ! -d /dev/shm/tmp ]
then
echo -n "Mounting /tmp under /dev/shm..."
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp
echo "OK.
fi
else
echo "Failed to find /dev/shm, unable to link /tmp under it!"
fi
接者,可以用 update-rc.d 指令:
update-rc.d mounttmpdir start 37 S .
將這個 init.d script 加到 rcS 裡面。就可以運作了。