Мы используем Slicehost с экземплярами 512 МБ. Мы запускаем на них Ubuntu 9.10. Я установил несколько пакетов и теперь пытаюсь оптимизировать потребление оперативной памяти, прежде чем запускать что-либо там.
Простой 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% для запуска моих собственных приложений, если я хочу избежать подкачки. Довольно досадно!
Возникает 2 вопроса:
У вас в общей сложности 156996 КБ памяти, используемой для программ, а еще 343684-156996 = 186688 КБ используется для буферов и кеша. Это означает, что используется около 22% памяти, а не 60%.
Эти буферы используются для хранения содержимого ваших дисков либо до его записи на диск, либо после того, как они были прочитаны, на случай, если вы захотите прочитать данные снова. Вы можете увидеть это, если сделаете ls
в большом каталоге. В первый раз это занимает много времени, затем во второй раз почти мгновенно.
Linux выделяет эти буферные / кэш-память самостоятельно. Однако, если ваши программы расширяются, то объем, используемый для буфера / кеша, вероятно, уменьшится. Вы действительно не хотите изменять используемую сумму, встроенные алгоритмы Linux намного лучше определяют сумму, чем вы.
Кроме того, вы не можете просто сложить размеры процессов, как вы это сделали. Несколько процессов могут использовать одни и те же блоки памяти, например, через разделяемую память или fork (2), или просто будучи одной и той же исполняемой программой.
если ты действительно хотите, чтобы приложениями использовалось меньше оперативной памяти, тогда вы можете установить более высокое значение в /proc/sys/vm/swappiness
для того, чтобы ядро заставляло заменять больше файлов, когда они не используются. Это может повлиять на начальную производительность менее используемых сервисов, поскольку их придется загружать из свопа.
echo -n "95" > /proc/sys/vm/swappiness
Используемая оперативная память просто связана с кешированием файловой системы Linux. По умолчанию Linux довольно агрессивен в этом отношении. Если приложениям требуется ОЗУ, Linux удалит часть кеша файловой системы. Если вы обнаружите, что система меняет местами, когда ваше приложение начинает запрашивать больше ОЗУ, можете ли вы настроить / proc / sys / vm / swapiness, но я не могу себе представить, что это будет необходимо.