我正在使用 Amazon EC2 实例C4.大,总内存3.75G,运行Amazon-Linux-2015-09-HVM
内存使用量日益增加,就像内存泄漏一样。然后我杀死了所有程序和所有占用内存的进程Nginx/PHP-FPM/Redis/MySQL/sendmail
。很奇怪内存没有释放,仍然很高。该行-/+ buffers/cache: 3070 696
表示实际可用内存(不包括缓冲区/缓存):
$ free -m
total used free shared buffers cached
Mem: 3767 3412 354 4 138 203
-/+ buffers/cache: 3070 696
Swap: 0 0 0
可以看到kill之后只有少量的用户进程在运行,最高的也只有0.1%的内存使用率:
$ ps aux --sort=-resident|head -30
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 32397 0.0 0.1 114232 6672 ? Ss 08:04 0:00 sshd: ec2-user [priv]
ec2-user 32399 0.0 0.1 114232 4032 ? S 08:04 0:00 sshd: ec2-user@pts/0
ntp 2329 0.0 0.1 23788 4020 ? Ss Dec06 0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
ec2-user 32400 0.0 0.0 113572 3368 pts/0 Ss 08:04 0:00 -bash
rpcuser 2137 0.0 0.0 39828 3148 ? Ss Dec06 0:00 rpc.statd
root 2303 0.0 0.0 76324 2944 ? Ss Dec06 0:00 /usr/sbin/sshd
root 2089 0.0 0.0 247360 2676 ? Sl Dec06 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root 1545 0.0 0.0 11364 2556 ? Ss Dec06 0:00 /sbin/udevd -d
root 1 0.0 0.0 19620 2540 ? Ss Dec06 0:00 /sbin/init
ec2-user 1228 0.0 0.0 117152 2480 pts/0 R+ 10:32 0:00 ps aux --sort=-resident
root 2030 0.0 0.0 9336 2264 ? Ss Dec06 0:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
rpc 2120 0.0 0.0 35260 2264 ? Ss Dec06 0:00 rpcbind
root 2071 0.0 0.0 112040 2116 ? S<sl Dec06 0:00 auditd
root 1667 0.0 0.0 11308 2064 ? S Dec06 0:00 /sbin/udevd -d
root 1668 0.0 0.0 11308 2040 ? S Dec06 0:00 /sbin/udevd -d
root 2373 0.0 0.0 117608 2000 ? Ss Dec06 0:00 crond
ec2-user 1229 0.0 0.0 107912 1784 pts/0 S+ 10:32 0:00 head -30
root 2100 0.0 0.0 13716 1624 ? Ss Dec06 0:09 irqbalance --pid=/var/run/irqbalance.pid
root 2432 0.0 0.0 4552 1580 ttyS0 Ss+ Dec06 0:00 /sbin/agetty ttyS0 9600 vt100-nav
root 2446 0.0 0.0 4316 1484 tty6 Ss+ Dec06 0:00 /sbin/mingetty /dev/tty6
root 2439 0.0 0.0 4316 1464 tty3 Ss+ Dec06 0:00 /sbin/mingetty /dev/tty3
root 2437 0.0 0.0 4316 1424 tty2 Ss+ Dec06 0:00 /sbin/mingetty /dev/tty2
root 2444 0.0 0.0 4316 1416 tty5 Ss+ Dec06 0:00 /sbin/mingetty /dev/tty5
root 2434 0.0 0.0 4316 1388 tty1 Ss+ Dec06 0:00 /sbin/mingetty /dev/tty1
root 2441 0.0 0.0 4316 1388 tty4 Ss+ Dec06 0:00 /sbin/mingetty /dev/tty4
dbus 2160 0.0 0.0 21768 232 ? Ss Dec06 0:00 dbus-daemon --system
root 2383 0.0 0.0 15372 144 ? Ss Dec06 0:00 /usr/sbin/atd
root 2106 0.0 0.0 4384 88 ? Ss Dec06 0:16 rngd --no-tpm=1 --quiet
root 2 0.0 0.0 0 0 ? S Dec06 0:00 [kthreadd]
没有进程占用高内存,但系统总可用空间只有 696M(总内存为 3.75G),这是 EC2 或 Amazon Linux 的 bug 吗?我还有另一个T2.微实例正在运行,终止后Nginx/MySQL/PHP-FPM
内存被释放,可用数量增加。如果有人能提供帮助,我将不胜感激。
答案1
我手边没有 C4.large 实例来检查我的理论,所以我可能是在盲目尝试,但是你检查过 Xen 气球驱动器的统计数据吗?
以下是对这种可能机制的详细解释:http://lowendbox.com/blog/how-to-tell-your-xen-vps-is-overselling-memory/
这里有各种 sysfs 路径的文档,可以为您提供更多信息:https://www.kernel.org/doc/Documentation/ABI/stable/sysfs-devices-system-xen_memory
答案2
我认为这个链接很好地描述了你所看到的“问题”
结果是,Linux 只是将尽可能多的内存用作磁盘缓存。显然,这使得磁盘访问更快。
当某个程序(例如 nginx)需要 RAM 时,RAM 将从缓存任务中“释放”,并分配给您运行的任何程序。