tmpfs类似于RamDisk(只能使用物理内存),使用虚拟内存(简称VM)子系统的页面存储文件。tmpfs完全依赖VM,遵循子系统的整体调度策略。说白了tmpfs跟普通进程差不多,使用的都是某种形式的虚拟内存,至于数据存储在物理内存中还是在交换分区中,全权交由VM子系统。
tmpfs 文件系统
-
定义 :
tmpfs
是一个基于内存的文件系统,它在 RAM 中存储数据,因此访问速度非常快。 -
用途 :
tmpfs
通常用于存储临时文件,这些文件不需要永久保存,而且频繁读写。使用tmpfs
可以减少对物理磁盘的磨损,并提高性能。 -
示例路径 :常见的
tmpfs
挂载点包括/dev/shm
、/run
、/tmp
等。 -
持久性 :系统重启后,
tmpfs
中的数据会被清空。
devtmpfs 文件系统
-
定义 :
devtmpfs
也是一种基于内存的文件系统,主要用于动态创建设备节点。 -
用途 :
devtmpfs
在系统启动时自动创建,用来存放动态设备文件。它减少了手动创建设备节点的需要,并且可以根据当前硬件自动创建所需的设备文件。 -
示例路径 :
devtmpfs
通常挂载在/dev
目录下。 -
持久性 :与
tmpfs
类似,系统重启后,devtmpfs
中的设备文件也会重新创建
查看tmpfs文件系统挂载情况
使用mount或df命令来查看tmpfs挂载情况,mount可以看到挂在点的一些属性信息;df可以查看挂载点大小以及使用率等。
bash
mount | grep tmpfs
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=930460k,nr_inodes=232615,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=188216k,mode=700)
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 909M 0 909M 0% /dev
tmpfs tmpfs 920M 0 920M 0% /dev/shm
tmpfs tmpfs 920M 17M 903M 2% /run
tmpfs tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda3 xfs 14G 3.2G 11G 24% /
/dev/sda1 xfs 1014M 181M 834M 18% /boot
tmpfs tmpfs 184M 0 184M 0% /run/user/0
使用tmpfs文件系统
创建tmpfs并挂在到/test-tmpfs,对使用内存大小未做限制,但是分配了一个920M大小,当向其拷贝大于920M的数据,并未动态扩展超过920M(虽未指定size,会有一个缺省值:刚好是我内存的50%),仍然会报错:No space left on device。
bash
mount tmpfs /test-tmpfs -t tmpfs
~]# dd if=/dev/zero of=/test-tmpfs/bigfile bs=1M count=1000
dd: error writing '/test-tmpfs/bigfile': No space left on device
920+0 records in
919+0 records out
963661824 bytes (964 MB) copied, 0.788749 s, 1.2 GB/s
创建tmpfs并挂在到/test-tmpfs2,最大只能使用64m内存空间,很显然到存储文件大小超过64m时,报错:No space left on device
bash
mount tmpfs /test-tmpfs2/ -t tmpfs -o size=64m
~]# dd if=/dev/zero of=/test-tmpfs2/bigfile bs=1M count=65
dd: error writing '/test-tmpfs2/bigfile': No space left on device
65+0 records in
64+0 records out
67108864 bytes (67 MB) copied, 0.10594 s, 633 MB/s
第一个试验,默认大小920M,且当超过920M时并没有动态扩展,那么是不是最大只能设置size=920M呢?显然不是!经过查资料,不设置size,则默认使用物理内存的50%(我擦,从这里我可以逆向推机器的物理内存大小了~~)
bash
mount tmpfs /test-tmpfs3/ -t tmpfs -o size=2048m
~]# df -hT|grep test-tmpfs
tmpfs tmpfs 2.0G 0 2.0G 0% /test-tmpfs3
既然tmpfs存储在内存中,那么tmpfs占用的内存是哪一部分呢?答案是shared memory。
~]# free -m
total used free shared buff/cache available
Mem: 1838 162 72 920 1602 590
Swap: 1638 61 1577
~]# rm -rf /test-tmpfs/bigfile
~]# free -m
total used free shared buff/cache available
Mem: 1838 162 992 1 683 1509
Swap: 1638 61 1577
通过tmpfs赋能应用加速
给squid代理加速,据说可以将系统负载从12降低到0.3。
1、创建并挂在tmpfs
mkdir /squid_tmp
chmod 1777 /squid_tmp
~]# cat /etc/fstab |grep squid
tmpfs /squid_tmp tmpfs size=256m
2、修改squid代理配置
~]# cat /etc/squid/squid.conf|grep -i cache
Only allow cachemgr access from localhost
Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256
cache_dir ufs /squid_tmp 256 16 256
- ufs,缓存存储机制,具体参考Squid的使用手册
- /squid_tmp,就是一个tmpfs
- 第一个256,指定缓存目录的大小,这是Squid可以使用的上限,可以根据实际情况酌情设定
- 16和第二个256,针对ufs机制,Squid在缓存目录下创建二级目录树。分别指定了第一级和第二级目录的数量。默认就是16和256,可以根据具体情况酌情设定。如下图:一级目录刚好16个。
3、重启Squid服务
systemctl restart squid