Total size: 229 M报错信息还比较清晰,安装这个软件包需要1.2G,但是/dev/shm空间不够。
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.
看下/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
没有评论:
发表评论