Pull to refresh

Comments 21

Добрый день, по поводу цены можно узнать через запрос у нас на сайте. Есть опции, так же от количества цена зависит.
А что с многопоточностью шифрования-дешифрования?
Для CBC она невозможна. Стоило попробовать для начала использовать многопоточность для CTR средствами основного процессора.
ОК, перефразирую :))
Что с потокобезопасностью?

Насколько я помню со слов наших FPGA-разработчиков, ускорители шифрования и дешифрования в FPGA реализованы в виде независимых друг от друга клубков проводов. Поэтому со стороны FPGA никаких препятствий для одновременного шифрования и дешифрования быть не должно. Читая исходники CryptoAPI ядра я тоже не нашёл никаких помех для этого.


Но в драйвере есть несоклько полей структуры, которые используются и шифрующей и дешифрующей функциями. Похоже, что прямо сейчас только это помешает запустить параллельно шифрование и дешифрование. Такое негибкое решение мы реализовали на самых ранних этапах разработки, так как тестировали шифрование и дешифрование только по очереди. Давно собирались переписать, но руки не дошли.


Я, наверное, всё же доберусь до починки этого в ближайшие пару недель. Ждите тогда новые графики.

Оу, вот этого не ожидал. Вопрос был что относительно параллельной работы двух декрипторов или энкрипторов — как они обрабатываются. Все ли данные, включая контекст для CBC потокобезопасны…

Но наличие лока между криптом и декриптом, да еще и в драйвере, это нежданчик.
Добрый день. Я ответила на ваш комментарий.
Читатель, который посмотрит не только на форму линий, но и на конкретные числовые значения, конечно, удивится: почему дешифрование стабилизируется на 250 Мбит/с, а шифрование — на 400 Мбит/с? На самом деле драйвер тут совершенно ни при чём, так происходит потому, что в FPGA, несмотря на зеркальный интерфейс, процедуры шифрования и дешифрования реализованы по-разному.

Это и без комментария понятно, что по-разному, и ничего не объясняет.
Кстати, это ещё более дико смотрится в том разрезе, что шифрование в CBC нельзя параллелизовать (без внесения изменения в схему CBC), а вот расшифровку как раз таки можно параллелизовать. Можете прокомментировать этот феномен?
Вот ещё идея для вас: в OpenVPN с версии 2.4.0 зарелизили поддержку режима GCM, в котором и проверка целостности, и шифрование могут быть реализованы параллельно. И при этом ещё оверхед от паддинга исчезает. Если ваш ARM-процессор многоядерный и вам удастся добиться параллелизма, то вполне вероятно вы сможете выйти на полную канальную скорость безо всяких аппаратных изысков даже в тесте с одним соединением.

Идея интересная, но, боюсь, нежизнеспособная.


Я нашёл свои старые измерения, того, на что тратится процессорное время при работе iperf через openvpn с софтовой релизацией AES-128-CBC: flame graph. О том, как интерпретировать flame graph, читайте http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html .


Эта (кликабельная) картинка, была построена по perf.data, полученному командой perf record -a -g -- iperf -c some.host.


По ней можно понять, что на шифрование уходит меньше 20% процессорного времени. Кучу времени процессор провёл в системных вызовах (send, recv, poll) и в функции sha1_block_data_order. Кажется, проще перейти на Blowfish, чем AES ускорять :) .


К распараллеливанию на многоядерном процессоре тоже есть вопросы. Я не знаю, умеют ли libcrypto, libssl или ещё какие-то криграфические библиотеки распараллеливаться из коробки.

ну во-1х, 20% это не мало :)
во-2х, 20% у aes_encrypt и 17% у sha1_block — даже если их просто сколлапсить, это уже 17% экономия. а если еще и оба упадут на fpga, так что в итоге суммарно в 4 раза быстрее чем на сру — то вместо 37% получам 5% — что даёт ускорение на треть.

нет, распараллеливать из коробки они не умеют.
В будущем мы собираемся ускорить именно OpenVPN на Ethond
Ускорьте, пожалуйста. Сейчас действительно основное время проводится в recv, send и poll. Это из-за того, что в TAP-устройство нельзя писать или читать несколько пакетов одним системным вызовом, и нет никакого механизма offloading, кроме IFF_VNET_HDR, который не особо полезен. Модули, построенные на TAP, реализуют свой протокол поверх TAP, разбивая несколько фреймов в один большой и собирая его на другом конце. Так делает, если не ошибаюсь, macvtap, vxlan и virtio.

Проверить эту теорию и ускорить OpenVPN достаточно просто — задайте интерфейсу большой MTU в серверном и клиентском конфигурационном файле:
mssfix 0
tun-mtu 18000
Теперь все будет летать. Но вариант с увеличением MTU подходит только для передачи данных внутри OpenVPN-сети, без выхода в интернет.

Если вы добавите в TAP возможность читать и писать несколько пакетов за один вызов, это будет очень полезно не только OpenVPN, но и куче других проектов. Сейчас, со стандартным MTU, TAP развивает максимальную скорость около гигабита в секунду на десктопных процессорах, захлебываясь в переключениях контекста.
спасибо, я хоть никогда серьезно ниже jvm не писал, но прочел с удовольствием
вопрос — отчего графики перфоманса хардверной реализации такие рваные?
Правильно ли я понял, что скорость (400Мбит/с для шифрования) ограничивает не столько самой реализация AES в FPGA (блоки и размножить можно) (8Гбит/с), сколько скорость обмена данных? Не измеряли чистую скорость обмена данных (с учетом всего стека, конечно)?

У драйвера между моментами, когда он отдавал в FPGA адреса буфферов с данными, было время спать. Особенно это заметно при больших объёмах данных. Это значит, что со своей задачей он справлялся и у FPGA всегда были данные для обработки. Я пока не уверен, думаю, нам стоит дождаться ответа авторов прошивки FPGA, чтобы можно было ответить на вопрос о том, чем сейчас ограничивается скорость.

Было бы интересно!
Я занимаюсь разработкой проекта на SoC Xilinx Zynq 7020 (аналог Вашего). И скорости взаимодействия ARM и FPGA части интересны, т.к. они временами нас ограничивают…
К вопросу о производительности — не рассматривали вариант удвоения ширины энкриптора/декриптора?
Слышал краем уха, что впихивание ширины во всё доступное (кратное блоку) давало выигрыш по энергоэффективности (ну и кратное ускорение, разумеется).

Сколькитактное ядро, к слову, получили? Может, оттуда разница в пиковой производительности?
Sign up to leave a comment.