Linux中的shm和tmpfs介绍

网友投稿 3301 2022-05-28

简介

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内存,是绝不会被系统回收重新划分的。

Linux中的shm和tmpfs介绍

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

Linux

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:BigTable的开源实现:HBase
下一篇:一步一步教你使用AppCube应用魔方创建业务大屏应用
相关文章