• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как заставить google chrome давать ack не через 0.2 сек для стека http на esp8266?

pvvx

Активный участник сообщества
Проблема решена. Китайцы установили по умолчанию nagle в LwIP.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Это всё дает любая заливка в ESP8266. Возникает E:\esp_iot_sdk\bin\eagle.app.v6.S - asm c метками.
А проблема в другом. Explorer подтверждает пакет стека через 0.000xx сек, а Хром - через 0.2...0.01 сек. За это время стек ESP8266 (5800 байт) уже весь передается и ждет подтверждения, для возможного отката. Даже мобильники и то быстрее дают ответ. Тут дело в самом Хромом и его стеке HTTP. Его версия стоит ещё в одном браузере.... Самые тормозные :p - Читайте на гугле - установите быстрый .... :) а не нравиться - оптимизируйте свой сайт
https://developers.google.com/speed/pagespeed/insights/
Все запросы на добавочные файлы в конец странички, пока Хромой додумается, но уже яве сообщит, что загрузил всё :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
https://yadi.sk/d/tsti_h_2dVHLc Отладочная прошивка для исследования областей памяти в ESP8266 и скорости передачи больших файлов...
(собрал наскоро, с отрезанным функционалом установок по http, т.к. ещё не отладил и лень делать дизайн страниц сервера, но задачу проверки скорости передачи и чтения RAM/Flash выполняет).
При включении имеем WiFi станцию с именем "ESP8266" и паролем "0123456789". COM порт установлен на 256000 Baud. Соединяемся со станцией, входим на страничку отладки (введя имя и пароль) и считываем интересующие области памяти из чипа в файлы. Области, занятые распределением flash в RAM читать не стоит - будет "эксепшн" и перезагрузка модуля.
По скорости передачи: Google Chrome у меня дает ~ 10кбайт/сек :), а Internet Explorer и другие браузеры - более 650кбайт/с. Проблема с этим так и не решена.

Адреса: файл прошивки для FLASH_DOWNLOAD_TOOLS_v0.9.3.x

0x7e000: blank.bin
0x7c0000: esp_init_data_default.bin
0x00000: 00000_eagle.app.v6.bin
0x40000: 40000_eagle.app.v6.bin
0x1e000: WEBFiles.bin
 

Sanya_kv

New member
Это не баг, это фича. И проблема эта не в "google chrome", а прокладки которую он использует.
Для ускорения обмена, передача выполняется по 2 пакета. Получатель, после получения первого пакета в течении 200 мСек ожидает второй. Если за первым приходит сразу второй, то АСК передается сразу, либо по истечении 200 млСек.
Т.Е. Вам достаточно выполнять отправку два раза, не дожидаясь 1-го ACK.
 

pvvx

Активный участник сообщества
Это не баг, это фича. И проблема эта не в "google chrome", а прокладки которую он использует.
Для ускорения обмена, передача выполняется по 2 пакета. Получатель, после получения первого пакета в течении 200 мСек ожидает второй. Если за первым приходит сразу второй, то АСК передается сразу, либо по истечении 200 млСек.
Т.Е. Вам достаточно выполнять отправку два раза, не дожидаясь 1-го ACK.
В два пакета на MS Explorere само всё... Больше 2-х просто стек у ESP2866 короток :) На MS Explorere и выходит 1.2Mbps/s. На Хромом - наверно 100к :)
При 200ms Хромой подтверждает стек 5 раз в секунду. А стек у нас (максимальное окно) 5-ть с копейками килобайт. Вот и выходит 5*5 = 25 :)
 

Sanya_kv

New member
В два пакета на MS Explorere само всё... Больше 2-х просто стек у ESP2866 короток :) На MS Explorere и выходит 1.2Mbps/s. На Хромом - наверно 100к :)
При 200ms Хромой подтверждает стек 5 раз в секунду. А стек у нас (максимальное окно) 5-ть с копейками килобайт. Вот и выходит 5*5 = 25 :)
Так не важна какова длинна отправляемого пакета. Отправляй хоть по 100 байт, главное по 2 пакета (2 раза). Это сам MS придумал, по умолчанию это используется в его библиотеках, хром работает через них, ещё пару лет назад также работал IE и другие. С lwip разбирался очень давно, что уже забыл как в нем. По этому подсказать не могу. До ESP руки дошли только сейчас.
У меня к Вам пара вопросов, какой Вы используете адаптер USB to RS232? и Возможно из исходников полностью выкинуть стек LwIP?
Заранее благодарен за ответы.
 

pvvx

Активный участник сообщества
Так не важна какова длинна отправляемого пакета. Отправляй хоть по 100 байт, главное по 2 пакета (2 раза). Это сам MS придумал, по умолчанию это используется в его библиотеках, хром работает через них, ещё пару лет назад также работал IE и другие.
Хром вроде имеет свой стек HTTP, по тому и дурит.
С lwip разбирался очень давно, что уже забыл как в нем. По этому подсказать не могу. До ESP руки дошли только сейчас.
А это, отправка по два пакета никак не управляется в Lwip. И приведет только к потере скорости ещё с Хромым... :) Он просто считает, что у всех должен быть стек минимум в 128кило...

У меня к Вам пара вопросов, какой Вы используете адаптер USB to RS232?
Любой - у меня есть практически все типы. К модулю включен FT2232, т.к. он двойной. По одному (UART0 в ESP) программируется, а по второму - только TX UART1 - отладочная информация. С двумя отключать/переключать ничего не надо при отладке/заливке прошивки.
и Возможно из исходников полностью выкинуть стек LwIP?
Заранее благодарен за ответы.
Всё возможно, но Lwip более менее что работает в сборке SDK от Espressif. Всё остальное гораздо хуже, особенно где в заголовке цельно-стянутых примеров из опен-сорцов в SDK красуются надписи "Copyright (c) Espressif System" и вставлены эксклюзивные баги :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Эта проблема транспортного уровня - TCP, это хорошо видно из Вашего видео в wireshark. Я с этим тоже в своё время наелся.:confused:
Большинство ПО писанное на Windows не тормозит, как это делает Chrome. Из этого и выводы, что что-то с ним не то.
 

pvvx

Активный участник сообщества

Sanya_kv

New member

pvvx

Активный участник сообщества
Спасибо большое. Планирую использовать свой стек. К сожалению пока не могу его выложить, из-за ограничений. :mad:
Ещё долго придется ковыряться - внятных описаний регистров чипа, особенно части WiFi пока нет.
 

d946

New member
pvvx, посмотрите результат строчки
"web_conn->msgbufsize = tcp_sndbuf(ts_conn->pcb);"
скорее всего при запросе через хром будет
2920 -первая передача
потом будет падать до 1500-1700 и так до конца передачи, в результате падение скорости передачи.
Выход из этой ситуации полностью заполнять буфер до 2920, при каждом формировании посылки.
У Вас при получении файлов с Content-length тоже идет падение скорости через хром или передача идет без падения скорости?
 

pvvx

Активный участник сообщества
посмотрите результат строчки
"web_conn->msgbufsize = tcp_sndbuf(ts_conn->pcb);"
скорее всего при запросе через хром будет
2920 -первая передача
потом будет падать до 1500-1700 и так до конца передачи, в результате падение скорости передачи.
Выход из этой ситуации полностью заполнять буфер до 2920, при каждом формировании посылки.
tcp_sndbuf(ts_conn->pcb) (snd_buf; /* Available buffer space for sending (in bytes). */) это и есть сколько можно заполнить в буфер. Передачи организованы так - заливается сколько влезет и как есть место снова заливается. Куда Lwip будет класть то, что больше его буферов ?
И прошло достаточно времени, чтобы протестировать скорость на других устройствах и браузерах. Беда только с Хромом. У не него не только в этом беда. Корпоративные клиенты отказываются от Хрома - он требует очень много ресурсов от общего сервера, т.к. в конторах у всех стоят только мониторы, а диск и ПО сидят на общем сервере... У него ещё и другие беды....

Лучше объясните, почему Хром делает задержку в подтверждении пакетов TCP? IE и другие так не делают.
Могу дополнить только это:
В два пакета на MS Explorere само всё...
Если модуль успел выплюнуть, а експлорер не успел подтвердить. Модуль всегда выплевывает по максимуму окна TCP стека. И мы не можем передать ещё, т.к. TCP стек у модуля забит и ждет подтверждения о приме от обратной стороны. А Хром тупит и делает задержку, ожидая что у нас стек в мегобайты...
 
Последнее редактирование:

d946

New member
проблема при формирование ответа Chunked в функции webserver_send_fdata
в начале функции мы получаем
web_conn->msgbufsize=tcp_sndbuf(ts_conn->pcb)

но в конце функции мы пошлем на 2 -3 байта меньше ранее полученного, за счет ранее зарезервированного места под размер chunka.

Посмотрите в начале функции
os_printf("sndbuf=%u! ", web_conn->msgbufsize);

и поставьте вызов os_printf("sndbuf=%u! ", web_conn->msgbufsize); перед
tcpsrv_int_sent_data(ts_conn, web_conn->msgbuf, web_conn->msgbuflen);

и если они у Вас равны значит я не прав, но у меня была именно эта причина падения скорости.
 

pvvx

Активный участник сообщества
и если они у Вас равны значит я не прав, но у меня была именно эта причина падения скорости.
При чем тут 2 или 3 байта? Хром дает подтверждение TCP стека через 0.1..0.2 сек.
Как итог - больше, чем 10..20 размеров ТСP стека в секунду ему не передать. У нас mss, размер TCP пакета ~1500 байт, а "стек" TCP = 4 * mss. Итого 1500*4*10 = 60000 байт в секунду для Хрома, как предел.
У IE и остальных время подтверждения приема пакета = скорости CPU и системы = микросекунды.
Размер chunka в HTTP вообще не связан со скоростью. Это вложенный в HTTP TCP протокол. У нас тормозит TCP, а не что он транспортирует.

Пошлите стек разбитый хоть на 1000 пакетов, Хром подтвердит всего 10..20 штук стеков в сек. В то-же время IE будет слать пакеты подтверждения сколько успеет по быстродействию.
При том, что у нас всего 6 кило TCPстек на модуле разница в передаче и составляет:
Хром – до 60 килобайт в сек
IE– 1.2 Мегабайта в секунду (предел по WiFi на модуле)
А вы считаете мелкие издержки на накладных расходах (размеры заголовков в пакетах).

Как "дойдет" - отпишитесь, а то из меня объяснятель фиговый (не знаю того, что вы знаете или чего не знаете и пытаюсь описать без специальных сложных терминов, а это сложно).
 
Последнее редактирование:

pvvx

Активный участник сообщества
На картинках видна скорость до 150 явно больше 60 килобайт в сек
В течении 10 минут скину прошивку и описание.
:) Ровно в десять раз медленнее, чем у меня при flash Winbond на модуле.
В IE 1 Мегабайт в секунду с моей "Свалки" в Web при трансляции проекта без вывода отладки. В теме "свалки" дано много графиков и замеров.
 

d946

New member
Прошивка в прикрепленном файле


Wi-fi : ESP8266 без пароля
URL : http://192.168.4.1:8080/flash.cgi - дамп flash 512 килобайт
URL : http://192.168.4.1:8080/big.cgi - отдает файл 20 Мбайт для теста

Цель начатой мной дискуссии не замеры скорости, а факт если стек LWIP разрешает определенный размер буфера отправки, а мы его не заполняем полностью, при следующей отправке разрешенный размер буфера будет сокращаться.
 

Вложения

Сверху Снизу