Я установил тестовую машину (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 КБ на запрос. Это в килограммах биты или килограмм байты? Большинство инструментов измеряют размер в байтах, но я сделаю оба вычисления.
Предполагая килобиты:
В килобайтах это примерно 176 Мбит / с.
Если это килобайты, вы не сможете постоянно делать это на большинстве серверов VPS. На каждом сервере будет не менее 10-20 VPS. Linode использует два гигабитных связанных подключения к каждому серверу. Это означает, что ваша «справедливая доля» на полных серверах будет в лучшем случае около 100 Мбит / с.
Даже если это килобит, 22 Мбит - это достаточно для большинства VPS.
Выполняя так много запросов так быстро, вы, вероятно, делаете эквивалент DOS на вашем собственном сервере. Проверка фактического входящего сетевого трафика должна дать вам представление о том, сколько вы фактически используете. Если вам нужны реальные скорости 100 Мбит или даже гигабит, вам может потребоваться выделенный сервер. В противном случае вам нужно замедлить запросы, пока они не замедлятся настолько, чтобы сервер мог их обработать.
Вам также необходимо проверить использование памяти и процессора. Если какой-либо из них будет исчерпан, ваш сервер начнет отбрасывать пакеты, потому что у него просто нет ресурсов для их обработки. Начните с просмотра сверху и ntop, чтобы некоторое время наблюдать за использованием вашего процессора, памяти и сети.
Переполнение буфера сокета означает, что данные не помещаются в специальный буфер памяти, назначенный для каждого соединения. Все данные, поступающие из сетевого интерфейса, помещаются в такой буфер, и ваше приложение читает из него. Как только приложение прочитало данные - они удаляются из этого буфера. В основном вы должны ожидать, что приложение будет читать данные, как только они станут доступны, и приложение может обрабатывать данные. Но если вам не хватает производительности - загружен ли процессор или приложение заблокировано (что довольно часто бывает с nodejs) - данные продолжают поступать, но размера буфера недостаточно, чтобы справиться со всем этим.
Даже если у вас огромные буферы - они все равно будут сокращены, а данные отброшены, если ваше приложение не может обработать все вовремя. Поэтому я предлагаю вам сначала настроить производительность приложения.