![经过研究,仍然对监控 RAM 使用情况感到困惑](https://linux22.com/image/31543/%E7%BB%8F%E8%BF%87%E7%A0%94%E7%A9%B6%EF%BC%8C%E4%BB%8D%E7%84%B6%E5%AF%B9%E7%9B%91%E6%8E%A7%20RAM%20%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E6%84%9F%E5%88%B0%E5%9B%B0%E6%83%91.png)
我经历了本文,其中解释了检查 RAM 使用情况的各种方法。但是,我无法协调不同的方法,也不知道哪一种是正确的。
当我第一次登录时,我会看到这样的屏幕:
System information as of Sun Apr 28 21:46:58 UTC 2013
System load: 0.0 Processes: 76
Usage of /: 15.6% of 7.87GB Users logged in: 1
Memory usage: 41% IP address for eth0:
Swap usage: 0%
这对我来说表明我使用了 41% 的 RAM,这看起来相当高,因为服务器没有做太多事情。或者这个数字是否指的是 RAM 之外的其他东西?
接下来我尝试一下free -m
方法:
ubuntu@ip-:~$ free -m
total used free shared buffers cached
Mem: 590 513 76 0 67 315
-/+ buffers/cache: 130 459
Swap: 0 0 0
根据文章中的解释图,这意味着我有 130MB 的已用 RAM 和 459MB 的可用 RAM,这表明我使用了大约 22% 的 RAM。
接下来我运行top
:
top - 22:14:48 up 195 days, 21:30, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 77 total, 1 running, 76 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.3%us, 0.3%sy, 0.0%ni, 97.7%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 604376k total, 525692k used, 78684k free, 69124k buffers
Swap: 0k total, 0k used, 0k free, 322740k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 24332 1864 976 S 0.0 0.3 0:08.75 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
这是最令人困惑的,因为摘要显示我总共使用了 604M 中的 525MG,但是当使用“m”交互式命令按顶部内存排序时,顶部进程仅使用 0.3% 的内存???
最后,该ps
命令似乎也显示很少的内存使用量:
root@ip-:/home/ubuntu# ps -o command,rss
COMMAND RSS
ps -o command,rss 788
sudo su root 1764
su root 1404
bash 2132
我希望有人能纠正我造成这些明显冲突的任何误解。
谢谢!
编辑拉胡尔
输出cat /proc/meminfo
:
MemTotal: 604376 kB
MemFree: 157564 kB
Buffers: 49640 kB
Cached: 231376 kB
SwapCached: 0 kB
Active: 290040 kB
Inactive: 97772 kB
Active(anon): 107672 kB
Inactive(anon): 4844 kB
Active(file): 182368 kB
Inactive(file): 92928 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 52 kB
Writeback: 0 kB
AnonPages: 106836 kB
Mapped: 22920 kB
Shmem: 5712 kB
Slab: 42032 kB
SReclaimable: 34016 kB
SUnreclaim: 8016 kB
KernelStack: 688 kB
PageTables: 3584 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 302188 kB
Committed_AS: 242768 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7152 kB
VmallocChunk: 34359729008 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 637952 kB
DirectMap2M: 0 kB
答案1
你只需要理解内存概念
根据 /proc/meminfo 的输出,您只需要注意以下事项:
缓冲器:- 缓冲区是尚未“写入”磁盘的东西。它表示有多少 RAM 专用于缓存磁盘块。 “Cached”与“Buffers”类似,只是这次它缓存文件读取的页面
缓存:- 缓存是从磁盘“读取”并存储以供以后使用的东西。一般来说,您可以将缓存区域视为另一个“空闲”RAM,因为如果应用程序需要更多内存,它会逐渐缩小。
只要理解“buffers”和“Cached”都代表系统缓存的大小就足够了。它们根据内部 Linux 内核机制的要求动态增长或收缩。
在 Webhosting,他们使用以下 cmd 清除缓存:(主要在 cron 中配置):
sync && echo 3 > /proc/sys/vm/drop_caches
引用关联
编辑另一项要求,即每个用户的内存使用情况
#!/bin/bash
total_mem=0
printf "%-10s%-10s\n" User MemUsage
while read u m
do
[[ $old_user != $u ]] && { printf "%-10s%-0.1f\n" $old_user $total_mem; total_mem=0; }
total_mem=$(echo $m + $total_mem | bc);
old_user=$u
done < <(ps --no-headers -eo user,%mem| sort -k1)
#--EOF
请检查上面的脚本并告诉我它是否正确显示。
答案2
很好的答案@RahulPatil。
关于 ps 或 top 需要考虑的另一点如下
该工具 [exmap] 比 ps 或 top 更准确,因为它考虑了多个应用程序使用的共享库。例如,如果两个应用程序使用相同的共享库,该共享库占用 1MB 内存,则 ps 将显示两个应用程序使用 1MB 的额外内存,而 exmap 更正确地显示每个应用程序使用 500 KB。这种更高的准确性对于评估 KDE 和 GNOME 等桌面环境尤其重要,这些环境大量使用应用程序之间共享的库。
通过ibm/developerworks/linux_memory
由于您的问题涉及无头服务器 - 我不确定 top 或 ps 实际上会有多少双重报告。
答案3
我担心我们可能会忽视显而易见的事情,因为这对我们大多数人来说都是“理所当然的”。
Jonah,如果我错了,请原谅我,但你的问题听起来好像你可能没有意识到所有这些值,特别是 CPU 使用率,通常会随着时间的推移而变化很大。
当新进程启动时,CPU 使用率可能会立即从个位数上升到 100%,但很快(希望)回落到 50% 以下的范围。
内存使用情况变化较慢,但 Linux 尝试通过运行“缓存”磁盘访问的进程来使用未主动使用的内存。例如,它尝试预测接下来需要从磁盘读取什么,例如读取一部分后可能是大文件的其余部分,并将其预加载到缓存中。一些内存使用值包括进程使用的内存以及用于缓存的内存。在已经运行了一段时间的系统上,两者加起来可能会达到 80-90% 或更多。
还要考虑您运行的用于显示使用情况的进程(例如 )top
也使用 CPU 和内存。如果您编写一个带有循环的脚本来连续报告 CPU 使用情况,它几乎肯定会始终显示 100%,因为报告使用情况本身的行为(没有 sleep
引入一些延迟)使用了所有 CPU。