Назад | Перейти на главную страницу

много пакетов обрезано и пакеты свернуты из-за низкого / переполнения буфера сокета

Я установил тестовую машину (debian squeeze 2.6.32 на машине linode 2048), которая взаимодействует с api, возвращающим большие куски json. Он вызывает API 3000 в минуту асинхронно, API возвращает полезные данные размером ~ 450 КБ. В коробке также есть http-сервер для отображения результатов звонков.

При выполнении netstat -s (время безотказной работы 20 дней):

 254329 packets pruned from receive queue because of socket buffer overrun
 50678438 packets collapsed in receive queue due to low socket buffer

Мне это показалось неприятным, поэтому я следовал этим руководствам, чтобы настроить параметры TCP:

http://fasterdata.es.net/fasterdata/host-tuning/linux/test-measurement-host-tuning/

и

http://www.acc.umu.se/~maswan/linux-netperf.txt

но, похоже, это не помогает.

Любые советы / учебники / объяснения о буферах сокетов, которые могут помочь понять и решить проблему?

Спасибо

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

Вы говорите, что входящая полезная нагрузка составляет 450 КБ на запрос. Это в килограммах биты или килограмм байты? Большинство инструментов измеряют размер в байтах, но я сделаю оба вычисления.

Предполагая килобиты:

  • 3000 запросов в минуту = 50 запросов в секунду
  • 50 * 450 кбит = 22 500 кбит / с = приблизительно 22 Мбит / с

В килобайтах это примерно 176 Мбит / с.

Если это килобайты, вы не сможете постоянно делать это на большинстве серверов VPS. На каждом сервере будет не менее 10-20 VPS. Linode использует два гигабитных связанных подключения к каждому серверу. Это означает, что ваша «справедливая доля» на полных серверах будет в лучшем случае около 100 Мбит / с.

Даже если это килобит, 22 Мбит - это достаточно для большинства VPS.

Выполняя так много запросов так быстро, вы, вероятно, делаете эквивалент DOS на вашем собственном сервере. Проверка фактического входящего сетевого трафика должна дать вам представление о том, сколько вы фактически используете. Если вам нужны реальные скорости 100 Мбит или даже гигабит, вам может потребоваться выделенный сервер. В противном случае вам нужно замедлить запросы, пока они не замедлятся настолько, чтобы сервер мог их обработать.

Вам также необходимо проверить использование памяти и процессора. Если какой-либо из них будет исчерпан, ваш сервер начнет отбрасывать пакеты, потому что у него просто нет ресурсов для их обработки. Начните с просмотра сверху и ntop, чтобы некоторое время наблюдать за использованием вашего процессора, памяти и сети.

Переполнение буфера сокета означает, что данные не помещаются в специальный буфер памяти, назначенный для каждого соединения. Все данные, поступающие из сетевого интерфейса, помещаются в такой буфер, и ваше приложение читает из него. Как только приложение прочитало данные - они удаляются из этого буфера. В основном вы должны ожидать, что приложение будет читать данные, как только они станут доступны, и приложение может обрабатывать данные. Но если вам не хватает производительности - загружен ли процессор или приложение заблокировано (что довольно часто бывает с nodejs) - данные продолжают поступать, но размера буфера недостаточно, чтобы справиться со всем этим.

Даже если у вас огромные буферы - они все равно будут сокращены, а данные отброшены, если ваше приложение не может обработать все вовремя. Поэтому я предлагаю вам сначала настроить производительность приложения.