Я разработал небольшое приложение на Rails, используя Rails 3.0.0 и Ruby 1.9.2. Во время тестирования на моем персональном компьютере все в порядке. Я ставлю его на свой VPS для производства, используя Apache и mod_rails, и иногда производительность ужасна.
Вот пример из файла production.log:
Запущен GET "/ tracker" для XX.XX.XX.XX в 2010-11-21 21:49:56 -0500
Обработка FleetsController # index как HTML
Визуализированные макеты / _stylesheets.html.haml (0,8 мс)
Визуализированные макеты / _header.html.haml (1,0 мс)
Визуализированные макеты / _footer.html.haml (0.0ms)
Отображаемые страницы / about.html.haml в макетах / приложениях (4,5 мс)
Завершено 200 OK за 15 мс (Просмотров: 14,3 мс | ActiveRecord: 0,0 мс)
Запущен GET "/ tracker /" для XX.XX.XX.XX 2010-11-21 21:50:02 -0500
Обработка FleetsController # index как HTML
Визуализированные макеты / _stylesheets.html.haml (0,7 мс)
Визуализированные макеты / _header.html.haml (1.1ms)
Визуализированные макеты / _footer.html.haml (0.0ms)
Отображается fleets / index.html.haml в макетах / приложении (7,8 мс)
Завершено 200 OK за 1901мс (Просмотры: 7,8мс | ActiveRecord: 1,5мс)
Запущен GET "/ tracker / fleets / XXXXXXXXX" для XX.XX.XX.XX в 2010-11-21 21:50:06 -0500
Обработка выполняется FleetsController # как HTML
Параметры: {"id" => "XXXXXXXXX"}
Рендеринг флотов / _details_inner.html.haml (1,2 мс)
Рендеринг флотов / _details.html.haml (2,1 мс)
Рендеринг флотов / _summary.html.haml (3,5 мс)
Рендеринг флотов / _scouts_inner.html.haml (1,3 мс)
Рендеринг флотов / _scouts.html.haml (3,5 мс)
Предоставленные отчеты / _report.html.haml (0,5 мс)
Рендеринг флотов / _reports.html.haml (3,0 мс)
Рендеринг флотов / _recon_form.html.haml (39,9 мс)
Рендеринг флотов / _recon.html.haml (40,8 мс)
Rendered users / _user.html.haml (1.2ms)
Рендеринг флотов / _pilots.html.haml (1,9 мс)
Визуализированные макеты / _stylesheets.html.haml (0,5 мс)
Визуализированные макеты / _header.html.haml (0,9 мс)
Визуализированные макеты / _footer.html.haml (0.0ms)
Отображение флотов / show.html.haml в макетах / приложениях (60,2 мс)
Завершено 200 OK за 495 мс (Просмотров: 59,1 мс | ActiveRecord: 2,9 мс)
Первый удар не имел доступа к базе данных. Второй действительно имеет доступ к базе данных, но для создания просмотра потребовалось всего 7,8 мс, а для базы данных - всего 1,5 мс, хотя вся страница не была заполнена почти 2 минуты! Это довольно распространенный пример, но у меня есть несколько записей в журнале с 14+ секундами для ответа страницы. И нет, это не во время начальной загрузки рельсов после перезагрузки.
Что могло бы занять это время?
1) Я неверно истолковал отчеты о времени ActiveRecord, и это на самом деле просто кодовое время, но куда идет время в базе данных в реальном времени?
2) Я использую sqlite. Я знаю, что в конце концов мне, вероятно, придется переключиться на MySQL, так как у меня будут проблемы с параллелизмом, поскольку (большинство) при каждом попадании на страницу происходит запись в базу данных. Но сейчас у меня почти нет движения; максимум 15 человек на сайте одновременно. В приведенном выше примере журнала было только 1 попадание за раз, по 4-6 секунд между каждым попаданием. Я думаю, что sqlite справится с этим ...
3) У меня общий VPS. Это означает, что, возможно, какой-то другой пользователь на VPS делал что-то в то же время, что приводило к замедлению работы сервера. В большинстве случаев мой VPS имеет очень низкую нагрузку на процессор, но возможно мне не повезло, и в тот момент что-то происходило. Но я видел, как это происходит достаточно часто, и я не покупаю это как ответ.
4) VPS имеет только 512 + 512 МБ памяти. Я показываю, что есть 150 МБ свободного места, но возможно ли, что я просто превышаю ограничения памяти, и это перестановка страниц или что-то в этом роде?
5) Я также видел несколько исключений BusyException в журнале.Я увеличил тайм-аут database.yml до 15 секунд (с 5), чтобы посмотреть, поможет ли это.С тех пор я не провела настоящий тест, чтобы увидеть, прошел ли он.
Я знаю, что, возможно, я не предоставил достаточно информации, чтобы вы могли на самом деле сказать мне, что происходит, поэтому реальный вопрос в том, как мненачать пытаться отследить это?