1、簡(jiǎn)介
tmpfs 臨時(shí)文件系統(tǒng),使用的是 VM(virtual memory),也就是內(nèi)存或 swap。
有時(shí)候需要快速讀寫文件,可以考慮使用 tmpfs ,比如期貨之類的金融產(chǎn)品,一般把一天的開盤時(shí)間分成上午、下午、晚上 3 個(gè)部分,在開盤時(shí)間需要快速響應(yīng)可以巧用tmpfs,而趁著收盤之后的休息時(shí)間,可以把 tmpfs 的文件寫入磁盤,tmpfs 不具備持久性,tmpfs 中的文件被刪除時(shí)會(huì)釋放 VM 資源。
可以用df -h、mount和
grep Shmem /proc/meminfo查看 tmpfs 的相關(guān)信息。
2、測(cè)試速度
先準(zhǔn)備一個(gè)文件:
~$ mkdir test
~$ dd if=/dev/urandom of=~/200.bin bs=1M count=200
~$ time cat ~/200.bin > ~/test/200.bin
real 0m4.147s
user 0m0.000s
sys 0m4.064s
~$ rm 200.bin
mount 之后,可以看到 df -h 中多了一行:
~$ sudo mount tmpfs /home/code/test/ -t tmpfs -o size=300M
~$ df -h
Filesystem Size Used Avail Use% Mounted on
...
...
tmpfs 300M 0 300M 0% /home/username/test
測(cè)試往 tmpfs目錄寫入一個(gè)文件的耗時(shí),比上面快:
~$ dd if=/dev/urandom of=~/200.new.bin bs=1M count=200
~$ time cat ~/200.new.bin > ~/test/200.new.bin
real 0m1.649s
user 0m0.000s
sys 0m1.628s
~$ df -h
Filesystem Size Used Avail Use% Mounted on
...
...
tmpfs 300M 200M 100M 67% /home/username/test
~$ sudo umount /home/username/test
~$ rm 200.new.bin
3、及時(shí)清理
但是如果沒有及時(shí)寫入磁盤,不停地往 tmpfs 中寫入,而 tmpfs 配置的 Size 又太大,這就導(dǎo)最終可用內(nèi)存越來越少。
/dev/shm 默認(rèn)大小為物理內(nèi)存的一半,往/dev/shm寫入數(shù)據(jù),查看內(nèi)存信息:
~$ dd if=/dev/urandom of=/dev/shm/200.bin bs=1M count=200
在 top 命令的打印中free和avail Mem減少了 200 MB。buff/cache部分增加了200 MB。因?yàn)椴粚儆谀硞€(gè)具體的進(jìn)程,所以在進(jìn)程部分中也看不出是哪個(gè)進(jìn)程占用了內(nèi)存,不容易被發(fā)現(xiàn)。
在 cat /proc/meminfo 中,MemFree和MemAvailable 減少了 200 MB,Shmem、Cached、Committed_AS 、 Inactive、Inactive(anon)增加了200 MB。
在 df -h 的 /dev/shm 這行的 Used 增加了 200 MB。
$ rm /dev/shm/200.bin
刪除該文件后,可以看到各項(xiàng)數(shù)據(jù)恢復(fù)原狀了。
所以當(dāng)在 top 中可用內(nèi)存不多,但看不出哪個(gè)進(jìn)程占用了大量?jī)?nèi)存時(shí),可以考慮看一下 /proc/meminfo 中的 Shmem 項(xiàng),和 df -h 中 tmpfs 的 Used 部分,確認(rèn)是否因?yàn)闆]有及時(shí)清理 tmpfs 導(dǎo)致。