Производительность Linux Loopback с включенным TCP_NODELAY - PullRequest
15 голосов
/ 29 апреля 2011

Недавно я наткнулся на интересную проблему производительности TCP, выполняя некоторые тесты производительности, которые сравнивали производительность сети с производительностью обратной связи. В моем случае производительность сети превысила производительность обратной связи (сеть 1Gig, та же подсеть). В случае, когда я имею дело, задержки имеют решающее значение, поэтому TCP_NODELAY включен. Лучшая теория, которую мы придумали, заключается в том, что управление перегрузкой TCP задерживает пакеты. Мы провели некоторый анализ пакетов, и мы определенно можем видеть, что пакеты удерживаются, но причина не очевидна. Теперь вопросы ...

1) В каких случаях и почему связь по шлейфу будет медленнее, чем по сети?

2) Почему при отправке максимально быстро, переключение TCP_NODELAY оказывает гораздо большее влияние на максимальную пропускную способность по шлейфу, чем по сети?

3) Как мы можем обнаружить и проанализировать управление перегрузкой TCP как потенциальное объяснение низкой производительности?

4) Есть ли у кого-нибудь другие теории относительно причины этого явления? Если да, есть ли способ доказать теорию?

Вот несколько примеров данных, сгенерированных простым приложением c ++ точка-точка:

Transport     Message Size (bytes)  TCP NoDelay   Send Buffer (bytes)   Sender Host   Receiver Host   Throughput (bytes/sec)  Message Rate (msgs/sec)
TCP           128                   On            16777216              HostA         HostB           118085994                922546
TCP           128                   Off           16777216              HostA         HostB           118072006                922437
TCP           128                   On                4096              HostA         HostB            11097417                 86698
TCP           128                   Off               4096              HostA         HostB            62441935                487827
TCP           128                   On            16777216              HostA         HostA            20606417                160987
TCP           128                   Off           16777216              HostA         HostA           239580949               1871726
TCP           128                   On                4096              HostA         HostA            18053364                141041
TCP           128                   Off               4096              HostA         HostA           214148304               1673033
UnixStream    128                   -             16777216              HostA         HostA            89215454                696995
UnixDatagram  128                   -             16777216              HostA         HostA            41275468                322464
NamedPipe     128                   -             -                     HostA         HostA            73488749                574130

Вот еще несколько полезных сведений:

  • Я вижу эту проблему только с маленьким сообщения
  • HostA и HostB имеют одинаковые комплект аппаратного обеспечения (Xeon X5550@2.67GHz, всего 32 ядра / 128 Gig Mem / 1Gig Nics)
  • ОС RHEL 5.4, ядро ​​2.6.18-164.2.1.el5)

Спасибо

Ответы [ 3 ]

8 голосов
/ 13 мая 2011

1) В каких случаях и почему связь по шлейфу будет медленнее, чем по сети?

Loopback включает вычисление пакета setup + tcp chksum для обоих tx + rxна одной и той же машине, поэтому она должна выполнять вдвое больше обработки, в то время как с двумя машинами вы разделяете tx / rx между ними.Это может оказать негативное влияние на обратную связь.

2) При максимально быстрой отправке почему переключение TCP_NODELAY оказывает гораздо большее влияние на максимальную пропускную способность по сравнению с обратной связью, чем болеесеть?

Не уверен, как вы пришли к такому выводу, но петля против сети реализована очень по-разному, и если вы попытаетесь довести их до предела, вы столкнетесь с различными проблемами.Интерфейсы обратной связи (как упомянуто в ответе на 1) вызывают издержки обработки tx + rx на той же машине.С другой стороны, сетевые адаптеры имеют ряд ограничений по количеству ожидающих пакетов, которые они могут иметь в своих циклических буферах и т. Д., Что приведет к совершенно различным узким местам (и это сильно варьируется от чипа к чипу и даже от коммутатора, который междуих)

3) Как мы можем обнаружить и проанализировать управление перегрузкой TCP как потенциальное объяснение низкой производительности?

Контроль перегрузки включается только в случае потери пакетов,Вы видите потерю пакета?В противном случае вы, вероятно, достигнете пределов размера окна TCP по сравнению с коэффициентами задержки в сети.

4) Есть ли у кого-нибудь другие теории относительно причины этого явления?Если да, есть какой-нибудь способ доказать теорию?

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

Последнее замечание: небольшие сообщениясоздать гораздо больший скачок производительности в вашей сети по разным причинам, например:

  • фиксированные издержки на пакет (для заголовков mac + ip + tcp), и чем меньше полезная нагрузка, тембольше накладных расходов.
  • многие ограничения NIC связаны с числом ожидающих пакетов, что означает, что при использовании пакетов меньшего размера вы столкнетесь с узкими местами NIC с гораздо меньшим количеством данных.
  • сама сеть в виде издержек на пакет, поэтому максимальный объем данных, которые вы можете прокачать по сети, снова зависит от размера пакетов.
1 голос
/ 29 апреля 2011

1 или 2) Я не уверен, зачем вам вообще использовать loopback, лично я не знаю, насколько близко он будет имитировать реальный интерфейс и насколько он будет действительным Я знаю, что Microsoft отключает NAGLE для интерфейса обратной связи (если вам это нужно). Взгляните на эту ссылку , об этом есть обсуждение.

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

0 голосов
/ 30 августа 2013

С той же проблемой я тоже столкнулся. При передаче 2 МБ данных между двумя компонентами, работающими на одном компьютере RHEL6, для его завершения потребовалось 7 секунд. Когда размер данных большой, время не приемлемо. Передача 10 МБ данных заняла 1 минуту.

Тогда я попытался с отключенным TCP_NODELAY. Это решило проблему

Этого не происходит, когда два компонента находятся на двух разных машинах.

...