释放 Ubuntu 8.04 服务器上的内存 (RAM)

9 linux ubuntu memory

我在带有一些轻量级服务器应用程序的 Slicehost 虚拟服务器上运行 Ubuntu 8.04 - apache22、svnserve、mysql 和 proftpd。唯一严重的服务限制是 RAM - 256MB 是我支付的费用。

我注意到如果我让系统运行几天/几周,空闲 RAM 的数量会慢慢减少,并且很快就会使用分页文件。例如,在重新启动时,我可能有 60% 的 RAM 空闲,第二天可能是 55%,等等。

             total       used       free     shared    buffers     cached
Mem:           256        114        141          0          3         50
-/+ buffers/cache:         61        194
Swap:          511          0        511
Run Code Online (Sandbox Code Playgroud)

我将如何防止可用内存量下降?

编辑:这是我ps -aux列出的最大内存消费者。我省略了所有系统进程。我可以看到 apache 和 mysql 占据内存使用量的首位。

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root      1369  0.0  0.3  16844   952 ?        S<s  00:10   0:00 /sbin/udevd --daemon
    syslog    2110  0.0  0.2  12288   748 ?        Ss   00:10   0:00 /sbin/syslogd -u syslog
    root      2131  0.0  0.2   8128   588 ?        S    00:10   0:00 /bin/dd bs 1 if /proc/kmsg of /var/run/klogd/kmsg
    klog      2133  0.0  0.4   4516  1304 ?        Ss   00:10   0:00 /sbin/klogd -P /var/run/klogd/kmsg
    root      2154  0.0  0.4  50904  1152 ?        Ss   00:10   0:00 /usr/sbin/sshd
    root      2211  0.0  0.2   3932   592 ?        S    00:10   0:00 /bin/sh /usr/bin/mysqld_safe
    mysql     2253  0.0  8.8 161940 23252 ?        Sl   00:10   0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mys
    root      2254  0.0  0.2   3836   604 ?        S    00:10   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
    proftpd   2340  0.0  0.5  63000  1504 ?        Ss   00:10   0:00 proftpd: (accepting connections)
    root      2356  0.0  0.3  18608   964 ?        Ss   00:10   0:00 /usr/sbin/cron
    root      2384  0.0  0.3  83360   892 ?        Ss   00:10   0:00 svnserve -d -r /etc/svn/svn-rep-01
    root      2387  0.0  3.5 194628  9220 ?        Ss   00:10   0:00 /usr/sbin/apache2 -k start
    root      2409  0.0  0.2   3852   576 tty1     Ss+  00:10   0:00 /sbin/getty 38400 tty1
    root      2410  0.0  0.5  15252  1444 ?        Sl   00:10   0:00 /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apache2/ApplicationPoolServerExecutable 0 /us
    www-data  2411  0.0  3.4 195880  9100 ?        S    00:10   0:00 /usr/sbin/apache2 -k start
    www-data  2412  0.0  7.3 205532 19400 ?        S    00:10   0:00 /usr/sbin/apache2 -k start
    www-data  2413  0.0  3.3 195620  8824 ?        S    00:10   0:00 /usr/sbin/apache2 -k start
    www-data  2414  0.0  3.4 195880  9080 ?        S    00:10   0:00 /usr/sbin/apache2 -k start
    www-data  2415  0.0  3.4 195888  9056 ?        S    00:10   0:00 /usr/sbin/apache2 -k start
    root      2416  0.0  2.4  43448  6512 ?        Sl   00:10   0:00 Passenger spawn server
    www-data  2437  0.0  7.7 208116 20248 ?        S    00:48   0:00 /usr/sbin/apache2 -k start
    www-data  2519  0.0  3.3 195644  8820 ?        S    02:12   0:00 /usr/sbin/apache2 -k start
    root      3026  0.0  1.1  67960  2892 ?        Ss   20:53   0:00 sshd: dv [priv]
    dv        3028  0.0  0.6  67960  1700 ?        S    20:53   0:00 sshd: dv@pts/0
    dv        3029  0.1  0.8  19392  2304 pts/0    Ss   20:53   0:00 -bash
    dv        3041  0.0  0.4  15056  1092 pts/0    R+   20:54   0:00 ps -aux
Run Code Online (Sandbox Code Playgroud)

总的来说,我要感谢每个人的深思熟虑的答案,很难选择最好的,因为每个人都有一些有用的信息。

我会考虑转向 lighthttpd 或 nginx,或者至少减少 apache 的 MaxClients 参数。

Ken*_*ric 12

您会注意到其中一些正在被“缓存”消耗。

这只是磁盘读/写被缓存,你基本上可以假设它是免费的,因为它会在更重要的东西需要它时被转储出来。

它使磁盘 IO 更快。:)

我的机器上目前有 2G 的磁盘缓存,这让事情变得更快。

“免费”是一个糟糕的内存分析工具。我发现“htop”是一个更实用的整体系统管理工具,它既提供了内存使用的实际表示,又提供了探索进程的实用方法。

像这样,更漂亮:

1 [||||| 5.0%] 任务:共 156 个,运行 2 个
2 [||| 2.5%] 平均负载:0.29 0.30 0.31
内存[|||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||| 1182/3967MB] 正常运行时间:5 天,16:25:36
Swp[|| 37/2000MB]
内存:3967M 使用:1182M 缓冲区:0M 缓存:1952M

(如果你想知道低正常运行时间......那是一台笔记本电脑)

很多人可能会提供方法来否定缓存以从交换中获取内容,但它或多或少毫无意义。你最终要做的就是降低性能,除非你有一个真正内存密集型的程序,但每隔几天才密集运行,这样当它不密集运行时,它就会被换出,当它出现时,你不能等待大约 .5 秒将其从磁盘交换回内存。

我个人想不出任何符合这些条件的好程序。耸耸肩

编写内核的人或多或少知道他们在这个部门做什么,我相信他们的判断,除非你确定你知道得更好。

正如@Paul Betts 所说,切换到 lighttpd 可能会帮助您节省一点。取决于你在做什么,总会有一些权衡。

我在我的 vps 上使用它。只有 96M ram 和 63M 交换,并且分别只使用 26M(不开玩笑)和 35M。还有一个数据库在那里运行。( Postgres ,但没有真正使用过)


小智 1

使用lighttpd而不是apache——这并不能解决你的内存泄漏问题,但会帮助你节省RAM。另外,您应该使用 top/htop 找出哪个进程正在执行泄漏,然后您可以进一步调试它。发生这种情况的原因有 1000 个 - 您需要进行调查。