Я создаю аналитический пакет, и требования проекта указывают, что мне нужно поддерживать 1 миллиард обращений в день. Да, "миллиард". Другими словами, выдерживается не менее 12 000 ударов в секунду, и желательно некоторое пространство для взрыва. Я знаю, что для этого мне понадобится несколько серверов, но я пытаюсь получить максимальную производительность от каждого узла, прежде чем «использовать больше оборудования».
Прямо сейчас у меня завершена часть отслеживания хитов, и она хорошо оптимизирована. Я просто сохраняю запросы прямо в Redis (для последующей обработки с помощью Hadoop). Приложение Python / Django с оружейным рулем для шлюза.
Мой 2-гигабайтный сервер Ubuntu 10.04 Rackspace (не производственный компьютер) может обслуживать около 1200 статических файлов в секунду (для сравнения используется Apache AB с одним статическим ресурсом). Для сравнения, если я заменяю ссылку на статический файл ссылкой на трекинг, я все равно получаю около 600 запросов в секунду - я думаю, это означает, что мой трекер хорошо оптимизирован, потому что он только в 2 раза медленнее, чем обслуживает тот же статический ресурс несколько раз.
Однако, когда я сравниваю с миллионами хитов, я замечаю несколько вещей:
- Нет использования диска - это ожидается, потому что я отключил все журналы Nginx, и мой пользовательский код ничего не делает, кроме сохранения деталей запроса в Redis.
- Непостоянное использование памяти - предположительно из-за управления памятью в Redis, мое использование памяти будет постепенно увеличиваться, а затем уменьшаться, но это никогда не было моим узким местом.
- Загрузка системы колеблется около 2-4, система все еще реагирует даже на самые тяжелые тесты, и я все еще могу вручную просматривать http://mysite.com/tracking/pixel с небольшой видимой задержкой, в то время как мой (другой) сервер выполняет 600 запросов в второй.
- Если я запускаю короткий тест, скажем, 50 000 обращений (занимает около 2 м), я получаю стабильные, надежные 600 запросов в секунду. Если я проведу более длительный тест (до сих пор пробовал до 3,5 м), мой р / с ухудшится примерно до 250.
Мои вопросы --
а. Похоже, я уже исчерпал этот сервер? Сопоставима ли производительность nginx со статическими файлами 1200 / с с другими?
б. Существуют ли общие настройки nginx для таких приложений большого объема? У меня для рабочих потоков установлено значение 64, а для рабочих потоков gunicorn установлено значение 8, но изменение этих значений, похоже, не помогает или не вредит мне.
с. Существуют ли какие-либо настройки уровня linux, которые могут ограничивать мои входящие соединения?
д. Что может привести к снижению производительности до 250 об / с при длительных тестах? Опять же, во время этих тестов память не исчерпывается, и использование жесткого диска равно нулю.
Заранее спасибо всем :)
РЕДАКТИРОВАТЬ Вот мой конфиг nginx - http://pastie.org/1450749 - это в основном ваниль, с явно обрезанным жиром.