Проблемы с ICU
У нас тут поздний вечер, поэтому добрый вечер, товарищи.
В FB2.1 добавили поддержку кодовых страниц, которые обслуживаются внешней DLL. В Firebird 2.5 эту поддержку довели до ума. Однако, по моему, проблемы с ICU все еще есть. Причем конкретные.
Первое. Текущая родная сборка ICU не является устойчивой к многопоточному коду. Чтобы добиться этой самой устойчивости, нужно явно инициализировать эту библиотеку. Это форсирует создание объектов синхронизации, которые в противном случае будут создаваться по-требованию. Причем сам процесс создания ничем не защищен, поэтому в итоге — с монопольной инициализацией может повезти, а может и нет. Нашей тестовой системе — не везло. Поэтому та ICU, которую используем мы — она модифицирована для «самоинициализации» в DllMain. Серверу отчасти везет, потому что у него первое обращение к ICU является монопольным. Если я все правильно спутал.
Второе. После прогона тестов с текстовыми блобами (blob*large*) в тестовом процессе (который собственно работает с провайдером) и в сервере остается огромное количество висячей памяти. Размеры приблизительно одинаковые — ну там где-то под гиг.
В тестовом процессе, в добавок, еще остается куча незакрытых дескрипторов. Судя по всему это последствия регулярной выгрузки ICU из памяти тестового процесса. Хотя в нашей модифицированной ICU и присутствует её деинициализация… Память подсказывает, что были там какие-то проблемы с этой самой деинициализацией… За сутки, на миллионе тестов (blob*large*), утекает где-то под 1000 дескрипторов. Исследования показывают что это эвенты (события). Скорее всего это дескрипторы из критических секций, которые не были разрушены.
Если гонять тесты с родными кодовыми страницами сервера (WIN1251/BIG_5) — нет никаких проблем. Ни у сервера, ни у тестового процесса.
Если гонять тесты с текстовыми массивами (любые кодовые страницы) — то проблем в виде утечки ресурсов тоже нет.
Что там насчет обычных колонок — не знаю. Давно не запускал.
То есть пока утечка только на текстовых блобах с ICU-кодировками. Кстати, у провайдера и сервера разные подходы к ICU. В провайдере блобы конвертируется без рестартов конвертора ICU, то есть немного по-эффективнее. А утечки идентичные…
В целом, эта тема с ICU требует дополнительного изучения.
Зачем я это написал? Да так, чтобы обозначить проблему из за которой периодически приходится делать рестарт Firebird x64. 32-битный сервер, ясный пень, сам бы заклинился и, возможно, перезапустился. Кстати, надо будет, как нибудь, попробовать. Для разнообразия 🙂
Kovalenko on 2 февраля, 2011
Решил погонял эти тесты (blob*large*) более методично — завел «папку» со скриншотами состояний процессов и логами запусков.
По-моему, что-то в FB2.5.1.26182 (супер классик x64) поменялось. В лучшую сторону.
После прогона в Private Bytes зависает в два раза меньше памяти. Если сравнивать с 2.5.
Первый прогон: 397 272K
[ тут я гонял другие тесты: 417 036K ]
Второй прогон: 808 764K
Тестовая база каждый раз пересоздавалась.
Интересно, с чего бы это вдруг такое улучшение …