Мы сражаемся с HAProxy в течение нескольких дней в Amazon EC2; опыт до сих пор был отличным, но мы застряли на сжатии большей производительности из балансировки нагрузки программного обеспечения. Мы не являемся обычным свиданием в сети Linux (обычно мы являемся магазином .NET), но мы до сих пор придерживались своих собственных целей, пытаясь установить правильные ulimits, проверять сообщения ядра и tcpdumps для любых нарушений. Тем не менее, мы достигли плато около 1700 запросов/сек, после чего количество тайм-аутов клиентов было огромным (мы использовали и настраивали httperf для этой цели). Мы с коллегой слушали самый последний подкаст Stack Overflow, в котором основатели Reddit отмечают, что весь их сайт работает с одним HAProxy node и что он пока не стал узким местом. Ack! Либо там как-то не видно, что много одновременных запросов, мы делаем что-то ужасно неправильно, или общий характер EC2 ограничивает сетевой стек экземпляра Ec2 (мы используем большой тип экземпляра). Учитывая тот факт, что и Джоэл, и основатели Reddit согласны с тем, что сеть, вероятно, будет ограничивающим фактором, возможно ли, что ограничение мы видим?
Любые мысли очень ценятся!
Изменить. Похоже, что фактическая проблема не была, по сути, балансировкой нагрузки node! В этом случае виновником на самом деле были узлы, работающие с httperf. Поскольку httperf строит и разрывает сокет для каждого запроса, он тратит на процессор большое количество процессорного времени. Когда мы столкнулись с частотой запросов выше, TCP FIN TTL (по умолчанию 60 с) сохранял сокеты слишком долго, а значение ip_local_port_range было слишком низким для этого сценария использования. В принципе, через несколько минут клиент (httperf) node постоянно создавал и уничтожал новые сокеты, количество неиспользуемых портов заканчивалось, а последующие "запросы" были обнулены на этом этапе, что давало низкие номера запросов/секунд и большое количество ошибок.
Мы также посмотрели nginx, но мы работаем с RighScale, и у них есть сценарии для загрузки для HAProxy. О, и у нас слишком ограниченный срок (конечно), чтобы отключить компоненты, если это не будет абсолютно необходимым. К счастью, находясь на AWS, мы можем тестировать другую установку, используя nginx параллельно (если это оправдано), и сделайте коммутатор на ночь позже.
Эта страница описывает каждую из переменных sysctl достаточно хорошо (в этом случае были настроены параметры ip_local_port_range и tcp_fin_timeout).