Стоит на линуксе firebird2.5-super-server 2.5.0.26054 - текущая последняя версия из дистрибутива дебиан 7.
Некоторое время назад размер процессов начал расти. Подтекает весьма интенсивно. В сутки 1-1.5 гб. Так что уже приходится перезапускать процесс.
Конфиг firebird.conf почти не трогался даже. Там только насчет UDF изменения.
Про то, что можно для каждой базы поменять настройки памяти никто в этой инсталляции не знает даже. То есть, все дефолтное.
Очевидная причина - самописные UDF.
Как бы определить утекает она из-за особенностей UDF или просто растет потому что так и должно быть ?
В базе всегда были UDF . библиотечка называлась ibu.c и меня уверяют, что все написано по канонам.
Код, вероятно, общеизвестный . Есть выделение памяти :
и такого рода несколько процедур, где этот malloc потом используется:
Однако мне не понятно каким образом эта память должна освобождаться.
FB получает результат, использует, а дальше что ?
Это вообще правильно написано ?
допустим, я нашел примеры написания udf,
там в том же ключе функции написаны. например такое :
Но кто обещал что примеры udf правильные ? какие еще могут быть причины ?
Куда теперь копать ?
Некоторое время назад размер процессов начал расти. Подтекает весьма интенсивно. В сутки 1-1.5 гб. Так что уже приходится перезапускать процесс.
Конфиг firebird.conf почти не трогался даже. Там только насчет UDF изменения.
Про то, что можно для каждой базы поменять настройки памяти никто в этой инсталляции не знает даже. То есть, все дефолтное.
Очевидная причина - самописные UDF.
Как бы определить утекает она из-за особенностей UDF или просто растет потому что так и должно быть ?
В базе всегда были UDF . библиотечка называлась ibu.c и меня уверяют, что все написано по канонам.
Код, вероятно, общеизвестный . Есть выделение памяти :
void* ib_util_malloc(long size) { return malloc(size); }
и такого рода несколько процедур, где этот malloc потом используется:
char * upcase(const char *s) { if (!s) return 0; char* buf = (char *) ib_util_malloc(strlen(s) + 1); char* p = buf; while (*s) { .. *p = '\0'; return buf; }
Однако мне не понятно каким образом эта память должна освобождаться.
FB получает результат, использует, а дальше что ?
Это вообще правильно написано ?
допустим, я нашел примеры написания udf,
там в том же ключе функции написаны. например такое :
+ |
Но кто обещал что примеры udf правильные ? какие еще могут быть причины ?
Куда теперь копать ?