暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

tempfs 的再学习

济南小老虎 2023-11-08
113

背景

最近学习研究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 ~]#


文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论