我们使用 Slicehost,实例大小为 512MB。我们在实例上运行 Ubuntu 9.10。我安装了一些软件包,现在我正尝试在运行任何程序之前优化 RAM 消耗。
简单ps
给出正在运行的进程列表:
# ps faux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S< Jan04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< Jan04 0:15 \_ [migration/0]
root 4 0.0 0.0 0 0 ? S< Jan04 0:01 \_ [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [watchdog/0]
root 6 0.0 0.0 0 0 ? S< Jan04 0:04 \_ [events/0]
root 7 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [cpuset]
root 8 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [khelper]
root 9 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [async/mgr]
root 10 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xenwatch]
root 11 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xenbus]
root 13 0.0 0.0 0 0 ? S< Jan04 0:02 \_ [migration/1]
root 14 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [ksoftirqd/1]
root 15 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [watchdog/1]
root 16 0.0 0.0 0 0 ? S< Jan04 0:07 \_ [events/1]
root 17 0.0 0.0 0 0 ? S< Jan04 0:02 \_ [migration/2]
root 18 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [ksoftirqd/2]
root 19 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [watchdog/2]
root 20 0.0 0.0 0 0 ? R< Jan04 0:07 \_ [events/2]
root 21 0.0 0.0 0 0 ? S< Jan04 0:04 \_ [migration/3]
root 22 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [ksoftirqd/3]
root 23 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [watchdog/3]
root 24 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [events/3]
root 25 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kintegrityd/0]
root 26 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kintegrityd/1]
root 27 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kintegrityd/2]
root 28 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kintegrityd/3]
root 29 0.0 0.0 0 0 ? S< Jan04 0:01 \_ [kblockd/0]
root 30 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kblockd/1]
root 31 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kblockd/2]
root 32 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kblockd/3]
root 33 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kseriod]
root 34 0.0 0.0 0 0 ? S Jan04 0:00 \_ [khungtaskd]
root 35 0.0 0.0 0 0 ? S Jan04 0:05 \_ [pdflush]
root 36 0.0 0.0 0 0 ? S Jan04 0:06 \_ [pdflush]
root 37 0.0 0.0 0 0 ? S< Jan04 1:02 \_ [kswapd0]
root 38 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [aio/0]
root 39 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [aio/1]
root 40 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [aio/2]
root 41 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [aio/3]
root 42 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [jfsIO]
root 43 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [jfsCommit]
root 44 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [jfsCommit]
root 45 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [jfsCommit]
root 46 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [jfsCommit]
root 47 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [jfsSync]
root 48 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfs_mru_cache]
root 49 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfslogd/0]
root 50 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfslogd/1]
root 51 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfslogd/2]
root 52 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfslogd/3]
root 53 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsdatad/0]
root 54 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsdatad/1]
root 55 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsdatad/2]
root 56 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsdatad/3]
root 57 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsconvertd/0]
root 58 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsconvertd/1]
root 59 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsconvertd/2]
root 60 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [xfsconvertd/3]
root 61 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [glock_workqueue]
root 62 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [glock_workqueue]
root 63 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [glock_workqueue]
root 64 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [glock_workqueue]
root 65 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [delete_workqueu]
root 66 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [delete_workqueu]
root 67 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [delete_workqueu]
root 68 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [delete_workqueu]
root 69 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kslowd]
root 70 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kslowd]
root 71 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [crypto/0]
root 72 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [crypto/1]
root 73 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [crypto/2]
root 74 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [crypto/3]
root 77 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [net_accel/0]
root 78 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [net_accel/1]
root 79 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [net_accel/2]
root 80 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [net_accel/3]
root 81 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [sfc_netfront/0]
root 82 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [sfc_netfront/1]
root 83 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [sfc_netfront/2]
root 84 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [sfc_netfront/3]
root 310 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kstriped]
root 315 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [ksnapd]
root 1452 0.0 0.0 0 0 ? S< Jan04 4:31 \_ [kjournald]
root 1 0.0 0.1 19292 948 ? Ss Jan04 0:15 /sbin/init
root 1545 0.0 0.1 13164 1064 ? S Jan04 0:00 upstart-udev-bridge --daemon
root 1547 0.0 0.1 17196 996 ? S<s Jan04 0:00 udevd --daemon
root 1728 0.0 0.2 20284 1468 ? S< Jan04 0:00 \_ udevd --daemon
root 1729 0.0 0.1 17192 792 ? S< Jan04 0:00 \_ udevd --daemon
root 1881 0.0 0.0 8192 152 ? Ss Jan04 0:00 dd bs=1 if=/proc/kmsg of=/var/run/rsyslog/kmsg
syslog 1884 0.0 0.2 185252 1200 ? Sl Jan04 1:00 rsyslogd -c4
103 1894 0.0 0.1 23328 700 ? Ss Jan04 1:08 dbus-daemon --system --fork
root 2046 0.0 0.0 136 32 ? Ss Jan04 4:05 runsvdir -P /etc/service log: gems/custom_require.rb:31:in `require'??from /mnt/app/superfeedr-firehoser/current/script/component:52?/opt/ruby-enterprise/lib/ruby/si
root 2055 0.0 0.0 112 32 ? Ss Jan04 0:00 \_ runsv chef-client
root 2060 0.0 0.0 132 40 ? S Jan04 0:02 | \_ svlogd -tt ./main
root 2056 0.0 0.0 112 28 ? Ss Jan04 0:20 \_ runsv superfeedr-firehoser_2
root 2059 0.0 0.0 132 40 ? S Jan04 0:29 | \_ svlogd /var/log/superfeedr-firehoser_2
root 2057 0.0 0.0 112 28 ? Ss Jan04 0:20 \_ runsv superfeedr-firehoser_1
root 2062 0.0 0.0 132 44 ? S Jan04 0:26 \_ svlogd /var/log/superfeedr-firehoser_1
root 2058 0.0 0.0 18708 316 ? Ss Jan04 0:01 cron
root 2095 0.0 0.1 49072 764 ? Ss Jan04 0:06 /usr/sbin/sshd
root 9832 0.0 0.5 78916 3500 ? Ss 00:37 0:00 \_ sshd: root@pts/0
root 9846 0.0 0.3 17900 2036 pts/0 Ss 00:37 0:00 \_ -bash
root 10132 0.0 0.1 15020 1064 pts/0 R+ 09:51 0:00 \_ ps faux
root 2180 0.0 0.0 5988 140 tty1 Ss+ Jan04 0:00 /sbin/getty -8 38400 tty1
root 27610 0.0 1.4 47060 8436 ? S Apr04 2:21 python /usr/sbin/denyhosts --daemon --purge --config=/etc/denyhosts.conf --config=/etc/denyhosts.conf
root 22640 0.0 0.7 119244 4164 ? Ssl Apr05 0:05 /usr/sbin/console-kit-daemon
root 10113 0.0 0.0 3904 316 ? Ss 09:46 0:00 /usr/sbin/collectdmon -P /var/run/collectdmon.pid -- -C /etc/collectd/collectd.conf
root 10114 0.0 0.2 201084 1464 ? Sl 09:46 0:00 \_ collectd -C /etc/collectd/collectd.conf -f
正如您所看到的,这里没有什么严重的问题。如果我将所有这些内容的 RSS 行总结起来,我会得到以下内容:
# ps -aeo rss | awk '{sum+=$1} END {print sum}'
30096
这是有道理的。
然而,当我免费做的时候,我有一个很大的惊喜:
# free
total used free shared buffers cached
Mem: 591180 343684 247496 0 25432 161256
-/+ buffers/cache: 156996 434184
Swap: 1048568 0 1048568
如您所见,60% 的可用内存已被消耗……如果我想避免交换,就只剩下 40% 的内存来运行我自己的应用程序。真令人失望!
出现了两个问题:
- 这些记忆都在哪儿呢?
- 如何将其中一些取回用于我自己的应用程序?
答案1
您总共有 156996 KB 的内存用于程序,另外还有 343684-156996=186688 KB 用于缓冲区和缓存。这意味着大约 22% 的内存被使用,而不是 60%。
这些缓冲区用于存储磁盘内容,要么在写入磁盘之前,要么在读取之后,以防您想再次读取数据。如果您对ls
大型目录执行此操作,就会看到这一点。第一次需要很长时间,而第二次几乎是即时的。
Linux 自行分配这些缓冲区/缓存内存。但是,如果您的程序扩展,则用于缓冲区/缓存的量可能会减少。您真的不想改变使用量,Linux 的内置算法在决定量方面比您好得多。
此外,您不能像以前一样直接累加进程的大小。多个进程可以使用相同的内存块,例如通过共享内存或 fork(2),或者只是作为同一个可执行程序。
答案2
使用的 RAM 完全归结于 Linux 缓存文件系统。默认情况下,Linux 对此非常积极。如果应用程序需要 RAM,Linux 将清除一些文件系统缓存。如果您发现当您的应用程序开始请求更多 RAM 时系统正在交换,您可以调整 /proc/sys/vm/swapiness,但我认为这不是必要的。
答案3
如果你真的如果希望应用程序使用更少的 RAM,则可以输入更高的值,/proc/sys/vm/swappiness
以便告诉内核在不使用时强制将更多内容放入交换区。但这可能会影响较少使用的服务的初始性能,因为它必须从交换区加载。
echo -n "95" > /proc/sys/vm/swappiness