2010-09-29 2 views
1

У меня есть библиотека, созданная на основе telnetlib Python. И недавно я заметил, что производительность в Windows XP и Linux настолько различна.Производительность Telnet в Windows XP и Linux

ниже сценарий, я разработать три операции, «получить единицы», «просто нажмите клавишу ВВОД», «получить блоки с опциями»

«получают единицы» имеет длинную строку возврата, «получить блоки с опциями» вернуться короче строка и «просто нажмите enter» вернет кратчайшую строку.

предположим, что будет потрачено больше времени, кажется, что заказ должен быть «получить единицы», «получить единицы с опциями», затем «просто нажать enter».

но фактический результат в Windows XP является:

получают единицы: +3,67200016975 s получают единицы с опциями: +10,0319998264 s просто нажмите клавишу ВВОД: 10,0 с

же тест в Ubuntu: получают единицы: 3.91432785988 получить блоки с опциями: +2,86995506287 просто нажмите клавишу ВВОД: +2,05337381363

, кажется, что Windows XP имеет хорошую производительность на большой пакет IP, но для небольшой пакет, это так плохо.

Я проверил его вручную, используя telnet-клиент Windows, шпатлевку. Использование wirehark для захвата данных telnet. И найдите, что для небольшого пакета пакетная задержка настолько длинная, около 0.2s

Я попытался изменить окно tcp, но не помогло.

Может ли кто-нибудь дать некоторые предложения?

try: 
    begin_g = time.time() 
    for i in range(50): 
     connection.write('ZUSI:OMU;') 
     ret = connection.read_until('<') 
     ret = connection.read_until('<') 
    end_g = time.time() 
    elapse_g = end_g-begin_g 

    clean_begin_t = time.time() 
    for i in range(50): 
     ret = ipa.get_units() 
    clean_end_t = time.time() 
    elapse_c = clean_end_t-clean_begin_t 

    begin_wu = time.time() 
    for i in range(50): 
     connection.write('') 
     ret = connection.read_until_prompt() 
    end_wu = time.time() 
    elapse_wu = end_wu-begin_wu 

ответ

0

Может быть, это задерживает отправку короткого пакета из-за Nagle's algorithm.

Вы можете проверить это, отключив алгоритм Nagle на компьютере XP (Google, как это сделать).

+0

спасибо. я понял:). Задержка 0,2 с является причиной по «алгоритму ACK с задержкой ACK», его значение по умолчанию равно 0.2s – Rainman

0

Спасибо всем. Я решаю эти проблемы. Существует два алгоритма: алгоритм Нэгл, алгоритм с задержкой ACK. Моя проблема вызвана «Алгоритмом с задержкой ACK». К сожалению, он не может быть установлен в Python. Мне нужно изменить регистр, установить значение 1, и он работает вообще. Но я думаю, что это недостаточно. Поддержка Linux TCP_QUICKACK. Но Windows нет.

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \{Adapter-id}] 
TcpAckFrequency = 2 (Default=2, 1=Disables delayed ACK, 2-n = If n outstanding ACKs before timed interval, sent ACK) 

More Info MS KB Q328890 
More Info MS KB 815230 (XP/2003 needs hotfix or SP2 for it to work) 
More Info MS KB 935458 (Vista needs hotfix or SP1 for it to work) 
+0

. К чему вы подключаетесь? В идеале ваш сервер Telnet будет работать с задержкой ACK. –

+0

Я искал в Интернете MS. И задержанный ACK определен в RFC. Но Linux, похоже, имеет более высокую производительность. Через журнал изменений окна могут отключить эту функцию. Я думаю, что для TCP_NODELAY, если сервер и клиент не могут его установить, это будет полезно в моей ситуации. – Rainman

+0

[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces \ {Adapter-id}] TcpAckFrequency = 2 (По умолчанию = 2, 1 = Отключает задержку ACK, 2-n = Если n выдающихся ACK до момента времени, отправлено ACK) Подраздел: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces \ <интерфейс GUID> запись: TcpAckFrequency Значение Тип: REG_DWORD, номер Допустимый диапазон: 0-255 По умолчанию: 2 – Rainman