Поддерживать или не поддерживать

Моя компания запускает новый веб-сайт с потенциально большими волнами посетителей в очень коротких окнах (оценка составляет около 14 тыс. Посетителей за 2 минуты).

Итак, я проверяю нашу конфигурацию, и сейчас моей самой большой проблемой является наш HTTP-интерфейс с одним узлом, который использует keep-alive. Интерфейс работает под управлением lighttpd 1.4 на CentOS 5.4.

Некоторые предположения:

  • браузер обычно открывает 6 параллельных TCP-соединений для поддержания активности
  • браузер будет держать соединение открытым, пока не истечет тайм-аут, даже если вкладка закрыта (наблюдается в FF, может не соответствовать действительности для каждого браузера)
  • на стороне сервера каждое соединение будет потреблять ~150 КБ памяти в ядре (я использую conntrack и хочу сохранить его, это правильная оценка?)
  • Все наши серверы размещены на восточном побережье. RTT с сервера в Лас-Вегасе составляет около 80 мс.
  • Домашняя страница с keep-alive использует ~25 TCP-соединений и 1500 пакетов. Без поддержки активности это число возрастает до ~210 соединений TCP и более 3200 пакетов.

Итак, 6*14000 = 84 000 TCP-соединений. 84 000 * 150 КБ ~= 12 ГБ памяти. Вот проблема: 1. У меня нет такого объема памяти, доступного на внешнем интерфейсе. 2. lighttpd 1.4 не очень удобен для управления таким количеством подключений. это больно ударил / много.

Но с другой стороны, меня беспокоит 80 мс RTT, если я деактивирую keepalive.

Я собираюсь смягчить некоторые из этих проблем с CDN и вторичной записью www со вторичным lighttpd. но дебаты касаются функции поддержания жизни. Я хотел бы отключить его, но я боюсь, что влияние на время открытия страницы будет высоким (высокий RTT и удвоение количества пакетов).

После завершения поиска контента у нас есть много запросов Ajax для просмотра сайта, которые обычно вписываются в одно соединение TCP. Но я не уверен, что браузер освободит другие соединения и просто оставит их открытыми.

Я знаю, что было много дискуссий о поддержании жизни, потребляющих много ресурсов. Я с этим согласен, но, учитывая предположения и ситуацию (RTT между 80 мс и 100 мс для половины наших пользователей), как вы думаете, разумно ли это деактивировать?

В качестве побочного вопроса: знаете ли вы, где я могу найти информацию о размере соединения и размере conntrack в ядре? (кроме printf size_of (sk_buff)).

--- edit: некоторые результаты теста Я настроил conntrack на прием 500 тыс. соединений (учитывая объем памяти, который не должен превышать 200 МБ) и запуска тест ab.

ab -n 20000 -c 20000 -k http://website.com/banner.jpg

Из того, что я видел в tcpdump, ab устанавливает все соединения перед выполнением GET. Таким образом, я получаю представление о том, сколько памяти потребляется этими 20k-соединениями.

плита возвращается

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 40586  40586 100%    0.30K   3122       13     12488K ip_conntrack

и верх

 PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP CODE DATA COMMAND
 15   0  862m 786m  780 S 22.9  3.3   1:44.86  76m  172 786m lighttpd

12 МБ для ip_conntrack и 786 МБ для lighttpd в порядке для моей установки. Я могу легко справиться с этим в 4 раза.

Таким образом, keepalive, то есть, время ожидания простоя установлено на 5 секунд.

2 ответа

Решение

Почему бы не установить тайм-аут keepalive, скажем, 15 секунд? Не вижу смысла держать каждое соединение в течение 2 минут. И я не думаю, что браузер будет поддерживать соединение в течение 2 минут по этой ссылке: http://en.wikipedia.org/wiki/HTTP_persistent_connection, время ожидания в 1 минуту кажется более реалистичным.

Я бы посоветовал для очень низких (1 с) тайм-аутов поддержки.

если вы выполнили основную работу над обработкой на стороне клиента (правильное упорядочение JS / CSS, JS снизу или асинхронный...), вы можете установить минимальный уровень поддержки активности (1 с), потому что не будет большой задержки между 2 повторными использованиями ваших соединений TCP.

Если вы сомневаетесь, проверьте свою страницу на 5 и 1 (просмотр соединения), и вы увидите, не нарушает ли это повторное использование ваших соединений TCP.

Я попытался получить его до 0 в интерфейсе Apache, и это определенно слишком мало, но 1 в хорошем

Другие вопросы по тегам