WEB сервер на ESP32 с данными на SD

Pavel-67

New member
Добрый день. Помогите решить головоломку. Залил скетч с Arduino IDE, страница открывается , но не подгружается часть файлов с скриптами и CSS кодом, но стоит уйти на любую другую страницу, а затем вернуть все подгружается и работает стабильно, если при этом обновить страницу, то опять файлы не подгружаются.

Все файлы в имени имеют до 8 символов, расширение 3 символа.
SD 2Гб отформатирована под FAT

Скетч брал от сюда: zhouhan0126/WebServer-esp32

Помогите решить эту задачу.
 

Pavel-67

New member
Я тоже наблюдаю такие глюки при работе сервера с из SPIFFS. В чем причина пока не понял.
Значит дело не SD и не в SPIFFS. Значит ESP как-то не правильно срабатывает. Но мне не понятно в чем разница между просто перейти на страницу сервера и перейти на страницу сервера, потом ути на другую и вернуться. Разве при возвращении не те же самые запросы на сервер отправляются?
 

tretyakov_sa

Moderator
Команда форума
Значит дело не SD и не в SPIFFS. Значит ESP как-то не правильно срабатывает. Но мне не понятно в чем разница между просто перейти на страницу сервера и перейти на страницу сервера, потом ути на другую и вернуться. Разве при возвращении не те же самые запросы на сервер отправляются?
У меня ошибка не стабильная при обновлении страницы, то читает то нет.
 

pvvx

Активный участник сообщества
У меня ошибка не стабильная при обновлении страницы, то читает то нет.
Скорости CPU не хватает. Каждое чтение SPIFFS - опустошение программной "кеш". Скорость работы CPU ограничена скоростью чтения блоков из SPI-Flash -> ESP32 и ESP8266 в случаях нехватки IRAM с "кеш" одинакова и составляет примерно 8..10 миллионов команд. Всё тупит и валится...
 

Pavel-67

New member
Я тоже наблюдаю такие глюки при работе сервера с из SPIFFS. В чем причина пока не понял.
Значит дело не SD и не в SPIFFS. Значит ESP как-то не правильно срабатывает. Но мне не понятно в чем разница между просто перейти на страницу сервера и перейти на страницу сервера, потом ути на другую и вернуться. Разве при возвращении не те же самые запросы на сервер отправляются?
Скорости CPU не хватает. Каждое чтение SPIFFS - опустошение программной "кеш". Скорость работы CPU ограничена скоростью чтения блоков из SPI-Flash -> ESP32 и ESP8266 в случаях нехватки IRAM с "кеш" одинакова и составляет примерно 8..10 миллионов команд. Всё тупит и валится...
Тот же сайт на ESP8266 работает стабильно. Правда сам модуль иногда виснет (по разному от 20 минут до 2-х дней) , по этой причине и думал перейти на более мощную платформу.
 

sharikov

Active member
...страница открывается , но не подгружается часть файлов с скриптами и CSS кодом, но стоит уйти на любую другую страницу, а затем вернуть все подгружается и работает стабильно, если при этом обновить страницу, то опять файлы не подгружаются.
Этот WebServer-esp32 поддерживает несколько одновременных соединений и если да то сколько ? Ваши библиотеки умеют читать несколько файлов одновременно с SD карты ? В вашем Веб сервере и TCP стеке решены проблемы закрытия множественных соединений (а они есть)?
Браузер при открытии страницы загружает все файлы одновременно открывая кучу соединений с сервером и если ваш сервер одновременные соединения не держит будет глючить. При возвращении загрузившиеся файлы берутся из кэша поэтому открывается. Попробуйте открывать html файл без внешних ресурсов.
 

pvvx

Активный участник сообщества
Тот же сайт на ESP8266 работает стабильно. Правда сам модуль иногда виснет (по разному от 20 минут до 2-х дней) , по этой причине и думал перейти на более мощную платформу.
Если виснет, а софт правильный, то не хватает питания. Процессор тактируется на полную, жрет по максимуму, но выполняет циклы ожидания пока там блок в десяток байт считается из Flash, qspi шина и контроллер + Flash пашут на полную (до 20 МБайт/с), плюс MDIO и сам передатчик WiFi... Ещё бы больше раздули код Arduino и скорость обработки упадет менее первой XT i8080 :)
 

Pavel-67

New member
Сайт у меня расположен на SD карте, в SPIFFS я ничего не загружаю.
Этот WebServer-esp32 поддерживает несколько одновременных соединений и если да то сколько ? Ваши библиотеки умеют читать несколько файлов одновременно с SD карты ? В вашем Веб сервере и TCP стеке решены проблемы закрытия множественных соединений (а они есть)?
Браузер при открытии страницы загружает все файлы одновременно открывая кучу соединений с сервером и если ваш сервер одновременные соединения не держит будет глючить. При возвращении загрузившиеся файлы берутся из кэша поэтому открывается. Попробуйте открывать html файл без внешних ресурсов.
html без внешних ресурсов загружается нормально. Что касаемо "WebServer-esp32 поддерживает несколько одновременных соединений и если да то сколько?" неужели у ESP32 меньше одновременных соединений чем у ESP8266? В теории возможно ли, что используемые библиотеки для Web сервера работают только с 2-3 файлами с SD карты (Мне кажется это архи мало, но похоже на истину)?
 

Pavel-67

New member
Если виснет, а софт правильный, то не хватает питания. Процессор тактируется на полную, жрет по максимуму, но выполняет циклы ожидания пока там блок в десяток байт считается из Flash, qspi шина и контроллер + Flash пашут на полную (до 20 МБайт/с), плюс MDIO и сам передатчик WiFi... Ещё бы больше раздули код Arduino и скорость обработки упадет менее первой XT i8080 :)
А какие альтернативы, если для осуществления деятельности необходимы это десятки байт (с частотой 3 секунды) от устройства?
 

Pavel-67

New member
Сайт у меня расположен на SD карте, в SPIFFS я ничего не загружаю.


html без внешних ресурсов загружается нормально. Что касаемо "WebServer-esp32 поддерживает несколько одновременных соединений и если да то сколько?" неужели у ESP32 меньше одновременных соединений чем у ESP8266? В теории возможно ли, что используемые библиотеки для Web сервера работают только с 2-3 файлами с SD карты (Мне кажется это архи мало, но похоже на истину)?
Непонятно почему при перезагрузке страницы (когда все фалы загружены в "кеш") он их игнорирует и повторно пытается заново загрузить их с сервера? А при возврате на страницу, почему то берет часть фалов из кеша.
 

tretyakov_sa

Moderator
Команда форума
Скорее всего, что то в библиотеке сервера. Так как тот же самый код для ESP8266 работает нормально. Но времени нет пока смотреть что и как.
 

Pavel-67

New member
Скорее всего, что то в библиотеке сервера. Так как тот же самый код для ESP8266 работает нормально. Но времени нет пока смотреть что и как.
Возможно вы правы, так как для ESP8266 используется другая (своя) библиотека сервера.

Буду искать альтернативную библиотеку. (
 

Pavel-67

New member
Скорее всего, что то в библиотеке сервера. Так как тот же самый код для ESP8266 работает нормально. Но времени нет пока смотреть что и как.
Возможно вы правы, так как для ESP8266 используется другая (своя) библиотека сервера.

Буду искать альтернативную библиотеку. (
Попробуйте асинхронный сервер: me-no-dev/ESPAsyncWebServer
Спасибо за ссылку, буду пробовать.
 

pvvx

Активный участник сообщества
неужели у ESP32 меньше одновременных соединений чем у ESP8266?
Меньше. У ESP32 псевдо-мульти-задачка -> требуется больше "стека", + 2 CPU - это по минимуму x 4 требований по размеру RAM от ESP8266. А этого объема нет.
Псевдо-мульти-задачка плохо работает по событиям и тем более в Arduino - обработка запросов длительная и Lwip тред/стек стоит и входные буфера переполняются... Отброс пакетов... потери пакетов.. retransmission... Скорость передачи ещё сильнее падает, а все ещё больше заняты...
В Arduino TCP-Web соединения закрываются неверно, не по спецификации. См. TIME_WAIT для TCP стека...
В итого в Arduino подобных и ограничивают до 4-х одновременных TCP соединений...
В теории возможно ли, что используемые библиотеки для Web сервера работают только с 2-3 файлами с SD карты (Мне кажется это архи мало, но похоже на истину)?
Может и с одним - для Arduino этого достаточно :)
В моем старом (более 4-х летнем) примере web-свалки на ESP8266 - к десяткам файлов и десяткам одновременных соединений (лень искать замеры). В поиске сайта введите "jmeter" ...
Какие-то последующие замеры https://esp8266.ru/forum/threads/web-svalka-na-rtl871x.2403/page-2#post-36109
Итого: Натравите на ваш код apache-jmeter и всё будет наглядно.
 

pvvx

Активный участник сообщества
думал перейти на более мощную платформу.
Сделал небольшой замер отзывчивости* web-ов на том, что есть в локалке, на даче :)

*Замер отзывчивости – запрос мелкого статического файла у сервера, не обрабатываемого им скриптами и т.д. Например ‘http://rtl871x0/rtl.gif’

Конфигурация сети: Старый комп с Ethernet 1Gb подключен к старому роутеру TL-WR840N проводом (Ethernet 100Mb). Используется Apache-Jmeter-3.1.

Участники со встроенными Web, все подключены к роутеру TL-WR840N:
  • RTL8711AM – какой-то мой Web, подключение по WiFi
  • RTL8710BN – какой-то мой Web, подключение по WiFi
  • Onion Omega 2+ – исходный Web, подключение по WiFi
  • MIPS4kc 320MHz – какой-то мой Web, подключение по Ethernet 100Mb
  • TL-MR3020 – штатный Web от TP-Link, подключение по Ethernet 100Mb
  • TL-WR840N – штатный Web от TP-Link, подключен к компу (Ethernet 1Gb)
При тесте Web на TP-Link роутерах в Jmeter, в опциях HTTP Request отключался ‘Use KeepAlive’. Иначе каждый второй запрос выдает ошибку - наверно web роутеров TP-Link по своему понимает HTTP1.1 :)

Итоги теста на 25 одновременных виртуальных пользователей (тредов в Jmeter). Ждал 5000 замеров и жал кнопку остановить в Jmeter.
Кол-во ответов (получения файлов) от сервера в секунду и время запрос-ответ (типа ping)
tstthall.gif
itog.gif TreadCfg.gif HttpCfg.gif
 

Pavel-67

New member
Скорее всего, что то в библиотеке сервера. Так как тот же самый код для ESP8266 работает нормально. Но времени нет пока смотреть что и как.
Возможно вы правы, так как для ESP8266 используется другая (своя) библиотека сервера.

Буду искать альтернативную библиотеку. (
Попробуйте асинхронный сервер: me-no-dev/ESPAsyncWebServer
Спасибо за ссылку, буду пробовать.
Сделал небольшой замер отзывчивости* web-ов на том, что есть в локалке, на даче :)

*Замер отзывчивости – запрос мелкого статического файла у сервера, не обрабатываемого им скриптами и т.д. Например ‘http://rtl871x0/rtl.gif’

Конфигурация сети: Старый комп с Ethernet 1Gb подключен к старому роутеру TL-WR840N проводом (Ethernet 100Mb). Используется Apache-Jmeter-3.1.

Участники со встроенными Web, все подключены к роутеру TL-WR840N:
  • RTL8711AM – какой-то мой Web, подключение по WiFi
  • RTL8710BN – какой-то мой Web, подключение по WiFi
  • Onion Omega 2+ – исходный Web, подключение по WiFi
  • MIPS4kc 320MHz – какой-то мой Web, подключение по Ethernet 100Mb
  • TL-MR3020 – штатный Web от TP-Link, подключение по Ethernet 100Mb
  • TL-WR840N – штатный Web от TP-Link, подключен к компу (Ethernet 1Gb)
При тесте Web на TP-Link роутерах в Jmeter, в опциях HTTP Request отключался ‘Use KeepAlive’. Иначе каждый второй запрос выдает ошибку - наверно web роутеров TP-Link по своему понимает HTTP1.1 :)

Итоги теста на 25 одновременных виртуальных пользователей (тредов в Jmeter). Ждал 5000 замеров и жал кнопку остановить в Jmeter.
Кол-во ответов (получения файлов) от сервера в секунду и время запрос-ответ (типа ping)
Посмотреть вложение 7821
Посмотреть вложение 7822 Посмотреть вложение 7823 Посмотреть вложение 7824
Добрый день, получается из выше перечисленных самый стабильный RTL8711AM модуль? Что посоветуете для Web сервера из модулей (максимально стабильного).

Ранее вы писали "Каждое чтение SPIFFS - опустошение программной "кеш"", подскажите как бороться с опустошением кеш, если небольшой сайт записан в область SPIFFS и волей-неволей приходится к ней обращаться?

Спасибо большое за тесты, за помощь!
 
Сверху Снизу