Linux特种文件系统--tmpfs文件系统

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

相关推荐
律宏阔10 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔10 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴10 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千10 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3710 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3710 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3710 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh10 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW10 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲10 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js