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 ...
随机推荐
- linux安装redis、ununtu和centos等类似的发行版安装redis,完全离线安装reids,自定义版本redis
redis各个版本源码包下载:Index of /releases/ (redis.io) 下载与解压 从Index of /releases/ (redis.io)选择自己需要的版本并下载(此处以r ...
- AnimatedList 实现动态列表
AnimatedList实现动画 AnimatedList 和 ListView 的功能大体相似,不同的是, AnimatedList 可以在列表中插入或删除节点 时执行一个动画,在需要添加或删除列 ...
- SpringBoot基本知识
SpringBoot基本知识 一.简介 1.spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置, ...
- flex布局之美,以后就靠它来布局了
写在前面 在很久很久以前,网页布局基本上通过table 元素来实现.通过操作table 中单元格的align 和valign可以实现水平垂直居中等 再后来,由于CSS 不断完善,便演变出了:标准文档流 ...
- MySQL进阶篇:详解存储引擎MyISAM
MySQL进阶篇:第一章_一.三_存储引擎特点_MyISAM 1.1 存储引擎特点 1.1.2 MyISAM 1). 介绍 MyISAM是MySQL早期的默认存储引擎.. 2). 特点 不支持事务,不 ...
- 【有奖征文】WEB前端大作战,走在技术最前端!
摘要:投稿分享你在前端领域的积累,秀出你的技术"肌肉",为自己,也为技术发声. 近几年大家对于WEB前端的关注度很高, 比如整体势头发展良好,各种技术百花齐放,人才稀缺, 随着互联 ...
- 详解KubeEdge边缘网络项目EdgeMesh
摘要:本文带大家进一步了解 EdgeMesh 的进展以及未来的规划. 本文分享自华为云社区<走向成熟的KubeEdge边缘网络项目EdgeMesh详解>,作者:华为云云原生团队 王杰章 . ...
- 鲲鹏BoostKit虚拟化使能套件,让数据加密更安全
摘要:借助华为鲲鹏BoostKit虚拟化使能套件(简称鲲鹏BoostKit虚拟化),可加速迈向云计算之旅.本次KAE加速引擎让数据加密更安全直播将介绍鲲鹏BoostKit加速库全景,基于BoostKi ...
- 浏览器层面优化前端性能(2):Reader引擎线程与模块分析优化点
Reader 引擎线程与模块分析 首先是网页内容,加载完输入到HTML解释器,解释后构成DOM树,这期间如果遇到JavaScript代码就交给JavaScript引擎去处理,如果网页中包含CSS,就交 ...
- TreeMap - 红黑树
TreeMap是Map家族中的一员,也是用来存放key-value键值对的.平时在工作中使用的可能并不多,它最大的特点是遍历时是有顺序的,根据key的排序规则来 TreeMap是一个双列集合,是Map ...