Я правильно использую ApacheBench?

В Видео контроллере - Показать действие, я попробовал с двумя сценариями. Первый использует increment_counterи пишет в БД напрямую:

Video.increment_counter(:views_count, @video.id)

Второй подход использует save метод.

@video.views_count = @video.views_count + 1
@video.save

В ApacheBench я делаю:

ab -n 100 -c 10 http://127.0.0.1:3000vidoes/18

Идентификатор видео - 18. Я обязательно перезагружаю views_count на каждом пробежке через Video.find(18).update_attribute(:views_count, 18),

После запуска ApacheBench для обоих сценариев, views_count соответствует 100. Я бы вообразил increment_counter быть более точным, чем save метод, так как он пишет в БД напрямую.

Правильно ли я жду?

1 ответ

Решение

Причина, по которой вы получаете правильный ответ обоими методами, заключается в том, что вы на самом деле здесь не тестируете параллелизм. Пока apachebench запускает 10 одновременных запросов, ваш сервер rails одновременно обрабатывает только один из них. Попробуйте воспользоваться одним из следующих способов, чтобы использовать условие гонки во втором сценарии:

  • запустить несколько серверов рельсов и поставить их за балансировщик нагрузки. Вы можете сделать это с пассажиром, или с чем-то вроде thin -s 4 а затем поместить все эти серверы за экземпляром nginx или haproxy.
  • переключиться на использование резьбового раствора, который избегает GIL, например, JRuby или rubinius, работающие под пумой
Другие вопросы по тегам