free -lh
我的服务器有 62 GB 的 RAM,但现在我只能看到 716 MB 的 RAM 是可用的。以下是命令的输出
total used free shared buffers cached
Mem: 62G 62G 716M 277M 415M 52G
Low: 62G 62G 716M
High: 0B 0B 0B
-/+ buffers/cache: 9.8G 53G
Swap: 15G 16M 15G
从上面的输出中,我可以看到 62GB 中只有 716 MB 是空闲的,但是当我使用top -o RES
如下所示的命令查看进程时(按 RES 降序排列),只有 glassfish 消耗了 5 GB 内存,其余进程的内存以 MB 为单位。如果我们将所有这些进程的内存加起来,则不会达到 62GB。那么现在我的问题是哪些进程消耗了更多的内存,为什么 top 命令没有显示这些进程?
top - 04:20:33 up 5 days, 15:46, 2 users, load average: 0.00, 0.00, 0.02
Tasks: 272 total, 1 running, 271 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem: 64431.17+total, 63715.67+used, 715.496 free, 415.574 buffers
MiB Swap: 16380.99+total, 16.984 used, 16364.01+free. 53273.82+cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18640 glassfish+20 0 20.284g 5.399g 59.9m S 0.0 8.6 48:56.94 java
2750 h+ 20 0 20.294g 954.7m 19.8m S 0.0 1.5 3:06.16 java
7837 h+ 20 0 20.294g 899.9m 20.0m S 0.0 1.4 0:20.89 java
2088 tomcat6 20 0 5641.2m 493.9m 20.7m S 0.0 0.8 3:59.54 java
2166 mirth 20 0 6572.8m 375.2m 21.7m S 0.0 0.6 7:26.73 java
1307 oj 20 0 20.670g 308.1m 19.5m S 0.3 0.5 10:28.15 java
31903 postgres 20 0 384.2m 77.4m 76.0m S 0.0 0.1 0:00.25 postgres
1799 rabbitmq 20 0 2167.9m 69.2m 4.0m S 0.7 0.1 47:14.13 beam.smp
6622 postgres 20 0 386.0m 36.8m 34.0m S 0.0 0.1 0:00.50 postgres
1668 postgres 20 0 384.2m 32.7m 31.4m S 0.0 0.1 0:19.87 postgres
2234 h+ 20 0 318.3m 23.8m 3.8m S 0.0 0.0 0:17.42 beam.smp
7857 postgres 20 0 385.3m 15.5m 13.2m S 0.0 0.0 0:00.33 postgres
31904 postgres 20 0 384.2m 12.1m 10.7m S 0.0 0.0 0:00.49 postgres
8089 postgres 20 0 385.2m 10.9m 8.9m S 0.0 0.0 0:00.00 postgres
8090 postgres 20 0 385.2m 10.9m 8.9m S 0.0 0.0 0:00.00 postgres
8091 postgres 20 0 385.2m 10.9m 8.9m S 0.0 0.0 0:00.00 postgres
8092 postgres 20 0 385.2m 10.9m 8.9m S 0.0 0.0 0:00.00 postgres
7919 postgres 20 0 385.2m 10.8m 8.8m S 0.0 0.0 0:00.00 postgres
8088 postgres 20 0 385.2m 10.8m 8.8m S 0.0 0.0 0:00.00 postgres
7920 postgres 20 0 385.2m 10.8m 8.8m S 0.0 0.0 0:00.00 postgres
8093 postgres 20 0 385.2m 10.8m 8.8m S 0.0 0.0 0:00.00 postgres
8094 postgres 20 0 385.2m 10.8m 8.8m S 0.0 0.0 0:00.00 postgres
573 syslog 20 0 250.0m 10.3m 2.3m S 0.0 0.0 0:01.98 rsyslogd
31902 postgres 20 0 384.7m 8.0m 6.3m S 0.0 0.0 0:01.63 postgres
31905 postgres 20 0 384.8m 7.3m 5.6m S 0.0 0.0 0:00.23 postgres
16662 root 20 0 103.2m 6.6m 5.5m S 0.0 0.0 0:00.06 sshd
5064 root 20 0 103.2m 6.5m 5.5m S 0.0 0.0 0:00.03 sshd
5301 root 20 0 103.2m 6.5m 5.5m S 0.0 0.0 0:00.01 sshd
20529 root 20 0 103.2m 6.4m 5.4m S 0.0 0.0 0:00.05 sshd
16813 b+ 20 0 21.9m 6.4m 3.3m S 0.0 0.0 0:00.19 bash
5380 b+ 20 0 21.0m 5.4m 3.2m S 0.0 0.0 0:00.05 bash
1190 root 20 0 59.9m 4.8m 4.7m S 0.0 0.0 0:00.02 sshd
16812 b+ 20 0 103.2m 4.7m 3.7m S 0.0 0.0 0:00.29 sshd
20618 b+ 20 0 103.2m 4.7m 3.6m S 0.0 0.0 0:00.12 sshd
31906 postgres 20 0 103.5m 4.6m 2.3m S 0.0 0.0 0:00.42 postgres
2340 ntp 20 0 30.7m 4.3m 3.7m S 0.0 0.0 0:23.77 ntpd
答案1
从磁盘读取数据比从内存访问数据慢得多。Linux 将磁盘中的块缓存在内存中。事实上,Linux 将所有可用 RAM 用于缓冲区缓存,以使读取数据尽可能高效。
要计算真正的可用内存,您必须将 Free 命令中的 free + buffers + cached 相加。
实际可用内存 = 可用 (716M) + 缓冲区 (415M) + 缓存 (52G)