首页 > 其他分享 >tempfs 的再学习

tempfs 的再学习

时间:2023-11-19 13:23:44浏览次数:22  
标签:tmp dev 学习 tmpfiles tempfs tmpfs root user

tempfs 的再学习


背景

最近学习研究linux的内存buffer 和 cache相关的知识.
发现对linux的VFS的理解其实非常不到位. 

再验证内存的使用的page caches和 drop caches 发现自己少考虑了一下
然后又抓紧看了一下  tempfs相关知识进行补齐. 

tmpfs 简介

tmpfs (temporary file system) 是一种在计算机内存中创建临时文件系统的技术,
它允许将一部分内存用作文件系统,以存储临时数据。与传统的文件系统不同,
tmpfs 不保存在硬盘上,而是存在于内存中,这使得访问速度更快。

tmpfs 主要用于存储临时数据,例如临时文件、进程间通信的缓冲区和日志文件等。
它通常被用于 Linux 操作系统中的 /tmp 目录(临时文件目录)。
当系统重新启动时,tmpfs 中存储的数据会被清空,因此它不适合用作长期存储数据的方式。

tmpfs 具有一些特点,包括:

1 速访问速度:由于数据存储在内存中,所以访问速度非常快。
2 动态分配内存:tmpfs 使用需要时才会动态分配内存,并根据需要自动调整大小。
3 限制存储空间:tmpfs 的大小可以被限制在可用的内存范围内,以防止过分占用内存。

可以通过挂载 tmpfs 文件系统来使用它,在 Linux 中可以使用类似以下的命令进行挂载:
mount -t tmpfs -o size=512M tmpfs /path/to/mount/point
这将创建一个大小为 512MB 的 tmpfs 文件系统,并将其挂载到指定的路径上。

部分tmpfs目录情况

1 /dev/shm
在 Linux 系统中,/dev/shm 是在内存中创建的临时文件系统,也称为共享内存段。
这个目录中的文件是被映射到系统内存中的,它可以提供更快的访问速度,同时也可以在进程之间分享数据。
在 CentOS 7 中,/dev/shm 目录默认情况下使用 tmpfs 文件系统进行挂载,大小受限于系统可用内存。
这个目录中的文件只存在于内存中,系统重启后将会被清空。
因此,/dev/shm 目录通常用于存储短期的、临时的文件,如数据库的临时文件、浏览器缓存等。
与 /tmp 目录不同,/dev/shm 目录更适合用于需要很快访问速度的应用程序,因为在读写上都会更加迅速。
另外,/dev/shm 目录也可以被用作进程间通信(IPC)的一部分,可以在程序之间共享资源,从而避免复制或传输庞大的数据块。
需要注意的是,在使用 /dev/shm 目录时,应谨慎控制文件的大小,以避免过度占用系统内存导致系统进入交换(swap)状态并变得缓慢。
此外,应尽量避免在 /dev/shm 目录中存储敏感数据,因为它们可能会被恢复到磁盘缓存中,并在系统关闭时导致数据泄漏。


2 /run/user/ 

目录是用于存储用户运行时文件的临时目录。
每个登录用户都会在该目录下创建一个以其用户ID命名的子目录,用于存储用户特定的运行时文件。
这个目录通常用于存储用户会话期间的临时文件,如套接字文件、进程通信文件等。它
还可以用于存储用户的运行时状态信息,如 X11 显示服务器的套接字文件、D-Bus 会话总线文件等。

3 /sys/fs/cgroup 

是一个特殊的文件系统,用于管理和控制进程组的资源分配。
它在Linux系统中使用,允许管理员限制进程组的资源使用情况,如CPU、内存、磁盘等。
以下是一些关于 /sys/fs/cgroup 的常见操作和用法:
创建一个新的控制组:
$ sudo mkdir /sys/fs/cgroup/<subsystem>/<group_name>
其中,<subsystem> 是资源子系统的名称(如cpu、memory、blkio等),<group_name> 是控制组的名称。
将进程添加到控制组:
$ sudo echo <pid> > /sys/fs/cgroup/<subsystem>/<group_name>/tasks
其中,<pid> 是要添加到控制组的进程ID。
设置资源限制:
$ sudo echo <limit> > /sys/fs/cgroup/<subsystem>/<group_name>/<resource_limit>
其中,<limit> 是资源的限制值,<resource_limit> 是资源的名称(如cpu.shares、memory.limit_in_bytes等)。
查看控制组的资源使用情况:
$ cat /sys/fs/cgroup/<subsystem>/<group_name>/<resource_usage>
其中,<resource_usage> 是资源的名称(如cpuacct.usage、memory.usage_in_bytes等)。
删除控制组:
$ sudo rmdir /sys/fs/cgroup/<subsystem>/<group_name>

/tmp 的挂载与清理机制

本次主要是学习 CentOS7 以及更高版本的系统. CentOS6的暂时不考虑

systemctl |grep tmp
  tmp.mount                                                                                        loaded active     mounted      Temporary Directory (/tmp)
  systemd-tmpfiles-setup-dev.service                                                               loaded active     exited       Create Static Device Nodes in /dev
  systemd-tmpfiles-setup.service                                                                   loaded active     exited       Create Volatile Files and Directories
  systemd-update-utmp.service                                                                      loaded active     exited       Update UTMP about System Boot/Shutdown
  systemd-tmpfiles-clean.timer                                                                     loaded active     waiting      Daily Cleanup of Temporary Directories

具体信息查看-tmp.mount

systemctl status tmp.mount
配置文件为:
/usr/lib/systemd/system/tmp.mount
核心内容为:
[Unit]
Description=Temporary Directory (/tmp)
Documentation=man:file-hierarchy(7)
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target

[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,nosuid,nodev

[Install]
WantedBy=local-fs.target

发现核心配置文件 mount中处理了
就不会再 /tempfs 里面再次进行初始化. 

具体信息查看-systemd-tmpfiles-setup-dev

[Unit]
Description=Create Static Device Nodes in /dev
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-sysusers.service
Before=sysinit.target local-fs-pre.target systemd-udevd.service shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemd-tmpfiles --prefix=/dev --create --boot
SuccessExitStatus=DATAERR CANTCREAT

临时文件清理进程

systemctl status systemd-tmpfiles-clean.timer
# 查看文件为:
/usr/lib/systemd/system/systemd-tmpfiles-clean.timer

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

注意文件清理的处理方式

默认配置文件其实是在 
/usr/lib/tmpfiles.d/*.conf

例如 默认的 
/usr/lib/tmpfiles.d/tmp.conf

q /tmp 1777 root root 10d
q /var/tmp 1777 root root 30d

表示 目录下10天和30天没有变动的就自动删除掉

另外可以使用 x 或者是 X的方式排除
但是需要注意, 如果文件数太多了. 可能会导致内存不可用. 
x /tmp/tomcat.*

详细的解释主要在下面: 

TMPFILES.D(5)                                                                                                             tmpfiles.d                                                                                                             TMPFILES.D(5)

NAME
       tmpfiles.d - Configuration for creation, deletion and cleaning of volatile and temporary files

SYNOPSIS
       /etc/tmpfiles.d/*.conf
       /run/tmpfiles.d/*.conf
       /usr/lib/tmpfiles.d/*.conf

       ~/.config/user-tmpfiles.d/*.conf
       $XDG_RUNTIME_DIR/user-tmpfiles.d/*.conf
       ~/.local/share/user-tmpfiles.d/*.conf
       ...
       /usr/share/user-tmpfiles.d/*.conf

       #Type Path                                     Mode User Group Age         Argument
       f     /file/to/create                          mode user group -           content
       F     /file/to/create-or-truncate              mode user group -           content
       w     /file/to/write-to                        -    -    -     -           content
       d     /directory/to/create-and-cleanup         mode user group cleanup-age -
       D     /directory/to/create-and-remove          mode user group cleanup-age -
       e     /directory/to/cleanup                    mode user group cleanup-age -
       v     /subvolume/to/create                     mode user group -           -
       v     /subvolume-or-directory/to/create        mode user group -           -
       Q     /subvolume/to/create                     mode user group -           -
       p     /fifo/to/create                          mode user group -           -
       L     /symlink/to/create                       -    -    -     -           symlink/target/path
       c     /dev/char-device-to-create               mode user group -           -
       b     /dev/block-device-to-create              mode user group -           -
       # p+, L+, c+, b+ create target unconditionally
       C     /target/to/create                        -    -    -     -           /source/to/copy
       x     /path-or-glob/to/ignore                  -    -    -     -           -
       X     /path-or-glob/to/ignore/recursively      -    -    -     -           -
       r     /empty/dir/to/remove                     -    -    -     -           -
       R     /dir/to/remove/recursively               -    -    -     -           -
       z     /path-or-glob/to/adjust/mode             mode user group -           MAC context
       Z     /path-or-glob/to/adjust/mode/recursively mode user group -           MAC context
       t     /path-or-glob/to/set/xattrs              -    -    -     -           xattrs
       T     /path-or-glob/to/set/xattrs/recursively  -    -    -     -           xattrs
       h     /path-or-glob/to/set/attrs               -    -    -     -           file attrs
       H     /path-or-glob/to/set/attrs/recursively   -    -    -     -           file attrs
       a     /path-or-glob/to/set/acls                -    -    -     -           POSIX ACLs
       A     /path-or-glob/to/set/acls/recursively    -    -    -     -           POSIX ACLs
       # a+, A+ append ACLs


极限使用情况

tmpfs 的文件其实也是占用 page caches的内存空间. 
不管是放进 /tmp 的文件还是放进 /dev/shm 的文件都会挤压 page cache的总量. 
两个目录默认是一般的系统内存, 如果都放里面放文件, 会将系统内存吃满. 然后导致使用swap.
系统基本不可用.
所以一定要小心谨慎的使用这两个目录. 

[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13596         217       32953       33191          27
Swap:          8079        1376        6703


[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13540         288       32967       33176          83
Swap:          8079        3508        4571

此时进行swapoff的处理时: 
[root@oracle12c ~]# swapoff -a
swapoff: /dev/dm-1:swapoff 失败: 无法分配内存
[root@oracle12c ~]#

完成的测试记录

[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13625         236       32692       33143         244
Swap:          8079        5087        2992
[root@oracle12c ~]# swapoff -a
swapoff: /dev/dm-1:swapoff 失败: 无法分配内存
[root@oracle12c ~]# rm -rf /dev/shm/all.dump
[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13623       14279       18604       19102       14335
Swap:          8079        5164        2915
[root@oracle12c ~]# rm -rf /tmp/all.dump
[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13573       32984           6         448       33019
Swap:          8079         257        7822
[root@oracle12c ~]#  swapoff -a
[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13778       32766          21         460       32803
Swap:             0           0           0
[root@oracle12c ~]#

标签:tmp,dev,学习,tmpfiles,tempfs,tmpfs,root,user
From: https://www.cnblogs.com/jinanxiaolaohu/p/17803193.html

相关文章

  • 2023-2024-1 20232312 《网络空间安全导论》第二周学习
    2023-2024-120232312《网络空间安全导论》第二周学习教材学习内容总结密码由来已久单钥密码体制和双钥密码体制密码分析的方法密码的(数学)理论基础密码学的新进展(各种加密)教材学习中的问题和解决过程问题1:密码加密解密原理的理解-解决方案:研读书本例子,自......
  • 通过PowerShellPlus示例脚本学习PowerShell-连接SQLServer数据库
    ##=====================================================================##Title:Connect-MSSQL-IPSQLAuth##Description:Connectto$ServerNameusingSQLServerauthentication.##Thisconnectionisnotencrypted.##......
  • 2023-2024-1 20231419 《计算机基础与程序设计》第八周学习总结
    2023-2024-120231419《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标自学《计算机科学概......
  • 拼多多订单生成器手机版,支持淘宝京东截图生成,E4A源码,仅供娱乐学习
    闲着用E4A对接了JAVA类库制作了一个订单生成器,当然我叫了水印,这个软件或者里面的截图做不了啥坏事,仅仅用来学习娱乐装逼用的,下面是框架和代码。框架图1:  框架图2:  JAVa代码库:======================================================//商品类classProduct{St......
  • 2023-2024-1 20231414 《计算机基础与程序设计》第八周学习总结
    学期(2023-2024-1)学号(20231414)《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第八周作业)这个作业的目标<写上具体方面......
  • 学习笔记10
    第12章块设备I/O和缓冲区管理1.块设备I/O缓冲区1.缓冲区的作用:缓冲区在内存中缓存数据,减少了直接磁盘操作的次数,从而提高了系统的吞吐量。2.缓冲区的类型:在Unix/Linux中,有多种类型的缓冲区,例如:全缓冲:在这种缓冲区中,所有的I/O操作都在内存中完成,直到写入或读取一个......
  • Shell脚本的学习
    Shell脚本入门此笔记为学习Shell脚本所记录,学习视频为尚硅谷Shell脚本入门到实战目录Shell脚本入门脚本格式第一个Shell脚本helloworldShell中的变量系统变量常用系统变量案例实操自定义变量基本语法变量定义规则案例实操特殊变量$n基本语法案例实操特殊变量$#基本语法案例实操......
  • 《网络空间安全导论》第2周学习总结
    学期:2023-2024-1学号:20232402《网络空间安全导论》第2周学习总结教材学习内容总结教材学习中的问题和解决过程问题1:不理解欧几里得算法中的求乘法逆元问题1解决方案:1)向chatGPT提问≡是什么回答:≡是模运算的符号,在数学中常用于描述同余关系。同余符号“≡”表示两......
  • 第十一周Linux教材第十二章学习笔记——块设备I/O和缓冲区管理
    块设备I/O和缓冲区管理本章讨论了块设备1/O和缓冲区管理;解释了块设备1/O的原理和T/O缓冲的优点;论述了Unix的缓冲区管理算法,并指出了其不足之处;还利用信号量设计了新的缓冲区管理算法,以提高1/O缓冲区的缓存效率和性能;表明了简单的PV算法易于实现,缓存效果好,不存在死锁和饥饿问题;还......
  • 2023-2024-1 20232311 《网络空间安全导论》第二周学习
    教材学习内容总结思维导图教材学习中的问题和解决过程问题1:单钥密码体制加密的应用有哪些问题1解决方案:先看了看上届学长的笔记,接着去询问chatai问题2:学习抗量子密码是不了解其中提到的Hash函数问题2解决方案:在B站上看了看介绍它的视频基于AI的学习思考这一章有很......