Я ошибочно предположил, что мое внутреннее AB-тестирование означает, что мой сервер может обрабатывать 1 тыс. Одновременных запросов при 3 тыс. Обращений в секунду.
На данный момент моя теория заключается в том, что сеть является узким местом. Сервер не может отправить достаточно данных достаточно быстро.
Внешнее тестирование от blitz.io при 1k параллелизма показывает, что мои совпадения в секунду ограничиваются 180, при этом страницы все дольше и дольше отвечают, поскольку сервер может возвращать только 180 в секунду.
Я обработал пустой файл из nginx и протестировал его: он масштабируется 1: 1 с параллелизмом.
Теперь, чтобы исключить узкие места ввода-вывода / memcached (nginx обычно извлекает из memcached), я обслуживаю статическую версию кешированной страницы из файловой системы.
Результаты очень похожи на результаты моего первоначального теста; Я ограничен примерно 180 RPS.
Разделение HTML-страницы пополам дает мне вдвое больше запросов в секунду, так что это определенно ограничивается размером страницы.
Если я использую ApacheBench с локального сервера, я получаю стабильные результаты около 4k запросов в секунду как на полной странице, так и на половине страницы при высокой скорости передачи. Скорость передачи: 62586,14 [Кбайт / сек] получено
Если я делаю AB с внешнего сервера, я получаю около 180 RPS - так же, как и результаты blitz.io.
Как я узнаю, что это не преднамеренное дросселирование?
Если я тестирую с нескольких внешних серверов, все результаты становятся плохими, что заставляет меня думать, что проблема заключается в исходящем трафике МОИХ серверов, а не в скорости загрузки моих тестовых серверов / blitz.io.
Итак, я вернулся к своему выводу, что мой сервер не может отправлять данные достаточно быстро.
Я прав? Есть ли другие способы интерпретировать эти данные? Есть ли решение / оптимизация для настройки нескольких серверов + балансировка нагрузки, каждый из которых может обслуживать 180 обращений в секунду?
Я новичок в оптимизации серверов, поэтому был бы признателен за любое подтверждение интерпретации этих данных.
Исходящий трафик
Вот дополнительная информация об исходящей пропускной способности: На сетевом графике показана максимальная скорость 16 Мбит / с: 16 мегабит в секунду. Похоже, совсем немного.
Из-за предложения о дросселировании я изучил это и обнаружил, что у linode ограничение на 50 Мбит / с (что, по-видимому, я даже близко не достигну). Я поднял его до 100 Мбит / с.
Поскольку линод ограничивает мой трафик, а я даже не попадаю в него, означает ли это, что мой сервер действительно должен обеспечивать скорость вывода до 100 Мбит / с, но ограничен каким-то другим внутренним узким местом? Я просто не понимаю, как работают сети в таком большом масштабе; Могут ли они буквально посылать данные так быстро, как они могут читать с жесткого диска? Сетевая труба который большой?
1: Основываясь на вышеизложенном, я думаю, что я определенно могу поднять свои 180RPS, добавив балансировщик нагрузки nginx поверх установки с несколькими серверами nginx со скоростью точно 180RPS на сервер за LB.
2: Если у linode есть предел 50/100 Мбит, который я вообще не использую, должно быть что-то, что я могу сделать, чтобы достичь этого предела с моей настройкой одного сервера. Если я могу читать / передавать данные достаточно быстро локально, а linode даже не хочет иметь ограничение в 50/100 Мбит / с, должно быть внутреннее узкое место, которое не позволяет мне попасть в эти ограничения, которые я не знаю, как обнаружить. Верный?
Я понимаю, что вопрос сейчас огромный и расплывчатый, но не знаю, как его выразить. Любой вклад в любой сделанный мной вывод приветствуется.
Проблема заключалась в том, что я предполагал, что пики графика linode.com были истинными пиками. Оказывается, на графике используются средние значения данных за 5 минут, поэтому мой пик оказался равным 24 Мбит, тогда как на самом деле я достиг ограничения в 50 Мбит.
Теперь, когда они увеличили его до 100 Мбит, мои тесты немедленно поднялись до нового ограничения исходящего трафика.
Если бы я только заметил это раньше! Многие мои рассуждения основывались на идее, что я не достиг предела исходящего трафика из-за этого графика.
Теперь мой пик составляет 370 запросов в секунду, что составляет примерно 100 Мбит / с, после чего я начинаю получать «невыполненные» запросы, и время отклика начинает расти.
Теперь я могу увеличить максимальный параллелизм, уменьшив страницу; с включенным gzip я получаю 600 об / с.
Я все еще сталкиваюсь с проблемами, когда внезапно достигаю пика, и невыполненные запросы (ограниченные пропускной способностью) начинают накапливаться, но это звучит как другой вопрос.
Это был отличный урок по оптимизации / чтению этих данных / сокращению возможных проблем. Большое спасибо за ваш вклад!
Немного поздно, когда вы это поняли ... но, возможно, вам стоит время от времени читать блог ServerFault.
Я думаю именно об этом посте, где они обсуждают, почему секундочку интервал опроса время от времени не сокращается, что связано с проблемой, очень похожей на ту, что была у вас ..
Мы обнаружили, что довольно часто отбрасываем пакеты на интерфейсах со скоростью 1 Гбит / с со скоростью всего 10-30 Мбит / с, что снижает нашу производительность. Это связано с тем, что скорость 10-30 Мбит / с на самом деле представляет собой количество битов, передаваемых за 5 минут, преобразованное в скорость в одну секунду. Когда мы ближе познакомились с Wireshark и использовали графическое отображение ввода-вывода за одну миллисекунду, мы увидели, что мы часто взрываем скорость 1 Мбит на миллисекунду так называемых интерфейсов 1 Гбит / с.
Конечно заставило меня задуматься. И я просто знаю, что при первой же возможности убиваю тот один из других SA в моем магазине, и когда мы решим эту проблему, он будет выглядеть невероятно блестяще и проницательно.
Кто знает, возможно, я даже открою некоторые из них в секрете. :)
Это может быть ограничено сетью, но не обязательно просто вопросом пропускной способности. Задержка вашего удаленного тестового модуля будет влиять на количество подключений, ожидающих в любой момент времени (ожидание подтверждений 50 мс сильно отличается от 0,5 мс локально), а также на согласование и стабилизацию размеров окна по мере развития соединения. Вы также, вероятно, подвержены некоторой потере пакетов - либо из-за перегрузки, либо из-за механизма ограничения пропускной способности со стороны вашего оператора (или вышестоящих).
Я бы предложил исключить как можно больше из уравнения, чтобы нарисовать разумную базовую линию. Измерьте пиковую пропускную способность, задержку и потерю пакетов от вашего сервера до нескольких точек в обычном Интернете. Как бы маловероятно это ни звучало, попробуйте выполнить поиск по запросу «Тест трафика VoIP» или аналогичному. У нескольких поставщиков услуг VOIP есть приложения, которые могут измерять такие типы шаблонов (двунаправленно) с достаточной степенью точности. Как только у вас появятся достоверные эмпирические данные о фактической полезной скорости вашей ссылки, ваши результаты вполне могут быть подтверждены.
В дополнение к тестам пропускной способности также может быть полезно взглянуть на захват пакетов некачественного веб-трафика для поиска чрезмерного количества повторных передач, а также для измерения очевидного времени, которое ваш сервер берет на ответ на запросы (... если это значение существенно увеличивается в зависимости от количества подключений, это большая подсказка).