我在带有一些轻量级服务器应用程序的 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 个 - 您需要进行调查。
| 归档时间: |
|
| 查看次数: |
6374 次 |
| 最近记录: |