swap(交换内存)和shm(共享内存)的区别

关于swap和shm的区别

在使用docker的过程中,发现docker中有很多关于内存的命令,例如:

  1. -m="10g",docker的运行内存,按照官方文档描述,应该是对应于实际机器的物理内存,因此在设置的时候,肯定是要比本机物理内存小的;单位可以是b/k/m/g
  2. -memory-swap="11g",内存+交换内存,即物理内存+交换内存的总大小,要大于等于上面设置的-m的大小,设置格式同上
  3. --shm-size="10g",共享内存。

从表面看,共享内存和交换空间有些相似,因此关于共享内存shmswap之间的区别颇让人让人费解的问题,查了一些资料(见最后的参考)后,对于这两个内存的理解是:

  • 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命令,内容是类似下面这样的:
    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

你可能感兴趣的:(【Docker】,【Linux/Ubuntu】)