Проблема подкачки для приложения Rails на slicehost
У меня есть приложение Rails 2.3.8, размещенное и работающее на slicehost (256M). Я совсем не знаком с бэкэндом, я в основном следовал инструкциям из учебников по slicehost для установки Apache. Использование памяти было очень высоким, затем я изменил свой файл конфигурации Apache, чтобы уменьшить число MaxClient до 10... но мой фрагмент все еще обменивается.
Вот то, что использование памяти я получаю после нескольких щелчков на моем сайте:
top - 23:57:12 up 28 min, 2 users, load average: 0.43, 0.54, 0.30
Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 97.8%id, 0.1%wa, 0.0%hi, 0.0%si, 2.0%st
Mem: 262364k total, 258656k used, 3708k free, 260k buffers
Swap: 524280k total, 262772k used, 261508k free, 6328k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4004 web-app 20 0 178m 72m 1888 S 0 28.4 0:04.38 ruby1.8
4001 web-app 20 0 172m 61m 1932 S 0 24.2 0:02.72 ruby1.8
3941 root 20 0 164m 57m 1672 S 0 22.5 0:21.44 ruby
3990 web-app 20 0 209m 21m 1696 S 0 8.4 0:18.00 ruby1.8
3950 web-app 20 0 165m 7464 1548 S 0 2.8 0:20.40 ruby1.8
3684 mysql 20 0 224m 6504 2084 S 0 2.5 0:14.34 mysqld
3938 root 20 0 53632 3048 1036 S 1 1.2 0:01.50 starling
3839 root 20 0 243m 1456 1248 S 0 0.6 0:00.34 apache2
3897 www-data 20 0 243m 1452 1072 S 0 0.6 0:00.04 apache2
3894 www-data 20 0 243m 1368 1008 S 0 0.5 0:00.04 apache2
3895 www-data 20 0 243m 1220 960 S 0 0.5 0:00.02 apache2
3888 root 20 0 46520 1204 1100 S 0 0.5 0:02.29 ruby1.8
3866 root 20 0 17648 1184 896 S 0 0.5 0:00.08 bash
3896 www-data 20 0 243m 1180 952 S 0 0.4 0:00.00 apache2
3964 www-data 20 0 243m 1164 956 S 0 0.4 0:00.02 apache2
3892 www-data 20 0 243m 1132 956 S 0 0.4 0:00.00 apache2
3948 www-data 20 0 243m 1132 956 S 0 0.4 0:00.00 apache2
3962 www-data 20 0 243m 1132 956 S 0 0.4 0:00.02 apache2
3963 www-data 20 0 243m 1132 956 S 0 0.4 0:00.00 apache2
3965 www-data 20 0 243m 1080 888 S 0 0.4 0:00.00 apache2
3887 root 20 0 89008 960 796 S 0 0.4 0:00.00 ApplicationPool
Я не уверен, что делать дальше... Я мог бы перейти на более крупный фрагмент, но на данный момент у меня почти нет трафика в этом приложении, поэтому я думаю, что это больше проблема с моей конфигурацией или, возможно, моим кодом?
Любые конкретные рекомендации будут приветствоваться! Спасибо
2 ответа
Похоже, что ваше приложение rails использует всю доступную память. Я бы порекомендовал три вещи:
Обновите память на вашем сервере. 256 МБ не очень много для приложения Rails. Переход к 512 может облегчить вашу проблему. Если это решит проблему, вам нужно будет учесть дополнительные затраты (18 долл. / Мес.) В сравнении с тем, сколько времени потребуется для отслеживания проблем с производительностью.
Профилируйте ваше приложение, чтобы выяснить, какие запросы занимают больше всего памяти. Скорее всего, это будут места, где вы найдете много записей и, возможно, в том числе некоторые связанные таблицы. Есть несколько инструментов, которые помогут вам сузить круг возможных проблем. Я использовал хрю, но есть и другие. Как только вы выясните, где проблемы, вы можете внести некоторые изменения, чтобы попытаться уменьшить использование памяти.
Предполагая, что вы используете Passenger с Apache, вы можете уменьшить количество одновременных запросов в конфигурационном файле Passenger. Это может быть полезно для этого https://serverfault.com/questions/15350/running-ruby-on-rails-app-on-apache-passenger-to-much-memory
Короче говоря, 256 Мбайт жестко для приложения Rails. Вы не дали никаких подробностей о том, как вы используете rails, но я предполагаю, что вы используете Apache с модулем Passenger. Пассажирский модуль может быть настроен на то, сколько экземпляров он продолжает работать. У вас есть 4 экземпляра ruby, запущенных под учетной записью веб-приложения. Я полагаю, это от Пассажира. В конфигурации вы можете ограничить количество экземпляров Passenger. Это уменьшит требования к памяти.
С другой стороны, при работе только с 256 МБ, и когда вы используете только 1 приложение rails, может быть лучше перейти к другой настройке. Установка, которую я использовал раньше, была веб-сервером Nginx и кластером монгрел с 2 монгрелами (на 192 МБ, и приложение предназначалось только для тестирования). По сути, это означает, что в любой момент вы можете обрабатывать 2 (и только 2) запроса рельсов параллельно. Установка может быть немного сложнее, чем Apache+Passenger, но определенно не сложная. Я думаю, что это более производительное решение, когда вы используете 256 МБ.