Linux中的shm和tmpfs介绍

举报
小麦苗DB宝 发表于 2022/04/06 18:05:55 2022/04/06
【摘要】 简介linux中/dev目录下一般都是一些设备文件,例如磁盘、内存、摄像头等。/dev/shm这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都是保存在内存中,而不是磁盘上。其大小是非固定的,即不是预先分配好的内存来存储的。(shm =shared memory)默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录。可以通过df 命令...

简介

linux中/dev目录下一般都是一些设备文件,例如磁盘、内存、摄像头等。
/dev/shm这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都是保存在内存中,而不是磁盘上。其大小是非固定的,即不是预先分配好的内存来存储的。(shm =shared memory)

默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录。可以通过df 命令查看结果.

[root@docker35 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            78G        4.3G         46G        2.0G         27G         71G
Swap:           10G          0B         10G

[root@docker35 ~]# df -h | grep tmpfs
devtmpfs                          40G     0   40G   0% /dev
tmpfs                             40G     0   40G   0% /dev/shm
tmpfs                             40G  123M   40G   1% /run
tmpfs                             40G     0   40G   0% /sys/fs/cgroup


[root@lhrblog ~]# df -h | egrep -e "tmpfs|shm"
tmpfs            64M     0   64M   0% /dev
shm              64M  4.0K   64M   1% /dev/shm
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           1.9G  213M  1.7G  12% /run
tmpfs           379M     0  379M   0% /run/user/0

其他的几个tmpfs的挂载目录,其实质上于/dev/shm是一致的。

/dev/shm/是linux下一个非常有用的目录,**因为这个目录不在硬盘上,而是在内存里。**因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。

tmpfs(temporary filesystem)是Linux/Unix系统上的一种基于内存的虚拟文件系统。tmpfs可以使用您的内存或swap分区来存储文件(即它的存储空间在virtual memory 中, VM由real memory和swap组成)。tmpfs有些像虚拟磁盘(ramdisk),但不一样。像虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。

tmpfs有以下优势:
1、动态文件系统的大小,/dev/shm/需要注意的一个是容量问题,在linux下,它默认最大为内存的一半大小,在Docker容器中,/dev/shm/目录默认情况下是64MB,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有 100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的
2、tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
3、tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

修改/dev/shm大小

默认为最大一半内存大小在某些场合可能不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它。

mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm

在2G的机器上,将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件。
如果需要永久修改/dev/shm的值,需要修改/etc/fstab

tmpfs /dev/shm tmpfs defaults,size=1.5G 0 0 

mount -o remount /dev/shm

/dev/shm应用

首先在/dev/shm建个tmp文件夹,然后与实际/tmp绑定:

mkdir /dev/shm/tmp 
chmod 1777 /dev/shm/tmp 
mount –bind /dev/shm/tmp /tmp(–bind ) 

在使用mount –bind olderdir newerdir命令来挂载一个目录到另一个目录后,newerdir的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性,除了名称。

ORA-00845: MEMORY_TARGET not supported on this system

Oracle 11g的AMM(Automatic Memory Management)内存管理模式就是使用/dev/shm;若使用ASMM(Automatic Shared Memory Management),则不会使用/dev/shm,也就不会报错。

所以有时候修改MEMORY_MAX_TARGET会出现ORA-00845的错误。

简单来说就是 MEMORY_MAX_TARGET 的设置不能超过 /dev/shm 的大小

永久修改,需要修改/etc/fstab:

tmpfs /dev/shm tmpfs defaults,size=4G 0 0

临时修改,可以使用命令:

mount -o remount,size=4G /dev/shm

由于docker容器中没有/etc/fstab文件,所以我们只能每次重启容器后都修改一下/dev/shm大小。

mount -o remount,size=4G /dev/shm
echo "mount -o remount,size=4G /dev/shm"  >> /etc/rc.local
chmod +x /etc/rc.d/rc.local

其它虚拟内核文件系统

虚拟内核文件系统(VirtualKernel File Systems),是指那些是由内核产生但不存在于硬盘上(存在于内存中)的文件系统。例如

1、proc

proc文件系统为操作系统本身和应用程序之间的通信提供了一个安全的接口。通过它里面的一些文件,可以获取系统状态信息并修改某些系统的配置信息。当我们在内核中添加了新功能或设备驱动时,经常需要得到一些系统状态的信息,一般这样的功能需要经过一些像ioctl()这样的系统调用来完成。

2、devfs

我们知道,/dev目录下的每一个文件都对应的是一个设备,devfs也是挂载于/dev目录下。在2.6内核以前使用devfs来提供一种类似于文件的方法来管理位于/dev目录下的所有设备。但是devfs文件系统有一些缺点,有时一个设备映射的设备文件可能不同。例如,我的U盘可能对应sda,也可能对应sdb,没有足够的主/辅设备号,当设备过多的时候,显然这会成为一个问题。

3、sysfs

为了克服devfs的上述问题,2.6内核引入了一个新的文件系统sysfs,它挂载于/sys目录下。sysfs文件系统把连接在系统上的设备和总线组织成为一个分级的文件,用户空间的程序同样可以利用这些信息,以实现和内核的交互。sysfs文件系统是当前系统上实际设备树的一个直观反映,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了。

4、tmpfs

tmpfs(temporary filesystem)是Linux特有的文件系统,标准挂载点是/dev/shm.

参考

https://www.cnblogs.com/haoxiaoyu/p/f53e68d2d09ba861dbdc1fa521f1a54d.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。