tempfs 的再学习
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 ~]#
tempfs 的再学习的更多相关文章
- js再学习笔记
#js再学习笔记 ##基本 1.js严格区分大小写 2.js末尾的分号可加,也可不加 3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...
- express再学习
对比spring,django,再学习express就有很多共通的地方啦... 看的书是一本小书,<express in action>,排版比较好. 昨天开始看,看了快四分之一啦... ...
- Android再学习-20141023-Intent-Thread
20141023-Android再学习 Intent对象的基本概念 Intent是Android应用程序组件之一 Intent对象在Android系统中表示一种意图 Intent当中最重要的内容是ac ...
- Android再学习-20141022-Activity的生命周期
20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...
- Android再学习-20141018-布局-进度条
20141018-Android再学习 对齐至控件的基准线 为了保证印刷字母的整齐而划定的线(四线三格的第三条线). android:layout_alignBaseline 与父控件的四个边缘对齐( ...
- 再学习sqlhelper
在机房收费重构系统的时候,第一次学习sqlhelper.当时感觉比较简单,没有写博客总结,现在又经过了图书馆的学习,感觉还是有必要写一写的. SqlHelper是一个基于.NETFramework的数 ...
- c/c++再学习:常用字符串转数字操作
c/c++再学习:常用字符串转数字操作 能实现字符串转数字有三种方法,atof函数,sscanf函数和stringstream类. 具体demo代码和运行结果 #include "stdio ...
- c/c++再学习:C与Python相互调用
c/c++再学习:Python调用C函数 Python 调用C函数比较简单 这里两个例子,一个是直接调用参数,另一个是调用结构体 C代码 typedef struct { int i1; int i2 ...
- MQTT再学习 -- MQTT 客户端源码分析
MQTT 源码分析,搜索了一下发现网络上讲的很少,多是逍遥子的那几篇. 参看:逍遥子_mosquitto源码分析系列 参看:MQTT libmosquitto源码分析 参看:Mosquitto学习笔记 ...
- Applet再学习
ZLYD团队Apllet学习笔记 Applet再学习 Applet是什么? Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 .A ...
随机推荐
- Python——第五章:模块(Module)、自定义模块、第3方开源模块、包(Package)
什么是模块(Module)? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多代码按功能分组,分别放到不同的文件里,这 ...
- Windows 设置 VMware workstation 虚拟机开机启动
参考 https://www.cnblogs.com/qmfsun/p/6284236.html http://www.cnblogs.com/eliteboy/p/7838091.html 司徒晓宇 ...
- MySQL|主从延迟问题排查(二)
二.案例分享二 2.1 问题描述 主库执行insert select 批量写入操作,主从复制通过row模式下转换为批量的insert大事务操作,导致只读实例CPU资源以及延迟上涨 16:55-17: ...
- Nignx快速入门
Nginx快速入门 一.简介 产生的背景:当一台服务器同一时刻被大量客户端请求访问时,访问量超出服务器请求范围,服务器处理不过来,发生宕机或者丢失连接情况下,产生了Nignx反向代理技术. Nginx ...
- CoralCache:一个提高微服务可用性的中间件
摘要:当数据库出问题时能降级从本地缓存的数据中查询数据,CoralCache就是这样一个提高微服务可用性的中间件. 背景 有些场景下,微服务依赖数据库中一些配置项或者数量很少的数据,但当数据库本身有问 ...
- 华为云应用服务网格最佳实践之从Spring Cloud 到 Istio
摘要:在全球首届社区峰会IstioCon 2021中,华为云应用服务网格首席架构师张超盟发表了<Best practice:from Spring Cloud to Istio>主题演讲, ...
- 揭秘GES超大规模图计算引擎HyG:图切分
摘要:GES大规模图计算引擎HyG通过实现不同的点边分区算法,可以灵活地供用户选择多种多样的切分策略,进而达到更好的运算性能. 本文分享自华为云社区<GES超大规模图计算引擎HyG揭秘之图切分& ...
- grpc双向流究竟是什么情况?2段代码告诉你
摘要:为什么需要grpc双向流? 本文分享自华为云社区<grpc双向流究竟是什么情况?2段代码告诉你>,作者:breakDawn. 为什么需要grpc双向流? 有时候请求调用和返回过程,并 ...
- 顶级加密混淆混淆工具测评:ipagurd
顶级加密混淆混淆工具测评:ipagurd 摘要 JavaScript代码安全需求日益增长,因此JavaScript混淆工具的使用变得广泛.本文将对专业.商业JavaScript混淆工具ipagur ...
- 无法安装此app,因为无法验证其完整性 ,解决方案
最近有很多兄弟萌跟我反应"无法安装此app,因为无法验证其完整性 ",看来这个问题无法避免了,今天统一回复下,出现提示主要有以下几种可能 1.安装包不完整 首先申请我所有分享的破解 ...