Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тормоза по TCP
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
slabnoff
В общем по ряду причин с привычного UDP перешли на TCP (надоело изобретать собственный велосипед с контролем целостности передачи). Многоканальное измерительное устройство на LPC2387, FreeRTOS, lwIP 1.3.1. До этого с TCP в общем-то опыта применения не было вообще (самодельный встроенный Web-сервер не считаю).

В итоге при инициализации устройства (около десятка команд переменного размера, суммарно в устройство уходит около 5 КБайт данных) после посылки нескольких команд, в зависимости от их размера, перед очередной командой возникает задержка на несколько секунд. Итог - инициализация занимает слишком долгое время, а т.к. для некоторых технологических работ (оценка метрологических характеристик например) запускать ее приходится часто есть желание проблему победить. Сдается мне, что где-то как всегда не учел что-то элементарное.

Вот лог обмена снятый Вайршарком. 192.168.0.5 - ПК-клиент, 192.168.0.210 - устройство-сервер.
Глюк виден например между строками 12-13, 23-24.
Код
      
No.     Time        Source                Destination           Protocol Info
      1 0.000000    AsustekC_07:5f:ba     Broadcast             ARP      Who has 192.168.0.210?  Tell 192.168.0.5
      2 0.000185    HitexHol_00:01:09     AsustekC_07:5f:ba     ARP      192.168.0.210 is at 00:30:6c:00:01:09
      3 0.000193    192.168.0.5           192.168.0.210         TCP      interbase > terabase [SYN] Seq=0 Win=65535 Len=0 MSS=1460
      4 0.000516    192.168.0.210         192.168.0.5           TCP      terabase > interbase [SYN, ACK] Seq=0 Ack=1 Win=1500 Len=0 MSS=1500
      5 0.000531    192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=1 Ack=1 Win=65535 Len=0
      6 0.014791    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=34
      7 0.015331    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=1 Ack=35 Win=1466 Len=36
      8 0.015780    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=35 Ack=37 Win=65499 Len=36
      9 0.025764    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=37 Ack=71 Win=1430 Len=36
     10 0.026624    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=71 Ack=73 Win=65463 Len=1062
     11 0.027612    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=73 Ack=1133 Win=368 Len=38
     12 0.170707    192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=1133 Ack=111 Win=65425 Len=0
     13 4.999088    192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=1133 Ack=111 Win=65425 Len=368
     14 4.999604    192.168.0.210         192.168.0.5           TCP      terabase > interbase [ACK] Seq=111 Ack=1501 Win=1500 Len=0
     15 4.999613    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=1501 Ack=111 Win=65425 Len=694
     16 5.000444    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=111 Ack=2195 Win=806 Len=38
     17 5.001312    192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=2195 Ack=149 Win=65387 Len=806
     18 5.001996    192.168.0.210         192.168.0.5           TCP      terabase > interbase [ACK] Seq=149 Ack=3001 Win=1500 Len=0
     19 5.002007    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=3001 Ack=149 Win=65387 Len=256
     20 5.002690    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=149 Ack=3257 Win=1244 Len=38
     21 5.003502    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=3257 Ack=187 Win=65349 Len=1062
     22 5.004492    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=187 Ack=4319 Win=182 Len=38
     23 5.203194    192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=4319 Ack=225 Win=65311 Len=0
     24 9.934619    192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=4319 Ack=225 Win=65311 Len=182
     25 9.935082    192.168.0.210         192.168.0.5           TCP      terabase > interbase [ACK] Seq=225 Ack=4501 Win=1500 Len=0
     26 9.935090    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=4501 Ack=225 Win=65311 Len=508
     27 9.935826    192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=225 Ack=5009 Win=992 Len=38
     28 9.936495    192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=5009 Ack=263 Win=65273 Len=36
     29 9.983857    192.168.0.210         192.168.0.5           TCP      terabase > interbase [ACK] Seq=263 Ack=5045 Win=956 Len=0
     30 11.662789   192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=263 Ack=5045 Win=956 Len=36
     31 11.663321   192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=5045 Ack=299 Win=65237 Len=36
     32 11.663917   192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=299 Ack=5081 Win=920 Len=36
     33 11.695274   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     34 11.720256   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     35 11.745261   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     36 11.770172   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     37 11.795267   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     38 11.820253   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     39 11.837932   192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=5081 Ack=335 Win=65201 Len=0
     40 11.845236   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     41 11.870154   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     42 11.895245   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     43 11.920236   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     44 11.945242   192.168.0.210         192.168.0.5           UDP      Source port: pxc-spvr-ft  Destination port: pxc-splr-ft
     45 11.946038   192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=5081 Ack=335 Win=65201 Len=36
     46 11.958027   192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=335 Ack=5117 Win=884 Len=36
     47 11.958545   192.168.0.5           192.168.0.210         TCP      interbase > terabase [PSH, ACK] Seq=5117 Ack=371 Win=65165 Len=32
     48 11.959111   192.168.0.210         192.168.0.5           TCP      terabase > interbase [PSH, ACK] Seq=371 Ack=5149 Win=852 Len=36
     49 11.959280   192.168.0.210         192.168.0.5           TCP      terabase > interbase [FIN, ACK] Seq=407 Ack=5149 Win=852 Len=0
     50 11.959289   192.168.0.5           192.168.0.210         TCP      interbase > terabase [ACK] Seq=5149 Ack=408 Win=65129 Len=0
     51 14.187546   192.168.0.5           192.168.0.210         TCP      interbase > terabase [FIN, ACK] Seq=5149 Ack=408 Win=65129 Len=0
     52 14.187838   192.168.0.210         192.168.0.5           TCP      terabase > interbase [ACK] Seq=408 Ack=5150 Win=851 Len=0
Rst7
Прашу пардона, а MSS размером в 1500 байт от устройства не жмет?

Размер окна со стороны устройства тоже подозрительный.
slabnoff
Цитата(Rst7 @ Dec 15 2009, 12:46) *
Прашу пардона, а MSS размером в 1500 байт от устройства не жмет?

Размер окна со стороны устройства тоже подозрительный.


Памяти мало... Все что можно отдано под буферы результатов измерений, которые гоняю по UDP. TCP - чисто командный интерфейс, особой скорости от него не надо.
Rst7
Цитата
Памяти мало...


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

Да и с софтом на компе надо смотреть внимательно, ибо тормоз на 5 секунд у Вас именно со стороны компа (5->210).
slabnoff
В общем весь глюк действительно был в размере окна... Что в принципе очевидно. Увеличил с 1500 до 3000 - сразу получил выигрыш. В общем теперь стоит 65000 и ничего не тормозит. Но все равно надо бы поизучать вопрос... Эх, плохо я знаю стек TCP/IP.

По уменьшению размера окна: алгоритм приема команд допускает прием их пачкой одним пакетом (или притормаживание устройства на такое время, что придет более одной команды сверху). Соответственно из-за некоторой кривости алгоритма приема-сборки-обработки команд (зато очень просто и экономно получилось + ничего копировать не надо) ответ на команду высылается до удаления самой команды из входного буфера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.