Перейти к содержанию
    

Cyclone V SoC : как увеличить скорость передачи Ethernet и снизить загрузку процессора?

Имеется development kit, на котором единственный Ethernet приделан к HPS.

Мне нужна скорость > 20 МБ/с при низкой загрузке процессора, < 10 %.

 

Тестировал я с помощью программы вроде этой:

 

for(i1 = 0; i1 < i2; i1++)
{
    sent_size += sendto(sock, buf_frame, packet_size, 0,
        (struct sockaddr *) &echoclient,
        sizeof(echoclient));
    //usleep(sleep_us); /// commented to test max rate, uncommented to reduce CPU load
}

 

При размере пакета packet_size = 8192 я получил 86,2 МБ/с, 100 % загрузка процессора.

Чтобы эмулировать снижение нагрузки я расскомментировал usleep(sleep_us).

При sleep_us = 450, packet_size=8192 получил 13.56 MB/s , 17 % загрузки процессора.

14 МБ/с - мало, 17 % - много.

Есть ли пути увеличить скорость Ethernet и уменьшить загрузку процессора на Cyclone V HPS ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы используете TCP или UDP?

Вы хотите использовать большие (jumbo) фреймы для передачи (packet_size = 8192)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли пути увеличить скорость Ethernet и уменьшить загрузку процессора на Cyclone V HPS ?

Думаю можно, только надо отказаться от использования стандартных функций и копать в сторону DMA.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы используете TCP или UDP?

Вы хотите использовать большие (jumbo) фреймы для передачи (packet_size = 8192)?

 

А есть разница в скорости при использовании UDP или TCP?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А есть разница в скорости при использовании UDP или TCP?

Ну, смотрите:

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

TCP заголовок 16 байт (если без опций смотреть), а UDP заголовок - 8. Следовательно при одной и той же длине пакета с UDP можно передать на 8 байт больше с каждым пакетом.

Для TCP обязательно рассчитывать контрольную сумму (а она считается в том числе и по данным), для UDP контрольную сумму можно не рассчитывать и заполнить нулями (т.е. снизить нагрузку на процессор дополнительными расчетами, однако все эти расчеты может делать сетевая карточка/встроенное MAC-ядро в HPS, если это поддерживается и настраивается).

 

Так, в случае UDP можно заранее подготовить весь заголовок (если известно куда отправляются данные и получатель не меняется), и только подставлять данные (просто склеивая) и отправлять целый пакет (с Ethernet/IP/UDP заголовками) через RAW сокет.

 

Разница между TCP и UDP есть. Не думаю, что на HPS UDP НАМНОГО будет быстрее, чем TCP, он немного проще, вот и всё.

 

Если использовать Jumbo фреймы, то можно немного снизить нагрузку (будет меньше прерываний и пакетов в принципе).

В доке Cyclone V Hard Processor System Technical Reference Manual в разделе про EMAC написано:

 

Programmable frame length supporting standard and jumbo Ethernet frames (with size up to 3800 bytes)

 

Насколько это работает в этом MAC-ядре я не знаю - не пробовал.

 

Если данные, которые вы передаетё хорошо сжимаются, то можно попробовать сжимать, а потом передавать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использую UDP.

Хотелось бы вписаться в стандартные MTU=1500.

В SoC имеется Gigabit Ethernet, а тут получаются какие-то десятки-сотни Мбод при значительной загрузке процессора. Хотелось бы использовать это более эффективно.

Изменено пользователем Juzujka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тот тест запускал в Linux, пользуясь стандартными средствами. Ожидал, что ОС воспользуется DMA для выполнения sendto(), но теперь мне не понятно, то-ли много накладных расходов на пересылку по DMA, то-ли ОС не использует DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотите скорость - отказывайтесь от пересылки данных через Qsys, неважно через процессор или через DMA (dj 2v случае все равно процессор все инициализирует, а еще и чексумы считает).

Подумайте на тему формирования UDP в логике с перезапросом потерянных пакетов через собственный протокол верхнего уровня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...