Проблемы с 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-битный сервер, ясный пень, сам бы заклинился и, возможно, перезапустился. Кстати, надо будет, как нибудь, попробовать. Для разнообразия 🙂

2 комментария

Kovalenko  on 2 февраля, 2011

Решил погонял эти тесты (blob*large*) более методично — завел «папку» со скриншотами состояний процессов и логами запусков.

По-моему, что-то в FB2.5.1.26182 (супер классик x64) поменялось. В лучшую сторону.

После прогона в Private Bytes зависает в два раза меньше памяти. Если сравнивать с 2.5.

Первый прогон: 397 272K
[ тут я гонял другие тесты: 417 036K ]
Второй прогон: 808 764K

Тестовая база каждый раз пересоздавалась.

Интересно, с чего бы это вдруг такое улучшение …

Проблемы с ICU. Подход #2. | Блог разработчика IBProvider | Инновации для Firebird и Interbase  on 23 августа, 2011

[…] Кроме утечек ресурсов, связанных с ICU. Я о них тут уже писал. Полгода назад. А сейчас вот предпринял повторною […]

Leave a Comment