Назад | Перейти на главную страницу

Как уменьшить потребление оперативной памяти, когда мой сервер простаивает

Мы используем 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, но я не могу себе представить, что это будет необходимо.