swap和shm的区别

在使用docker的过程中,发现其有很多内存相关的命令,对其中的swap(交换内存)和shm(共享内存)尤其费解。于是查阅了一些资料,弄明白了二者的基本区别。

swap

  • 是一个文件,是使用硬盘空间的一部分作为物理内存来扩展RAM空间的
  • 虽然是物理硬盘的一部分,但是仍然属于RAM,并且属于易失性存储,重启机器会使数据丢失;
  • 空间大小在一般情况下,swap的空间大小设置为物理内存的两倍大小;
  • docker中的swap对应于物理机器linux系统中的swap

shm

  • 在机器上挂载名可以是dev/shm,也可以是tmpfs
  • 是将虚拟内存的一部分挂载为临时文件系统,用于应用程序的加速,原理是允许其中的数据被不同的应用程序访问;
  • tmpfs中创建的文件很自然地也就创建在了虚拟内存中,因此其存储性质同swap,属于易失性存储;
  • 在docker中使用--shm-size命令挂载的分区是/dev/shm,可以在docker的命令行中使用df -h命令查看;同时也能看到本机的物理机器上的tmpfs分区;
  • 如果在运行docker的物理机器上运行df -h命令,内容是类似下面这样的:
    1
    2
    3
    tmpfs           7.8G  115M  7.7G   2% /dev/shm
    tmpfs 5.0M 4.0K 5.0M 1% /run/lock
    tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup

看不到docker的/dev/shm空间;并且物理机器上的/dev/shm也是挂载在tmpfs下面的;同时物理机器上tmpfs也挂载了其他临时分区;

  • 即在docker中可以看到docker的挂载情况和本地物理机器的挂载情况,而在物理机器上看不到docker中的挂载情况

总结

下面参考链接中给出了swapshm (tmpfs)的区别总结:

  • tmpfs使用内存空间而swap使用物理存储空间
  • 使用df命令时,tmpfs可以看做是挂载的文件系统,但是看不到swap(就像使用df命令看不到物理内存一样)
  • swap有经验意义上推荐的大小,而tmpfs没有;tmpfs的大小与所运行系统的目的有关
  • tmpfs可以使当前运行系统中的应用程序运行的更快,而swap是缓解系统物理内存压力的
  • swap空间满了表明系统正在高负荷运转,会造成性能下降甚至死机;而tmpfs满了以后并不一定有上面的情况
  • tmpfs是作为“增强型”功能出现的,而swap是必须有的功能

参考

https://gerardnico.com/os/linux/shared_memory
https://kerneltalks.com/linux/difference-between-tmpfs-and-swap/
https://www.garron.me/en/bits/create-add-swap-file-ubuntu.html
https://www.experts-exchange.com/questions/27463115/Diffrence-between-swap-and-dev-shm.html