2018年3月22日星期四

/dev/shm的用途

    工作中遇到在公司内部容器环境下yum报错的情况,报错如下:
Total size: 229 M
Installed size: 1.2 G
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test

Transaction check error:
  installing package xxxxx.x86_64 needs 274MB on the /dev/shm filesystem
Error Summary
-------------
Disk Requirements:
  At least 274MB more space needed on the /dev/shm filesystem.
报错信息还比较清晰,安装这个软件包需要1.2G,但是/dev/shm空间不够。

看下/dev/shm占用了多少










问题来了
1) /dev/shm作用是什么,能否调整
2) tmpfs是什么文件系统
3) 这里什么决定了使用/dev/shm,问题如何解决

下面逐个解决这些问题。



1) /dev/shm作用是什么,能否调整
/dev/shm就是共享内存的一种实现,2.6内核开始引入。可以cd到这个目录下进行正常的读写,这个目录mount成tmpfs文件系统,完全在内存中,无磁盘IO,以提升性能。
我们可以利用/dev/shm存放一些临时文件,利用内存的快来提升性能。

glibc 2.2以及以上版本针对POSIX共享内存相关操作shm_open/shm_unlink,会依赖tmpfs文件系统的/dev/shm存在。

要永久的设置(即重启有效),可以在/etc/fstab里面添加
none      /dev/shm        tmpfs   defaults,size=8G        0 0
可以通过remount的方式进行调整:
mount -o remount,size=1500000k /dev/shm
注意:
虽然/dev/shm可以指定很大,但是实际使用不能超过内存总量大小,超出时会报错Cannot allocate memory




/tmp同样作为临时文件存放地,虽然速度低于内存访问,但是空间可以较大。
使用/dev/shm需要确保内容空间够用,否则可能反而导致内存问题。

这里同时对比一下/dev/shm下与/tmp写入速度感受一下








2)tmpfs是什么文件系统
tmpfs是一个内存之上构建的文件系统(低内存下也可能会落在swap分区)。使用tmpfs的目的是避免磁盘IO,但是确实是没有持久化,宕机或者umount后就丢失了。
示例:
mount -t tmpfs -o size=5G,nr_inodes=5k,mode=700 tmpfs /disk2/tmpfs

-o opt1,opt2设置选择,可选如下

  • remount 重新加载,数据不丢。(如果umount,数据直接丢失,慎重!)
  • size=8G或者50% 指定/dev/shm文件系统字节数。默认为内存容量的一半!百分比即表示是占总可用内存的比例。
    • 这也解释了为什么本例子中总内存2G,/dev/shm可用1.0G
  • nr_blocks作用和size类似,指定文件系统大小,但是指定的是多少个PAGE_CACHE_SIZE
  • nr_inodes=5k 最大inode数量,默认上限为物理内存页数量的一半。
  • mode=700 设置跟目录的初始权限

3)为什么yum安装会写入到/dev/shm?
      翻了一下yum代码逻辑里面并没有使用/dev/shm的逻辑,后排查发现是安装的yum包中有代码逻辑使用/dev/shm来保存临时文件。在我们这个低内存的场景下显然不合适,修改这部分逻辑后解决。

参考:
https://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html
Linux man mount手册
https://superuser.com/questions/45342/when-should-i-use-dev-shm-and-when-should-i-use-tmp
https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt


没有评论:

发表评论