UDF,оптимизация

M0r1arty
Дата: 07.08.2012 23:51:26
Доброе время суток. Сразу оговорюсь, что с Firebird практически не работал, поэтому прошу не пинать за незнание фундаментальных понятий.

Пишу UDF библиотеку под Linux 64bit. Главным критерием является скорость выполнения ф-ций. Тестовая площадка: ArchLinux 64(на VirtualBox), Firebird 2.5.1 собранный из исходников с включением флагов оптимизации по скорости "-O2 -march=core2", библиотека так же собирается с флагами оптимизации.

В процессе разработки встал вопрос производительности. Для теста на скорость вызова UDF была создана самая минимальная ф-ция:
extern "C" int NULLFUNC(void){ return 0;}


регистрация:
DECLARE EXTERNAL FUNCTION nullfunc 
RETURNS INTEGER 
ENTRY_POINT 'NULLFUNC' MODULE_NAME 'my_null';


проверка:
SET STATS ON; 
SET TERM ^ ; 
create or alter procedure PROC1 
as 
declare variable I integer; 
begin 
i = 0; 
while (i < 1000000) do 
begin 
nullfunc(); 
i = i+1; 
end 
end^ 
SET TERM ; ^ 
EXECUTE PROCEDURE PROC1;


на выходе:
Current memory = 1914400
Delta memory = 15016
Max memory = 2048064
Elapsed time= 2.98 sec
Cpu = 0.00 sec
Buffers = 75
Reads = 0
Writes = 0
Fetches = 23

Т.е. 3 секунды на 1 млн. итераций вызова пустой ф-ции.

Для сравнения запускал на Windows XP 64(хост система на которой виртуалка; к слову, никаким лишним софтом не загажена и работает быстро) такой же тест, только с другой ф-цией, которая дополнительно генерирует рандомное число и возвращает его в виде строки. РЕЗУЛЬТАТ: 1.36 секунды.

Как такое возможно, и что можно сделать, куда копать? Firebird дополнительно не настраивался ни на Windows, ни под Linux. Возможно, влияет то, что Linux крутится на VM, но свободного раздела (поставить его на живое железо и проверить) нет. Процессор поддерживает аппаратную виртуализацию, так что в потерю производительности из-за использования VM слабо верится.
Модератор: Пользуйтесь тегами
miwaonline
Дата: 08.08.2012 00:46:25
M0r1arty,

Оффтоп, но не могу сдержаться.

А что вы собираетесь делать со всеми этими оптимизациями? А то ведь СУБД - они для обработки данных предназначены и время выполнения отдельных функций - не самая критичная величина. Одним кривым запросом все ваши ухищрения можно поделить на ноль. Может, вы не то оптимизируете?
M0r1arty
Дата: 08.08.2012 02:40:28
miwaonline
M0r1arty,

Оффтоп, но не могу сдержаться.



СУБД СУБД`ом, а я пытаюсь выяснить причины падения производительности при вызове ф-ции. Возможно кто-то сталкивался, подскажет как он решил. Я сейчас даже не знаю кого подозревать - хоть виртуалку, хоть планировщик Linux.
M0r1arty
Дата: 08.08.2012 05:14:46
Сейчас проверил. Та же самая nullfunc отрабатывает на живой системе в цикле на 1 млн. итераций за 0.42 секунды. Против 2.98 сек. на виртуалке :(
dimitr
Дата: 08.08.2012 07:37:12
M0r1arty
Как такое возможно, и что можно сделать

это нормально. Ибо вызов UDF изнутри ядра СУБД имеет определенные нюансы (читай: накладные расходы) по сравнению с вашим собственным кодом. И это неизбежно и неотключаемо.
AWSVladimir
Дата: 08.08.2012 07:39:37
Давно не писал уже UDF, но в виртуалке (virtualBox) работаю уже более 5 лет.
У меня немножко другая система. Головная OS Linux, а дочерняя Windows.

По производительности тестов CPU практически скорость 1:1 , что в виртуалке Windows, что в нативной Windows.
При работе с файловыми системами скорость в виртуалке намного быстрее, чем нативной Windows (особенность линукс кеширования)
А у тебя система наоборот.
Могу посоветовать проверить опцию "Предел загрузки CPU", д/б 100%, но имхо не стоит под виндой строить тесты производительности в виртуалках на Linux системах, дело в том, что даже пустой линукс дистриб, абсолютно голый, может жестко тупить в виртуалке (в частности последняя убунта с слизаным аля мак декстопом).
Все тесты производительности для Windows систем идут на Ура!, а вот для линукс системы у меня не пошло, результат в виртуалке очень сильно отличается от реальной работы, поэтому забил. В виртуалке для линукса можно вычислять отностельную производительность, а не абсолютную, в отличие от Windows дочерней системы.
Покрайней мере у меня так.
kdv
Дата: 08.08.2012 10:50:44
M0r1arty
Т.е. 3 секунды на 1 млн. итераций вызова пустой ф-ции.

а та же процедура, но БЕЗ вызова функции? Странно вы сравниваете.

и насчет оптимизации тут верно сказали. ну получите вы 2 секунды вместо трех на 1 млн итераций. И что?

M0r1arty
собранный из исходников с включением флагов оптимизации по скорости "-O2 -march=core2", библиотека так же собирается с флагами оптимизации.

не советую. оптимизация какого-нибудь простенького кода - да, ок. оптимизация компиляции целиком СУБД - опасно. Где-нибудь вылезет бяка, не отловите же.
и потом, я не в курсе, но -march=core2 - это что - оптимизация на 2 ядра? я нахожу для -march только указание конкретной архитектуры проца. Вы, кстати, classic, sc, или superserver компилировали?
M0r1arty
Дата: 08.08.2012 11:21:04
dimitr
M0r1arty
Как такое возможно, и что можно сделать

это нормально. Ибо вызов UDF изнутри ядра СУБД имеет определенные нюансы (читай: накладные расходы) по сравнению с вашим собственным кодом. И это неизбежно и неотключаемо.


конечно, неизбежно, но разница в цифрах между системами глаз режет.
M0r1arty
Дата: 08.08.2012 11:23:48
AWSVladimir
Могу посоветовать проверить опцию "Предел загрузки CPU", д/б 100%


спасибо, проверю. я бы и сам с удовольствием на живом linux`е тестировал, но, кажется, написал уже, что нет места, поставить.
AWSVladimir
Дата: 08.08.2012 11:27:54
M0r1arty
AWSVladimir
Могу посоветовать проверить опцию "Предел загрузки CPU", д/б 100%


спасибо, проверю. я бы и сам с удовольствием на живом linux`е тестировал, но, кажется, написал уже, что нет места, поставить.


Бр-р-р, нет даже 200 рублей на загрузочную флешку?
Не верю!