我的 Web 服务器上的命令输出了一些奇怪的输出top
。输出按 %MEM 排序:
top - 13:57:43 up 13 days, 21:58, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2854520k total, *2767576k used*, *86944k free*, 328060k buffers
Swap: 5574648k total, 0k used, 5574648k free, 2194252k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2528 mysql 20 0 136m 26m 6260 S 0 0.9 0:01.74 mysqld
2804 www 20 0 40732 15m 4412 S 0 0.6 0:00.72 apache2
2708 www 20 0 40724 14m 4060 S 0 0.5 0:00.13 apache2
2844 www 20 0 40696 14m 3984 S 0 0.5 0:00.26 apache2
2847 www 20 0 40696 14m 3960 S 0 0.5 0:00.12 apache2
2815 www 20 0 39816 14m 4240 S 0 0.5 0:00.58 apache2
7516 root 20 0 35264 14m 7776 S 0 0.5 0:11.79 apache2
1096 bind 20 0 51192 9504 2328 S 0 0.3 0:00.09 named
2838 www 20 0 35800 8852 1716 S 0 0.3 0:00.00 apache2
2846 www 20 0 35336 8440 1528 S 0 0.3 0:00.00 apache2
2850 www 20 0 35336 8440 1528 S 0 0.3 0:00.00 apache2
2849 www 20 0 35312 7960 1072 S 0 0.3 0:00.00 apache2
2891 www 20 0 35296 7772 892 S 0 0.3 0:00.00 apache2
1147 root 20 0 48532 6948 2300 S 0 0.2 0:00.09 lwresd
1414 postgres 20 0 46444 5456 4640 S 0 0.2 0:08.90 postgres
1564 root 20 0 18512 5096 4280 S 0 0.2 0:02.96 smbd
注意用过的和自由的输出标题中的总数。
某些东西基本上占用了我所有的内存,但是这个输出似乎并不能帮助我诊断问题。
什么东西可能消耗了所有的内存?
服务器是安装了标准 LAMP 堆栈和 samba 的 Debian 5。
答案1
操作系统有大量的空闲内存,因此释放任何内存都是没有意义的。假设操作系统释放了一些内存,则会发生以下两种情况之一:
短期内不会有任何事物使用该内存。在这种情况下,释放内存是浪费时间,因为它不会被使用。
很快就会有东西使用该内存。在这种情况下,释放内存就是在浪费时间,因为系统必须再次使用它。
无论哪种情况,努力都是白费的。这就是为什么现代操作系统只有在别无选择的情况下才会释放内存。在这种情况下,操作系统还有另一种选择——它可以使用内存来保存最近从磁盘读取或写入的数据,希望某些东西需要再次访问这些数据,这样就可以省去磁盘访问。
如果你在想“我现在想释放内存,以便以后使用”,那就别想了。你现在可以使用它和以后再用。没必要做出痛苦的权衡。
答案2
你的Linux只是缓存文件。