zoukankan      html  css  js  c++  java
  • linux下的/dev/shm/ 以及与swap目录的区别【转】

    /dev/shm 概念

    首先可以看出来/dev/shm是一个设备文件, 可以把/dev/shm看作是系统内存的入口, 可以把它看做是一块物理存储设备,一个tmp filesystem, 你可以通过这个设备向内存中读写文件, 以加快某些I/O高的操作,比如对一个大型文件频繁的open, write, read,

    据说oracle就利用了/dev/shm(shitou没用过oracle), 可以通过mount命令列出当前的/dev/shm的挂载的文件系统,
    你可以直接对/dev/shm进行读写操作, 例如:

    #touch /dev/shm/file1

    既然是基于内存的文件系统,系统重启后/dev/shm下的文件就不存在了。Linux默认(CentOS)/dev/shm分区的大小是系统物理内存的50%, 虽说使用/dev/shm对文件操作的效率会高很多。但是目前各发行软件中却很少有使用它的(除了前面提到的Oracle), 可以通过ls /dev/shm查看下面是否有文件, 如果没有就说明当前系统并没有使用该设备。

    一、/dev/shm理论

    默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录。可以通过df 命令查看结果.
    /dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。默认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
    tmpfs有以下优势:
    1。动态文件系统的大小,/dev /shm/需要注意的一个是容量问题,在linux下,它默认最大为内存的一半大小,使用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的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性,除了名称。Oracle 11g的amm内存管理模式就是使用/dev/shm,所以有时候修改MEMORY_TARGET或者MEMORY_MAX_TARGET会出现ORA-00845的错误:http://blog.csdn.net/heyutao007/article/details/7051269

    巧用linux服务器的/dev/shm/,如果合理使用,可以避开磁盘IO不给力,提高网站访问速度。

    首先让我们认识一下,什么是tmpfs和/dev/shm/?

    tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。它有如下2个优势 : 1. 动态文件系统的大小。2. tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在内存 RAM 中,读写几乎可以是瞬间的。同时它也有一个缺点 tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

    tmpfs不具备持久性,重启后数据不保留,请务必注意!!!

    /dev/shm/是一个设备文件,它使用就是tmpfs文件系统(注意:在Centos和Redhat下,/dev/shm目录是一个链接,指向/run/shm目录,在Ubuntu系统下tmpfs文件系统对应的是/run/shm目录,可以使用df命令查看),因为 /dev/shm/这个目录不在硬盘上,而是在内存里,它就所谓的tmpfs。在Redhat/CentOS等linux发行版中默认大小为物理内存的一半。 比如我的的Red Hat Enterprise Linux Server 5.4 64(单核,512内存)分配内存为512M,所以/dev/shm为250M左右,查看/dev/shm如下:

    [root@AY1212111202285f63122 ~]# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/hda1 20G 7.6G 11G 42% /
    tmpfs 250M 0 250M 0% /dev/shm

    tmpfs是基于内存的文件系统,创建时不需要使用mkfs等初始化。如我想把/dev/shm tmpfs大小改为512M,修改/etc/fstab的

    tmpfs /dev/shm tmpfs defaults 0 0

    改为

    tmpfs /dev/shm tmpfs,defaults,size=512m 0 0

    所以修改前:

    LABEL=/ / ext3 defaults 1 1
    tmpfs /dev/shm tmpfs defaults 0 0
    devpts /dev/pts devpts gid=5,mode=620 0 0
    sysfs /sys sysfs defaults 0 0
    proc /proc proc defaults 0 0

    修改后为:

    LABEL=/ / ext3 defaults 1 1
    tmpfs /dev/shm tmpfs,defaults,size=512m 0 0
    devpts /dev/pts devpts gid=5,mode=620 0 0
    sysfs /sys sysfs defaults 0 0
    proc /proc proc defaults 0 0

    然后执行 mount -o remount /dev/shm

    [root@AY1212111202285f63122 ]# mount -o remount /dev/shm
    [root@AY1212111202285f63122 ]# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/hda1 20G 7.6G 11G 42% /
    tmpfs 512M 0 512M 0% /dev/shm

    怎么样,变成512M啦,使用很方便吧,重启也没有问题的,哈哈。当然在生产环境中你可以把内存加大些,反正现在内存很便宜啦,为了提高性能也需要将/dev/shm加大。

    tmpfs(/dev/shm)的使用及应用场景

    tmpfs是基于内存的,速度是不用说的,硬盘和它没法比。Oracle 中的Automatic Memory Management特性就使用了/dev/shm。另外如果在网站运维中好好利用tmpfs,将有意想不到的收获。我们先在/dev/shm建一个tmp目前,并与/tmp绑定。

    [root@AY1212111202285f63122 ~]# mkdir /dev/shm/tmp
    [root@AY1212111202285f63122 ~]# chmod 1777 /dev/shm/tmp //注意权限
    [root@AY1212111202285f63122 ~]# mount --bind /dev/shm/tmp /tmp
    [root@AY1212111202285f63122 ~]# ls -ld /tmp
    drwxrwxrwt 2 root root 40 May 29 21:46 /tmp

    以下/tmp使用tmpfs文件系统的一些应用示例,一般tmpfs内存文件系统在做web缓存,临时文件存储时会对web访问有很好的加速作用,从而提高网站访问的速度。

    1.将squid的缓存目录cache_dir放到/tmp下

    vi /etc/squid/squid.conf 修改成 cache_dir ufs /tmp 256 16 256

    这里的第一个256表示使用256M内存,重启一下squid服务,这样缓存目录都放在了tmpfs文件中了,速度不用说吧。

    2.将php的session文件放在/tmp下

    对于一个访问量大的以apache php的网站,可能tmp下的临时文件都会很多,比如seesion或者一些缓存文件,那么你可以把它保存到tmpfs文件。保存seesion的方法很简单了:只要修改php.ini就行了,通过phpinfo测试文件查看你的php session存储位置,如果不在/tmp下,修改php.ini文件,修改如下:

    session.save_path = “/tmp”

    3.将服务的socket文件放在/tmp下

    如nginx.socket和mysql.sock

    至于tmpfs的其他应用,我想大家可能通过这篇文章会有所启发。再次强调下:tmpfs 数据在重新启动之后不会保留,重启tmpfs 数据会丢失,所以有必要做一些脚本做诸如加载,绑定的操作!

    http://www.tmtpost.com/43815.html

    四、与swap的区别:

    /dev/shm
    首先可以看出来/dev/shm是一个设备文件, 可以把/dev/shm看作是系统内存的入口, 可以把它看做是一块物理存储设备,
    一个tmp filesystem, 你可以通过这个设备向内存中读写文件, 以加快某些I/O高的操作,比如对一个大型文件频繁的open, write, read,
    据说oracle就利用了/dev/shm(shitou没用过oracle), 可以通过mount命令列出当前的/dev/shm的挂载的文件系统,
    你可以直接对/dev/shm进行读写操作, 例如:

    #touch /dev/shm/file1

    既然是基于内存的文件系统,系统重启后/dev/shm下的文件就不存在了

    Linux默认(CentOS)/dev/shm分区的大小是系统物理内存的50%, 虽说使用/dev/shm对文件操作的效率会高很多,
    但是目前各发行软件中却很少有使用它的(除了前面提到的Oracle), 可以通过ls /dev/shm查看下面是否有文件, 如果没有就说明当前系统并没有使用该设备.

    swap
    而swap是Linux的虚拟内存, 即在硬盘上开辟空间当内存不够时充当内存使用, 因此可以理解为当/dev/shm空间不够时可以占用swap的空间

  • 相关阅读:
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (四) 自动化部署
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (三) 服务观测
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (二) 部署微服务程序
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (一) 部署 Nacos
    C++知识点
    libmkl 学习笔记
    基于tesseract-OCR进行中文识别
    poco编译与运行
    Linux下的I/O复用与epoll详解(转载)
    高并发网络编程之epoll详解(转载)
  • 原文地址:https://www.cnblogs.com/tinywan/p/10550356.html
Copyright © 2011-2022 走看看