|
我們都知道,對于單臺服務(wù)器來說,除了 CPU ,內(nèi)存就是我們存儲數(shù)據(jù)最快的設(shè)備。如果可以把數(shù)據(jù)直接存儲在內(nèi)存中,對于性能的提升就不言而喻了。那么我們先來講講如何使用內(nèi)存來存儲文件。 首先,我們先來看看操作系統(tǒng),在你的系統(tǒng)中執(zhí)行 df –h 查看系統(tǒng)的磁盤使用。 [root@test conf]#netstat -na | grep 192.168.99.159:80
你會發(fā)現(xiàn)除了我們正常的磁盤分區(qū)掛載點外,系統(tǒng)還有一種叫做 devtmpfs 的文件系統(tǒng),和多個 tmpfs。那么什么是 tmpfs 呢?
tmpfs 簡介
tmpfs 是 Linux/Unix 系統(tǒng)上的一種基于內(nèi)存的文件系統(tǒng)。 tmpfs 可以使用您的內(nèi)存或 swap 分區(qū)來存儲文件。在 Redhat/CentOS 等 linux 發(fā)行版中默認大小為物理內(nèi)存的一半。例如上面的案例中,我執(zhí)行 df -h 的服務(wù)器是 64G 內(nèi)存。
首先我們要說明, tmpfs 既可以使用物理內(nèi)存,也可以使用交換分區(qū),因為 tmpfs 使用的是 “ 虛擬內(nèi)存 ” 。 Linux 內(nèi)核的虛擬內(nèi)存同時來源于物理內(nèi)存和交換分區(qū),主要由內(nèi)核中的 VM 子系統(tǒng)進行調(diào)度,進行內(nèi)存頁和 SWAP 的換入和換出操作, tmpfs 自己并不知道這些頁面是在交換分區(qū)還是在物理內(nèi)存中。
tmpfs 使用
如果你想使用 tmpfs ,那么最簡單的辦法就是直接將文件存放在 /dev/shm 下,雖然這并不是推薦的方案,因為 /dev/shm 是給共享內(nèi)存分配的,共享內(nèi)存是進程間通信的一種方式。
下面我們來做一個小實驗,檢驗下 tmpfs 的特性,首先我們可以看到我目前的系統(tǒng) /dev/shm 的使用是 12K ,可用的內(nèi)存為 62237 。 [root@linux-node1 ~]# df -h
**省略部分輸出** [root@test conf]#netstat -na | grep 192.168.99.159:80
這里我準備了一個 81M 的文件,我準備把它放入到 tmpfs 中。 # ls -lh /usr/local/src/
下面我們再來看磁盤大小和內(nèi)存大小??梢园l(fā)現(xiàn) /dev/shm 的大小變成了 81M ,可用內(nèi)存變成了62156 。 [root@linux-node1 ~]# df -h
**省略部分輸出** [root@linux-node1 ~]# free -m
我們來做一個小學(xué)數(shù)學(xué)題
好的,現(xiàn)在你可以將這個 81M 的文件移動走,會發(fā)現(xiàn)內(nèi)存使用率恢復(fù)如初,可以證明 tmpfs 是動態(tài)變化的,數(shù)據(jù)被移除后,所占用的虛擬內(nèi)存也會被釋放,這里我不在截圖了,大家可以自行實驗。
tmpfs 掛載
與其他文件系統(tǒng)不同, tmpfs 無需要建立或格式化,只需要直接使用 mount 掛載就會自動被建立: # mount -t tmpfs tmpfs /mnt/tmp
tmpfs 32G 0 32G 0% /mnt/tmp
現(xiàn)在我們就掛載了一個 tmpfs 文件系統(tǒng)到 /mnt/tmp 目錄下,默認它是系統(tǒng)內(nèi)存的一半,你可以自由的使用它,那么我們第一個問題就是,如何能夠自定義分配的內(nèi)存大小, tmpfs 支持相關(guān)的選項來讓用戶自定義 Linux 上的 tmpfs 支援三個掛載選項:
以上三個選項都可以在數(shù)值后面加上 k 、 m 、 g 來表示單位。 你可以在掛載的時候直接使用這些選項 # mount-t tmpfs -o size=1G tmpfs /mnt/mytmpfs 也可以在掛載后,重新掛載 (remount) tmpfs 即可改變內(nèi)存上限: # mount -o remount,size=512m/mnt/tmp
tmpfs 的優(yōu)勢下面我們來總結(jié)一下 tmpfs 的優(yōu)勢,其實我們已經(jīng)證明過了。 1.存儲空間動態(tài)變化
在 tmpfs 存放的文件是動態(tài)占用內(nèi)存空間的,隨著文件占用空間的增大而增大文件系統(tǒng),文件被刪除時,動態(tài)地減小文件系統(tǒng)空間并釋放內(nèi)存。這一切都是 tmpf 自動處理的。
2.速度
天下武功,唯快不破。 tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 文件系統(tǒng)會完全駐留在內(nèi)存中,讀寫幾乎可以是瞬間的。即使用了一些交換分區(qū),性能仍然是非常快的。
3.沒有持久性
當(dāng)你喜歡一個東西的時候,它的缺點在你眼里也會是優(yōu)點,沒有持久性其實是 tmpfs 的缺點,所以一定不要把系統(tǒng)關(guān)機或者重啟后還需要保存的數(shù)據(jù)放入 tmpfs 。因為虛擬內(nèi)存本質(zhì)上就是易失的,但正是這種特性,實際上可能不是一件壞事。它讓 tmpfs 成為一個保存您不想在系統(tǒng)重啟后保留的數(shù)據(jù)的卓越的文件系統(tǒng)。
tmpfs 應(yīng)用案例以下是使用 tmpfs 文件系統(tǒng)的一些應(yīng)用示例,一般 tmpfs 內(nèi)存文件系統(tǒng)在做 web 緩存, cache,臨時文件存儲時會對 web 訪問有很好的加速作用,從而提高網(wǎng)站訪問的速度。
1. 反向代理緩存中,緩存目錄使用 tmpfs
例如下面是 Nginx 作為反向代理緩存的配置片段,可以將 /data/cdn_cache 目錄掛載為 tmpfs 。 proxy_temp_path /data/cdn_cache/proxy_temp_dir;
2 . 將 php 的 session 文件放在 tmpfs 下
PHP 保存 seesion 的方法很簡單 , 只要修改 php.ini 就行了,首先掛載好 tmpfs ,然后修改配置文件如下: session.save_path = “/data/php_session”
3. 將服務(wù)的 socket 文件放在 tmpfs 下
例如在 Web 應(yīng)用中,我們有 PHP 的 FastCGIsocket 、 MySQL 的 mysql.sock 等等類似的socket 文件,都可以放在 tmpfs 掛載的目錄下提高性能。 |
|
|