2012-06-03 3 views
29

Я разрабатываю прокси-сервер TCP, который должен быть поставлен перед службой TCP, которая должна обрабатывать от 500 до 1000 активных соединений из дикого Интернета.Насколько медленны сокеты TCP по сравнению с именованными каналами в Windows для localhost IPC?

Прокси-сервер работает на той же машине, что и сервис, и в основном прозрачен. Служба по большей части не знает прокси-сервера, единственным исключением является уведомление о реальном удаленном IP-адресе клиентов.

Это означает, что для каждого входящего открытого TCP-сокета на сервере есть еще два сокета: вторая из пары в прокси-сервере, а вторая - для реальной службы за прокси-сервером.

Размеры окна отправки и получения в двух прокси-сокетах установлены на 1024 байта.

Каковы последствия этого для производительности? Насколько медленно эта конфигурация? Должен ли я приложить некоторые усилия для изменения службы для использования Named Pipes (или другого механизма IPC) или локального TCP-сокета в большинстве случаев является эффективным IPC?

Объединение двух приложений не является вариантом. Прямо сейчас мы застряли в двух конфигурациях процесса.

EDIT: Причина наличия двух отдельных процессов на одном и том же оборудовании - это 100% экономичность. У нас только один сервер, и мы не планируем получать больше (без денег).

Служба TCP - это устаревшее программное обеспечение на Visual Basic 6, которое выходит за рамки наших ожиданий. Прокси-сервер - это C++. У нас нет времени, денег и трудозатрат, чтобы переписать и перенести код VB6 в современную среду программирования.

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

Прокси-сервер с открытым кодом, and here is the project source code.

+3

TCP-соединение внутри хоста будет реализовано максимально эффективно (прочитайте: как двунаправленный локальный канал или что-то подобное этому) в любом современном сетевом стеке, который стоит его соли, поэтому я был бы удивлен (и немного разочарован в Microsoft), если была заметная разница в производительности между TCP и Named Pipes для этого варианта использования. –

+1

@JeremyFriesner Я согласен с вами, я бы хотел предположить, что это так на «Windows Server 2008». – vz0

ответ

1

http://msdn.microsoft.com/en-us/library/aa178138(v=sql.80).aspx

Позвольте мне подвести итог для вас. Если вас беспокоит производительность, используйте TCP/IP. Но если у вас действительно быстрая сеть, и вы не беспокоитесь о производительности, то Named Pipes будут «аккуратны», поскольку могут сэкономить вам некоторый код.

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

Приветствия,

+1

Спасибо. Однако в этой статье рассказывается о Sockets vs. Named Pipes по сети для IPC на разных машинах. Мои программы никогда не будут запускаться и не разговаривать друг с другом на отдельном оборудовании. – vz0

+0

Более подходящее подведение итогов связанной статьи MSDN выделит этот раздел: «Если серверное приложение выполняется локально на компьютере, на котором запущен экземпляр Microsoft® SQL Server 2000, локальный протокол Named Pipes является опцией. трубы работают в режиме ядра и очень быстрые ». Именованные каналы быстрее, чем TCP/IP для IPC на одном компьютере. –

+1

Отредактированный вопрос. – vz0

0

Какова причина иметь прокси на одной машине, просто любопытным?

В любом случае:

Есть несколько методов IPC, TCP/IP, именованные каналы сравнимы по скорости и сложности. Если вы действительно хотите что-то хорошо масштабируемое и почти не накладные расходы: используйте общую память. Лучше всего использовать в сочетании с алгоритмом блокировки для продвижения указателей (или использовать один буфер для каждого считывателя (прокси/сервис) и записи (служба/прокси)).

+1

У нас только один сервер, мы не можем запускать программы на разных машинах. – vz0

+1

@ vz0: Это цифры .. ну.Что говорит Дэн: если вы используете TCP/IP для IPC, вы также можете пересечь границы машины позже, когда это необходимо; иначе общий mem является самым быстрым. –

+1

Отредактированный вопрос. – vz0

1

В описанном вами сценарии локальные TCP-соединения вряд ли будут узким местом. Конечно, это приведет к некоторым накладным расходам, но это должно быть незначительным, если ваш процессор уже не работает.

При условии, что использование ЦП вашего сервера обычно составляет менее 50% (с прокси-сервером на месте), не стоит беспокоиться о минимизации служебных данных, связанных с локальными соединениями TCP.

Если использование ЦП регулярно превышает 80%, вы, вероятно, должны выполнять профилирование. Я бы начал с сравнения загрузки процессора (или, что еще лучше, производительности, если вы можете измерить его), когда прокси-сервер находится на месте, когда это не так. Если прокси-сервер не выполняет сложную обработку, накладные расходы, связанные с дополнительными TCP-соединениями, вероятно, составляют значительную долю общих накладных расходов, введенных прокси-сервером, поэтому это должно дать вам, по крайней мере, оценку порядка, d, используя более эффективную форму IPC.

29

Он будет таким же (или, по крайней мере, не отличается). Winsock достаточно умен, чтобы узнать, разговаривает ли он с сокетом на одном и том же хосте, и в этом случае он будет коротко закоротить почти все ниже IP и скопировать данные непосредственно из буфера в буфер. Что касается именованных каналов против сокетов, если вам нужно потенциально иметь возможность общаться на разных компьютерах в будущем, выберите сокеты. Если вы знаете, что вам никогда не понадобится это делать, выберите тот, который ваши разработчики наиболее знакомы или наиболее удобны.

+3

Уверен? Есть ли у вас какие-либо ссылки? Я полагаю, что соединения loopback, как ожидается, будут проходить через сетевой интерфейс и проходить через сетевой стек. Таким образом, они могут быть подчинены правилам фильтрации брандмауэра. То есть, если пакет SYN приходит от locahost к localhost на порт XYZ, отбросьте пакет ". У Windows есть некоторый (скрытый) брандмауэр. – vz0

+2

@ vz0: по моему опыту брандмауэр Windows никогда не фильтрует пакеты, идущие на локальный хост. Например, вы можете запустить веб-сервер и использовать его на локальном компьютере, не изменяя правила брандмауэра. –

+13

Мои ссылки на то, что я работал в Microsoft в сети Windows. Даже тем не менее, брандмауэр работает на уровне IP и выше, и я говорю о том, что winsock замыкает все ниже этого. Нет причин, по которым вы не можете применять правила брандмауэра к loopback (кроме очевидного «зачем вам беспокоиться?»). Вещи на шлейфе по-прежнему проходят через сетевой стек, а не весь сетевой стек, а оставшиеся накладные расходы настолько незначительны, что это незначительно, если вы не делаете это десятки тысяч раз одновременно. –

24

Для тех, кто приходит, чтобы прочитать это позже, я хочу добавить некоторые выводы, которые отвечают на исходный вопрос.

Для утилиты, которую мы разрабатываем, у нас есть сетевой класс, который может использовать именованные каналы или TCP с теми же вызовами.

Вот типичный цикл обратно передачи файлов на нашей тестовой системе: время передачи

TCP/IP: 2,5 секунды
именованных каналов передачи времени: 3.1 секунды

Теперь, если вы идете вне машины и подключиться к удаленному компьютеру в сети производительности для именованных каналов гораздо хуже:

TCP/IP время передачи: 12 секунд
именованных каналов передачи время: 2,5 минут (! Да минут)

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

+14

Комментарии к удаленным именованным каналам - это красная селедка для вопроса, которая была примерно того же машинного сценария. Именованные каналы - это объекты с одинаковой машиной, реализованные ядром через разделяемую память. Удаленные именованные каналы действительно «настоящие именованные каналы» + SMB + проприетарный протокол для сопоставления связи с конечными точками имен каналов через SMB. В этих дополнительных деталях могут возникать всевозможные вещи, которые влияют на производительность, которые не имеют никакого отношения к «реальной» производительности именованного канала. –

+1

Где находится заявка «Именованные трубы - это объекты с одинаковой машиной, реализованные ядром через общую память».? –

+0

Каков был размер файла? насколько большой, где пакеты? какие трубы/розетки? IOCP? – paulm

Смежные вопросы