前言
我們都知道,對於單台服務器來說,除了 CPU ,內存就是我們存儲數據最快的設備。如果可以把數據直接存儲在內存中,對於性能的提升就不言而喻了。那么我們先來講講如何使用內存來存儲文件。
首先,我們先來看看操作系統,在你的系統中執行 df –h 查看系統的磁盤使用。
[root@test conf]#netstat -na | grep 192.168.99.159:80
tcp 0 0 192.168.99.159:80 192.168.99.50:24584 ESTABLISHED

你會發現除了我們正常的磁盤分區掛載點外,系統還有一種叫做 devtmpfs 的文件系統,和多個 tmpfs。那么什么是 tmpfs 呢?
tmpfs 簡介
tmpfs 是 Linux/Unix 系統上的一種基於內存的文件系統。 tmpfs 可以使用您的內存或 swap 分區來存儲文件。在 Redhat/CentOS 等 linux 發行版中默認大小為物理內存的一半。例如上面的案例中,我執行 df -h 的服務器是 64G 內存。
首先我們要說明, tmpfs 既可以使用物理內存,也可以使用交換分區,因為 tmpfs 使用的是 “ 虛擬內存 ” 。 Linux 內核的虛擬內存同時來源於物理內存和交換分區,主要由內核中的 VM 子系統進行調度,進行內存頁和 SWAP 的換入和換出操作, tmpfs 自己並不知道這些頁面是在交換分區還是在物理內存中。
tmpfs 使用
如果你想使用 tmpfs ,那么最簡單的辦法就是直接將文件存放在 /dev/shm 下,雖然這並不是推薦的方案,因為 /dev/shm 是給共享內存分配的,共享內存是進程間通信的一種方式。
下面我們來做一個小實驗,檢驗下 tmpfs 的特性,首先我們可以看到我目前的系統 /dev/shm 的使用是 12K ,可用的內存為 62237 。
[root@linux-node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 1.1T 2.8G 1.1T 1% /
devtmpfs 32G 0 32G 0% /dev
tmpfs 32G 12K 32G 1% /dev/shm
**省略部分輸出**
[root@test conf]#netstat -na | grep 192.168.99.159:80
tcp 0 0 192.168.99.159:80 192.168.99.50:24584 ESTABLISHED
這里我准備了一個 81M 的文件,我准備把它放入到 tmpfs 中。
# ls -lh /usr/local/src/
total 81M
-rw-r--r-- 1 root root 81M Apr 14 22:46go1.6.1.linux-amd64.tar.gz
# cp/usr/local/src/go1.6.1.linux-amd64.tar.gz /dev/shm/
下面我們再來看磁盤大小和內存大小。可以發現 /dev/shm 的大小變成了 81M ,可用內存變成了62156 。
[root@linux-node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 1.1T 2.8G 1.1T 1% /
devtmpfs 32G 0 32G 0% /dev
tmpfs 32G 81M 32G 1% /dev/shm
**省略部分輸出**
[root@linux-node1 ~]# free -m
total used free shared buff/cache available
Mem: 64152 1445 60386 123 2320 62156
Swap: 16383 0 16383
我們來做一個小學數學題
-
可用內存: 62237-62156=81 ,證明我們放置的 81M 的文件是使用了內存空間。
-
共享內存: 123-42=81 ,證明 /dev/shm 是 Linux 給共享內存使用的
好的,現在你可以將這個 81M 的文件移動走,會發現內存使用率恢復如初,可以證明 tmpfs 是動態變化的,數據被移除后,所占用的虛擬內存也會被釋放,這里我不在截圖了,大家可以自行實驗。
tmpfs 掛載
與其他文件系統不同, tmpfs 無需要建立或格式化,只需要直接使用 mount 掛載就會自動被建立:
# mount -t tmpfs tmpfs /mnt/tmp
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 1.1T 2.7G 1.1T 1% /
**省略部分輸出**
tmpfs 32G 0 32G 0% /mnt/tmp
現在我們就掛載了一個 tmpfs 文件系統到 /mnt/tmp 目錄下,默認它是系統內存的一半,你可以自由的使用它,那么我們第一個問題就是,如何能夠自定義分配的內存大小, tmpfs 支持相關的選項來讓用戶自定義
Linux 上的 tmpfs 支援三個掛載選項:
-
size - 設定分配給此 tmpfs 文件系統的內存上限,默認是內存的一半。也可以在尾加上百分比 (%) 表示占用內存的百分比, 0 表示沒有上限。
-
nr_blocks - 和 size 一樣設定分配內存上限,但單位為 PAGE_CACHE_SIZE ( 默認為 4 KiB) 。
-
nr_inodes - 設定此 tmpfs 文件系統的 inode 上限,也就是限制可以存放文件的總數。
以上三個選項都可以在數值后面加上 k 、 m 、 g 來表示單位。
你可以在掛載的時候直接使用這些選項
# mount-t tmpfs -o size=1G tmpfs /mnt/mytmpfs
也可以在掛載后,重新掛載 (remount) tmpfs 即可改變內存上限:
# mount -o remount,size=512m/mnt/tmp
tmpfs 的優勢
下面我們來總結一下 tmpfs 的優勢,其實我們已經證明過了。
1.存儲空間動態變化
在 tmpfs 存放的文件是動態占用內存空間的,隨着文件占用空間的增大而增大文件系統,文件被刪除時,動態地減小文件系統空間並釋放內存。這一切都是 tmpf 自動處理的。
2.速度
天下武功,唯快不破。 tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 文件系統會完全駐留在內存中,讀寫幾乎可以是瞬間的。即使用了一些交換分區,性能仍然是非常快的。
3.沒有持久性
當你喜歡一個東西的時候,它的缺點在你眼里也會是優點,沒有持久性其實是 tmpfs 的缺點,所以一定不要把系統關機或者重啟后還需要保存的數據放入 tmpfs 。因為虛擬內存本質上就是易失的,但正是這種特性,實際上可能不是一件壞事。它讓 tmpfs 成為一個保存您不想在系統重啟后保留的數據的卓越的文件系統。
tmpfs 應用案例
以下是使用 tmpfs 文件系統的一些應用示例,一般 tmpfs 內存文件系統在做 web 緩存, cache,臨時文件存儲時會對 web 訪問有很好的加速作用,從而提高網站訪問的速度。
1. 反向代理緩存中,緩存目錄使用 tmpfs
例如下面是 Nginx 作為反向代理緩存的配置片段,可以將 /data/cdn_cache 目錄掛載為 tmpfs 。
proxy_temp_path /data/cdn_cache/proxy_temp_dir;
proxy_cache_path /data/cdn_cache/proxy_cache_dirlevels=1:2 keys_zone=cache_one:50m inactive=1d
2 . 將 php 的 session 文件放在 tmpfs 下
PHP 保存 seesion 的方法很簡單 , 只要修改 php.ini 就行了,首先掛載好 tmpfs ,然后修改配置文件如下:
session.save_path = “/data/php_session”
3. 將服務的 socket 文件放在 tmpfs 下
例如在 Web 應用中,我們有 PHP 的 FastCGIsocket 、 MySQL 的 mysql.sock 等等類似的socket 文件,都可以放在 tmpfs 掛載的目錄下提高性能。
