вторник, 20 сентября 2011 г.

Solaris 11: В поисках AES

Недавно мы заменили сервак (железо), новый сервак обзавелся поддержкой AES инструкций в ядре Xeon E3-1230. Вот и думаю я, какая польза от AES инструкций, если Solaris 11 не обновлялся с ноября 2010 года. Где их вообще можно применить, не пересобирая ядро Solaris?



Нашел статью в которой сказано что в ядре Solaris 2010.11 уже есть поддержка инструкций AES-NI. Посмотрел исходники onnv-gate и illumos-gate из проекта openindiana, эти исходники никто не менял со времен opensolaris. Там действительно есть проверка, если в 64битном режиме поддерживаются инструкции AES, надо выполнять код от Intel, код референсный, вошел в ядро практически без изменений. Референсный код Intel произвел для библиотечки OpenSSL, которая должна уметь собираться после версии 0.9.8k с ускорением AES.

Во-первых, ускорение будет работать только, если я собираю приложение в 64 битном режиме.
Шифрование носителя в ZFS использует ядреные функции, на процессоре x86_64 с AES ускорение должно работать. IP sec должно работать, потому что использует ядерные функции криптографии.

Если я собираю приложение с использованием библиотек openssl из дистрибутива, то AES-NI мне может быть поможет, потому что версия  библиотечки в дистрибутиве 0.9.8o. Как бы проверить? Может производительность замерить?

Измерил для нескольких платформ #openssl speed aes
1) Intel(R) Xeon(R) CPU           X3430  @ 2.40GHz CPU1
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128 cbc      79323.54k   140119.04k   132770.39k   171447.64k   174181.03k
aes-192 cbc      55692.27k   144998.72k   155115.01k   161829.89k   166584.32k
aes-256 cbc      88309.22k   120232.79k   115128.49k   138101.76k   149831.68k

2) Intel(R) Xeon(R) CPU E31230 @ 3.20GH CPU 1
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128 cbc      71684.86k   112663.49k   163678.98k   167306.58k   193484.12k
aes-192 cbc      69780.21k   122104.45k   140046.76k    95495.85k    65088.17k
aes-256 cbc      33476.45k    97132.93k   147273.73k   153355.26k   154711.38k

Я бы не сказал, что есть разница между 3430 и E3-1230. Учитывая разницу в тактовой частоте, E3-1230 проигрывает.

Порылся в исходниках OpenSSL 1.0.0d обнаружил, что в релизной версии Intel AES-NI не применяется вообще ни при каких обстоятельствах. Чтобы применить AES-NI надо выкачивать из CVS и собирать development версию, причем оно собирается, как опциональный engine, который приложениям вроде Apache еще объяснять надо как использовать.

Надо всеже попробовать пересобрать OpenSSL с поддержкой AES-NI для этого надо бы приручить компилятор GCC с версией > 4.4.

1 комментарий:

  1. В OpenSSL 1.0.0 обнаружил дикий способ написания ассемблерного кода под целевую архитектуру. Они пишут псевдокод, который транслируется в ассемблер, вместо аппаратно зависимых инструкций вставляются байты-машинные коды. Так они обощли необходимость использования компиляторов с поддержкой AES-NI инструкций. Вывод: для сборки OpenSSL с поддержкой AES-NI подойдет штатный компилятор, в частности gcc 4.3 из дистрибутива OpenSolaris.

    ОтветитьУдалить