Эффективное программирование TCP-IP

       

Недостаточная производительность


Чтобы получить представление о такого рода проблемах, изменим программы hb_server (листинг 2.25) и hb_client (листинг 2.24), задав Т1, равным 2 с, а Т2 -1 с (листинг 2.23). Тогда пульс будет посылаться каждые две секунды, и при отсутствии ответа в течение трех секунд приложение завершится.

Сначала запустим эти программы в локальной сети. Проработав почти семь часов, сервер сообщил о пропуске одного пульса 36 раз, а о пропуске двух пульсов - один раз. Клиенту пришлось посылать второй пульс 11 из 12139 раз. И клиент, и сервер работали, пока клиент не остановили вручную. Такие результаты типичны для локальной сети. Если не считать редких и небольших задержек, сообщения доставляются своевременно.

А теперь запустим те же программы в Internet. Спустя всего лишь 12 мин клиент сообщает, что послал три пульса, не получив ответа, и завершает сеанс. Распечатка выходной информации от клиента, частично представленная ниже, показывает, как развивались события:

spare: $ hb_client 205.184.151.171 9000

hb_client: посылаю пульс: #l

hb_client: посылаю пульс: #2

hb_client: посылаю пульс: #3

hb_client: посылаю пульс: #1

hb_client: посылаю пульс: #2

hb_client: посылаю пульс: #1

                           Много строк опущено.

hb_client: посылаю пульс: #1

hb_client: посылаю пульс: #2

hb-client: посылаю пульс: #1

hb_client: посылаю пульс: #2

hb_client: посылаю пульс: #3

hb_client: посылаю пульс: #1

hb-client: посылаю пульс: #2

hb_client:                 Соединение завершается через

                           1с после последнего пульса.

sparc: $

В этот раз клиент послал первый пульс 251 раз, а второй - 247 раз. Таким образом, он почти ни разу не получил вовремя ответ на первый пульс. Десять раз клиенту пришлось посылать третий пульс.

Сервер также продемонстрировал значительное падение производительности. Тайм-аут при ожидании первого пульса происходил 247 раз, при ожидании второго пульса- 5 и при ожидании третьего пульса - 1 раз.

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



Содержание раздела