Я запускаю Ubuntu 8.04 на виртуальном сервере Slicehost с некоторыми легковесными серверными приложениями - apache22, svnserve, mysql и proftpd. Единственное серьезное ограничение сервиса - это ОЗУ - я плачу за 256 МБ.
Я заметил, что если я позволю системе поработать несколько дней / недель, объем свободной оперативной памяти постепенно уменьшается, и вскоре после этого используется файл подкачки. Например, при перезагрузке у меня может быть свободно 60% оперативной памяти, на следующий день может быть 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
В целом, я хотел бы поблагодарить всех за их вдумчивые ответы, и было действительно сложно выбрать лучшее, потому что в каждом есть полезная информация.
Я подумаю о переходе на lighthttpd или nginx или, по крайней мере, уменьшу параметр Apache MaxClients.
Вы заметите, что часть этого потребляется «кешем».
Это просто кэширование чтения / записи на диск, и вы можете считать, что он свободен, потому что он будет выгружен, как только что-то более важное понадобится.
Это ускоряет ввод-вывод на диск. :)
В настоящее время у меня в коробке 2 ГБ дискового кеша, что делает работу быстрее.
«бесплатно» - плохой инструмент для анализа памяти. Я считаю "htop" гораздо более практичным инструментом общего управления системой, который дает как практическое представление об использовании памяти, так и практический способ исследования процессов.
Вот так, чуть красивее:
1 [||||| 5.0%] Tasks: 156 total, 2 running 2 [||| 2.5%] Load average: 0.29 0.30 0.31 Mem[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 1182/3967MB] Uptime: 5 days, 16:25:36 Swp[|| 37/2000MB] Mem:3967M used:1182M buffers:0M cache:1952M
(если вам интересно, что такое низкое время безотказной работы ... это ноутбук)
Многие люди могут предоставить способы отменить кеширование, чтобы получить данные из свопа, но это более или менее бессмысленно. Все, что вы в конечном итоге сделаете, это снизите производительность, если у вас нет программы, которая действительно интенсивная память , но выполняется интенсивно только каждые несколько дней, так что, когда он не работает интенсивно, он выгружается, а когда он все же включается, вы не можете ждать ~ 0,5 секунды, необходимые для его возврата в память с диска.
Лично я не могу придумать ни одной хорошей программы, которая бы соответствовала этим условиям. пожимает плечами
Люди, написавшие ядро, более или менее знают, что делают в этом отделе, я бы доверял их мнению, если только вы определенный ты знаешь лучше.
как сказал @Paul Betts, переход на lighttpd может помочь вам немного сэкономить. В зависимости от того, что вы делаете, всегда есть несколько компромиссов.
Использую на своих vps. Имеет только 96 МБ оперативной памяти и 63 МБ подкачки, и только при использовании 26 МБ (без шуток) и 35 МБ соответственно. И там тоже работает база данных. (Postgres, но на самом деле не используется)
Игнорируйте первую строку. Важные числа находятся в строке «- / + buffers / cache». Linux очистит кеш и буферы, чтобы освободить место для процессов.
Мой сервер Debian обычно показывает от 2 до 10 мегабайт свободного места в первой строке. Вторая строка показывает, что у меня свободно 50 мегабайт. (Всего в системе 256 RAM)
Ваши числа выглядят нормально. НЕ очищайте буферы / кеш. Свободного барана у тебя более чем достаточно.
Теперь, если у вас нет свободной памяти для кеша, ваша система будет работать медленно. Если вы начнете использовать много подкачки, у вас возникнут проблемы с обслуживанием веб-страниц.
вам нужно изменить свою подкачку (сообщает ядру, насколько оно должно подкачиваться)
# sysctl -w vm.swappiness=0
установка его в 0 укажет виртуальной машине хранить как можно больше данных в памяти, но вам нужно пойти и прочитать то, что вам подходит, это сложно сказать, но поэкспериментируйте и посмотрите, что вы можете придумать.
отредактируйте строку vm.swappiness в /etc/sysctl.conf, чтобы настроить ее при загрузке
Другими словами, вы хотите максимально использовать память и уменьшить объем подкачки, которая происходит на диске.
Используйте lighttpd вместо apache - это не решит проблему утечки памяти, но поможет сэкономить оперативную память. Кроме того, вы должны использовать top / htop, чтобы выяснить, в каком процессе происходит утечка, после чего вы сможете отладить его дальше. Есть 1000 причин, по которым это могло произойти - вам нужно исследовать.
Если он всегда врезается в своп, пока он не заполнится, у вас, вероятно, проблема. Пока в свопинге мало что используется, а физическая память заполнена, это нормально. Вы хотите, чтобы весь ваш физический барабан был израсходован, вот для чего он нужен.
Ответ зависит от того, что ест вашу оперативную память. Начните сужать проблему, сравнивая результат двух ps aux
проходит с интервалом 24 часа.
Кроме того, имейте в виду, что Linux интенсивно использует память для кэширования ввода-вывода. Эти кеши освобождаются, как только другой процесс запрашивает это пространство, поэтому они никогда не должны отрицательно влиять на производительность. Это означает, что вторая строка в free
вывод (-/+ buffers/cache
) является важным.
Какая у вас настройка MaxClients в вашей конфигурации Apache? Моя виртуальная машина Slicehost делала то же самое, пока я не опустил свою до чего-то разумного для того объема оперативной памяти, который у меня есть в коробке.
Это немного похоже на пробку, но, надеюсь, поможет сэкономить ресурсы;)
Веб-сервер Nginx (лучше, чем Apache) - VPS BIBLE Pt 11
.. это проверено на Linode, который аналогичен Slicehost .. но они предоставляют 360 МБ ОЗУ за те же 20 долларов в месяц (и дополнительные 6 ГБ места), которые вы будете платить, DV, за свои план.
Другая часть Библии VPS, ссылка на которую имеется в полном указателе серии на странице, описывает, как настроить Xcache, если это поможет.
В противном случае вы можете играть с swappiness без перезагрузки, что очень важно для сервера: -
sudo sysctl vm.swappiness = 10
Просто измените «10» на любое значение в зависимости от ваших потребностей. Повторно введите команду с другими значениями. Когда вы в конце концов перезагрузитесь, значение будет по умолчанию.
Ты можешь использовать:
эхо 1> / proc / sys / vm / drop_caches
Я считаю, что нужно также освободить кеши. Он должен полностью отбросить кеши, но через несколько дней вы вернетесь туда, где находитесь сейчас. Однако вы можете настроить его.