我已经研究这个问题有一段时间了,我真的很困惑。
我有一个运行 Ubuntu Server 14.04 LTS(HVM)、SSD 卷类型 - ami-d05e75b8 的 AWS/EC2 m3.medium 实例。
我遇到了一个问题,即写入大型临时文件导致/tmp
实例内存不足。经过进一步调查,似乎问题并不局限于/tmp
。
min-memory
由于我在 watchdog.conf 中进行了设置,因此这导致实例重新启动。
我可以通过这样做来复制该问题:
root@ip-172-31-3-68:/# cat /proc/meminfo | grep MemFree
MemFree: 3543808 kB
root@ip-172-31-3-68:/# dd if=/dev/zero of=/deleteme bs=10000 count=100000
100000+0 records in
100000+0 records out
1000000000 bytes (1.0 GB) copied, 5.71321 s, 175 MB/s
root@ip-172-31-3-68:/# cat /proc/meminfo | grep MemFree
MemFree: 2537896 kB
root@ip-172-31-3-68:/# sync
root@ip-172-31-3-68:/# cat /proc/meminfo | grep MemFree
MemFree: 2537812 kB
root@ip-172-31-3-68:/# rm /deleteme
root@ip-172-31-3-68:/# cat /proc/meminfo | grep MemFree
MemFree: 3541040 kB
以下是 mount 所说的内容:
root@ip-172-31-3-68:/# mount
/dev/xvda1 on / type ext4 (rw,discard)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none on /sys/fs/pstore type pstore (rw)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
和 fstab:
root@ip-172-31-3-68:/# cat /etc/fstab
LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0
这是怎么回事?为什么我的文件被存储在内存中?
答案1
好吧,我搞明白了。fromMemFree
测量/proc/meminfo
系统中未使用的内存量,不区分类型。这与在min-memory
中设置时看门狗守护进程查看的内容完全相同watchdog.conf
。写入文件时,操作系统页面缓存会保存我正在写入的数据,以防需要再次使用。页面缓存中的内存是可回收的,但看门狗守护进程并不关心。它只关心未使用的内存。
这基本上意味着我无法使用min-memory
,watchdog.conf
这令人失望。