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

我使用一些轻量级的服务器应用程序(apache22,svnserve,mysql和proftpd)在Slicehost虚拟服务器上运行Ubuntu 8.04。 唯一严重的服务限制是RAM – 256MB是我付出的。

我注意到,如果我让系统运行几天/周,可用内存的数量会慢慢下降,分页文件正在被使用。 例如,在重新启动时,我可能有60%的RAM是空闲的,第二天可能是55%,等等。

total used free shared buffers cached Mem: 256 114 141 0 3 50 -/+ buffers/cache: 61 194 Swap: 511 0 511 

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

编辑 :这是我的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 

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

我会考虑移动到lighthttpd或nginx,或者至less减lessapache的MaxClients参数。

你会注意到一些正在被“caching”所占用。

这只是磁盘读/写被caching,你可以基本上认为它是免费的,因为只要有一些更重要的需要它就会被抛弃。

它使磁盘IO更快。 🙂

我目前在我的盒子上有2G的磁盘caching,让事情变得快速。

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

像这样,只是更漂亮:

 1 [

|| 5.0%]任务:共计156个,2个正在运行
2 [

2.5%]平均负载:0.29 0.30 0.31
MEM [

| 1182 / 3967MB]正常运行时间:5天,16:25:36
SWP [|| 37 / 2000MB]
Mem:3967M使用:1182M缓冲区:0Mcaching:1952M

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

很多人可能会提供一些方法来取消高速caching以取代交换中的内容,但它或多或less没有意义。 除非你有一个真正的内存密集的程序,但是每隔几天只能集中运行一次,所以你最终会做的就是降低性能,这样当它没有被集中运行的时候就会被换出来,而且当它发生的时候,等待~5秒钟将其从磁盘交换回内存。

我个人不能想到任何符合这些条件的好程序。 举重若轻

写内核的人或多或less地知道他们在这个部门做的事情,除非你确定自己知道的更好,否则我会相信他们的判断。

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

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

忽略第一行。 重要的数字在“ – / + buffers / cache”行。 Linux将清除caching和缓冲区,为进程开辟道路。

我的Debian服务器通常在第一行显示2到10兆字节的可用空间。 第二行显示我有50兆字节的空闲空间。 (系统总共有256个ram)

你的号码看起来不错。 不要清除缓冲区/caching。 你有足够的免费公羊。

现在如果你没有空闲的caching,你的系统将运行缓慢。 如果你开始使用很多的交换,你将有问题的网页提供服务。

你需要改变你的swappiness(告诉内核应该交换多less)

 # sysctl -w vm.swappiness=0 

将其设置为0会告诉虚拟机将尽可能多的数据保存在内存中,但是您需要阅读最适合自己的内容,这很难说,但是要做一些尝试,看看你能想出什么。

编辑/etc/sysctl.conf中的vm.swappiness行以在启动时进行设置

换句话说,您要尽可能使用内存,并减less磁盘上发生的交换量

使用lighttpd而不是apache – 这不能解决你的内存泄漏,但会帮你保存RAM。 另外,您应该使用top / htop来确定哪个进程正在进行泄漏,然后您可以进一步进行debugging。 有1000个原因可能会发生 – 你需要调查。

如果它一直切换到交换状态,那么可能有问题。 只要在交换中使用很less,并且物理内存已满,那也没关系。 你想要所有的物理公羊都用完了,就是这样。

答案取决于吃什么你的RAM。 通过比较相隔24小时的两个ps aux的输出,开始缩小问题的范围。

另外请注意,Linux大量使用内存来cachingI / O。 一旦另一个进程请求这个空间,这些caching就会被释放,所以它们不应该对性能产生负面影响。 这意味着free的输出( -/+ buffers/cache )中的第二行是重要的。

您的Apacheconfiguration中的MaxClients设置是什么? 我的Slicehost虚拟机做了同样的事情,直到我把我的内存数量减less到一个合理的数量。

这是一个插件,但希望有一个好的节省资源;)

Nginx(比Apache好)Web Server – VPS BIBLE Pt 11

..这是testingLinode这是一个类似的设置Slicehost ..但他们提供360MB的RAM为每月相同的20美元(和一个额外的6GB的空间),这是你将支付,DV,为您计划。

VPS圣经的另一部分,链接在页面上的全系列索引中,阐述了如何configurationXcache,如果有帮助的话。

否则,你可以玩swappiness,而不必重新启动,相当关键的服务器: –

sudo sysctl vm.swappiness = 10

只要根据你的需要改变“10”的值。 用不同的值重新input命令。 当最终重新启动时,值默认值。

您可以使用:

echo 1> / proc / sys / vm / drop_caches

我相信也释放caching。 它应该完全放弃caching,但几天后,你会马上回到你现在的位置。 你可以cron它,但。