Проблема производительности Ruby и rails, сервер - PullRequest
0 голосов
/ 16 марта 2011

Я использую развернутый веб-сервер rails и испытываю проблемы с памятью. Я получаю ошибку Errno :: ENOMEM каждый раз, когда пытаюсь вызвать sendmail. Когда я запускаю top на моем сервере, он показывает мне, что запущено 2 процесса ruby1.8, каждый перерабатывает около 40% памяти. Это вызвано утечкой в ​​моем коде или я запустил два одновременных процесса ruby?

Оба процесса выполняются моей учетной записью развертывателя, и после этого они вызываются, когда я отправляю в производственный репозиторий git (используя pushand). Я пытаюсь выяснить, является ли это естественным (т. Е. Сервер должен быть обновлен) или у меня есть какая-то ошибка в моей настройке. Недавно я увеличил объем ОЗУ с 256 до 512 МБ, и раньше у меня не было этой проблемы.

Проблема в том, что посетители не могут создать пользователя, поскольку приложение выдает ошибку, когда им нужно получить электронное письмо для активации.

Обратите внимание, что я использую rails 2.1.0 на Ubuntu, с apache и passenger.

1 Ответ

2 голосов
/ 16 марта 2011

Хорошо, ребята, я думаю, это был один из случаев, когда мне приходилось помогать себе, и я на самом деле очень рад, что помог.Я не использовал ни одного из инструментов, с которыми я связан.

Я вошел на свой сервер через.ssh и запустили две команды в двух окнах: top и tail -f /var/www/mysite.com/log/production.log.

Я посмотрел в файле журнала в реальном времени и заметил запрос страницы, который занялдолгое время загрузки - страница, на которой пользователь может показывать свои изображения, где каждый пользователь идентифицируется по имени через.acts_as_taggable_on.Это единственный запрос занял 6 секунд.

И он продолжал появляться.Я думаю, что видел это 6 или 7 раз, и я решил исследовать это далее.Это всегда был один и тот же идентификатор пользователя, поэтому я решил найти пользователя.Оказывается, у пользователя было пустое имя, "", и помеченные изображения найдены по

Asset.tagged_with(@user.name, :on => "users")

. Теперь в моем приложении есть десятки тысяч активов, и Asset.tagged_with ("",: on => "users") вернет ВСЕХ из них, что приведет к поглощению моей памяти.

Теперь я обработал случай, когда у пользователя есть пустое имя, и оно требуется для всех новых пользователей.,Хотя никто не помог, я все еще чувствую некоторую благодарность за стекопоток, потому что иногда это так же просто, как задавать вопросы для решения проблемы.

...