Я правильно использую 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, работающие под пумой