Мы интенсивно используем многоадресный обмен сообщениями между многими серверами Linux в локальной сети. Мы видим много задержек. В основном мы отправляем огромное количество мелких посылок. Нас больше волнует задержка, чем пропускная способность. Машины все современные, многоядерные (минимум четыре, обычно восемь, 16, если считать гиперпоточность) машины, всегда с нагрузкой 2.0 или меньше, обычно с нагрузкой меньше 1.0. Сетевое оборудование также загружено менее чем на 50%.
Задержки, которые мы видим, выглядят как задержки в очереди: пакеты быстро начинают увеличиваться в задержке, пока не станет казаться, что они застревают, а затем возвращаются в нормальное состояние.
Структура обмена сообщениями в основном такова: в «потоке отправки» извлекайте сообщения из очереди, добавляйте метку времени (используя gettimeofday()
), затем вызывайте send()
. Программа-получатель получает сообщение, отмечает время получения и помещает его в очередь. В отдельном потоке обрабатывается очередь, анализируя разницу между отправкой и получением временных меток. (Обратите внимание, что наши внутренние очереди не являются частью проблемы, поскольку метки времени добавляются вне нашей внутренней очереди.)
Мы действительно не знаем, с чего начать искать ответ на эту проблему. Мы не знакомы с внутренностями Linux. Мы подозреваем, что ядро ставит в очередь или буферизует пакеты либо на стороне отправки, либо на стороне приема (или на обеих сторонах). Но мы не знаем, как это отследить и проследить.
Мы используем CentOS 4.x (ядро RHEL 2.6.9).