我有 RHEL 5.8。每隔一个月左右,服务器就会进入无响应状态或拒绝 ssh 连接。不知何故,如果我可以进入服务器,“free”将显示 98% 的内存被利用。但是当我检查进程时,我看不到任何消耗大量内存的进程。我不确定这是否是内存泄漏,如果是,如何检测/找到它。
下面是当前状态。显示内存使用率为 20%,不过我还没找到所有进程都在使用这 20%。最终在一个月左右的时间里,内存使用率会上升。
[root@server2 ~]# watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
Every 2.0s: ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16 Thu Feb 21 21:46:14 2019
PID %MEM RSS VSZ COMMAND
3812 5.4 443788 443800 ssp_x86Linux_bo
4873 1.1 98028 303884 media_server
5232 0.3 28584 177324 oacore
5561 0.1 16156 100944 hpsensor
5443 0.1 15336 254948 yum-updatesd
5572 0.1 11988 137308 opcmona
3896 0.1 11716 255824 bmserver
3372 0.1 10884 160908 snmpd
5535 0.1 10760 79132 opcmsga
5199 0.1 10388 142188 ovcd
5525 0.1 9580 125692 opcacta
5207 0.1 9568 116444 ovbbccb
3764 0.1 9536 465776 dlgsysmonitorse
5514 0.1 9520 122424 opcmsgi
5465 0.0 8024 43744 ovconfd
[root@server2 ~]# free -m
total used free shared buffers cached
Mem: 7983 1651 6331 0 223 714
-/+ buffers/cache: 712 7270Swap: 9983 0 9983
[root@server2 ~]# free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
Memory Usage: 1651/7983MB (20.68%)
[root@server2 ~]#
谢谢
答案1
释放内存是系统所能拥有的最不有用的内存。它并不比放在架子上的一块 RAM 好。如果你在想,“我现在想释放我的 RAM,以便以后使用”,那就别想了。你们现在都可以使用 RAM和以后再用。RAM 不需要现在免费,以后再用。这里不需要权衡。保持 RAM 免费是有成本的,而使用 RAM 则没有成本。
即使只包含随机垃圾的内存也比空闲内存更有用。为什么?因为空闲内存必须变为非空闲才能提供任何好处。包含随机垃圾的内存不需要这个额外的步骤。
因此,像 Linux 这样的现代操作系统会尽力将 RAM 用于某些目的(任何目的),而不是遇到有空闲 RAM 的最坏情况。
例如,假设一个程序执行后结束。操作系统可以释放保存该程序的内存。但为什么要这样做呢?这是额外的努力。必须撤消这些努力才能使用内存。如果操作系统将程序保留在内存中,并且程序再次运行,则不必从磁盘读取。因此,即使没有进程正在使用它,操作系统也会保持内存处于使用状态。
对你的问题的简短回答是,它是之前需要存储在内存中的随机垃圾。它被保存在内存中而不是释放内存,因为这样效率更高,特别是如果可能再次需要这些数据,但即使不需要。
无论您遇到什么性能问题,都无法通过查看系统正常运行时的正常内存使用情况来分析。