Плохая производительность с Rack::Cache
Rack::Cache настроен как самое верхнее (последнее) промежуточное ПО в моем стеке. Мое приложение размещено на кедре heroku, поэтому Rack::Cache также отвечает за статические ресурсы.
Он поддерживается продуктом heroku memcached и настроен так:
config.action_dispatch.rack_cache = {
:metastore => Dalli::Client.new,
:entitystore => 'file:tmp/cache/rack/body',
:allow_reload => false
}
config.static_cache_control = "public, max-age=2592000"
Это работает на худой.
Я тестирую производительность на файле изображения, используя ab.
ab -n100 -c10 https://example.com/foo.jpg
Просматривая в моих логах, все запросы являются попаданием в кеш ("свежий"). Но производительность низкая, всего около 6 запросов / сек. Я знаю, что Rack::Cache не будет работать так же хорошо, как выделенный http-прокси, но я, конечно, ожидал более высокую пропускную способность, чем эта.
Обновление Я не знаю, как, черт возьми, я не думал об этом раньше, но мой тест действительно увеличивает мой интернет-соединение. Если я проведу такой же тест с robots.txt вместо jpg, я получу 20 запросов в секунду (и все равно максимально в нисходящем направлении).
1 ответ
Я заметил, что URL в вашем посте HTTPS. У меня была проблема со стеком кедра с SSL на основе имени хоста, когда определенные запросы (как для статических ресурсов, так и для других) имели бы высокую задержку, даже если в журналах указывалось, что время очереди было 0 мс, а время обслуживания - 5-10 мс. Вот ответ службы поддержки Heroku (он не упоминает, что лак не кэширует ресурсы, поступающие из приложений кедра, независимо от того, присутствует ли он в стеке при запуске SSL на основе имени хоста):
Мы не совсем уверены, что является причиной этого, но мы подозреваем, что виноват Лак. Обычно, со стеком Cedar, Varnish нет. Но когда используется надстройка имени хоста SSL, Varnish добавляется обратно в процесс ответа. Нет необходимости использовать Rack::Cache и Varnish.
Я хотел бы предложить удалить Varnish с картинки, чтобы посмотреть, поможет ли это. Способ сделать это - переместить SSL в нашу новую надстройку SSL, Конечная точка SSL. Конечная точка SSL технически все еще находится в стадии бета-тестирования, но она скоро станет общедоступной и будет стоить столько же, сколько имя хоста SSL. Это будущее SSL на Heroku, и оно лучше во всех отношениях.
http://devcenter.heroku.com/articles/ssl-endpoint-beta2
пользователь: бета проход: ****Недостатком переезда является необходимость обновления DNS, но как только это будет сделано, Varnish исчезнет, и мы сможем лучше понять, является ли это проблемой.
Мы также рассмотрели возможность того, что ваша текущая конечная точка SSL, Amazon ELB, неработоспособна и требует замены. Но если бы это было так, многие запросы были бы медленными или ошибочными, а не просто случайным одиночным медленным запросом. Замена текущего ELB также повлекла бы за собой изменение DNS. Переход на новую надстройку "Конечная точка SSL" в будущем упростит ситуацию, подобную этой, - если замена ELB необходима, изменение DNS не потребуется.
Сейчас я думаю, что переход на конечную точку SSL будет лучшим.
Конечно, время ожидания, которое я видел, иногда доходило до 30-60 ВТОРОГО диапазона, что, очевидно, немного хуже, чем вы видите. Когда я запускаю одни и те же команды apache bench для статических ресурсов в некоторых из моих приложений (HTTPS) для кедра, я не чувствую себя намного лучше (10–15 запросов / с). Когда я увеличиваю параллелизм до 50 или 100, число запросов в секунду возрастает до 30. Однако в приложениях HTTPS из бамбукового фронта Varnish я могу увеличить его до 50 запросов / с для статического ресурса. Если бы мой компьютер мог обрабатывать более высокий параллелизм, я подозреваю, что он пошел бы еще выше. И у меня интернет-соединение с высокой задержкой, так как оно в сотовой сети.