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