Linux系统中的tmpfs、/dev/shm、tmp以及共享内存机制

共享内存允许两个或更多进程访问同一块内存。

tmpfs

tmpfs一种基于内存的临时文件系统,tmpfs可以使用RAM,但它也可以使用swap分区来存储。传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;tmpfs是一个文件系统,并不是块设备,安装即可以使用。tmpfs是最好的基于RAM的文件系统。

  • 特征:
    • 动态文件系统大小
    • 存取速度快

/dev/shm

是利用内存虚拟出来的磁盘空间。通常是内存空间大小的一半,该目录下创建的文件存取速度优于普通硬盘挂载的目录下的文件,该目录下的文件在机器重启时会丢失。

/tmp目录

存放临时文件的目录。由于通常/dev/shm挂载在/tmp目录下,该目录会被不同用户读写,因此该目录的权限建议设置成777
之前就在生产环境中遇到过/tmp目录权限被旁路流程误修改为755,导致普通用户启动的C++的应用无法写入共享内存,导致线上服务异常的惨痛教训。希望大家吸取教训。
这种目录权限导致的问题,恢复较为容易,但是定位问题原因较为复杂,由于之前的代码中没有调试逻辑,出现问题时,开发临时新上了一版代码增加了详细的错误输出,最后才定位到共享内存写入失败导致,此过程花费相对较长的时间。

  • 文件系统挂载关系
    1
    2
    3
    # cat /etc/fstab |egrep "tmp|shm"
    tmpfs /dev/shm tmpfs defaults 0 0
    /dev/shm /tmp none rw,bind 0 0

Linux的两种共享内存机制:

  • POSIX共享内存(结合内存映射mmap使用)
    • mmap映射的内存是非持久化的,随着进程关闭,映射会随即失效。
    • mmap内存映射机制标准的系统调用,分为:
      • 匿名映射
      • 文件映射,又分为:
        • MAP_PRIVATE
        • MAP_SHARED
  • System V共享内存(经典方案)
    • sysv shm是持久化的,除非被进程明确的删除,否则在系统关机前始终存在于内存中。

虽然System V与POSIX共享内存都是通过tmpfs实现,但由于内核在mount tmpfs时,指定了MS_NOUSER,所以该tmpfs没有大小限制。因此/proc/sys/kernel/shmmax只会限制System V共享内存,/dev/shm只限制Posix共享内存,默认是物理内存的一半。

  • System V共享内存的最大值

    1
    2
    # cat /proc/sys/kernel/shmmax
    68719476736
  • /dev/shm空间大小设定

    1
    mount -t tmpfs -o size=2G tmpfs -o remount /dev/shm
冷月无声 wechat
关注也是一种力量
-------------End of article. I appreciate whoever read and leave commends on articles.-------------

本文标题:Linux系统中的tmpfs、/dev/shm、tmp以及共享内存机制

文章作者:冷月无声

发布时间:2017年08月12日 - 22:08

最后更新:2017年08月18日 - 19:08

原始链接:https://www.lengyuewusheng.com/2017/08/12/00016_Linux共享内存机制/

许可协议:本博客所有文章除特别声明外,均采用 BY-NC-SA 3.0许可协议。转载请注明出处!

感谢鼓励!