colord-1.4.8-alt1 Если удалить файл ICC-профиля из отслеживаемого каталога в /usr/share/color/icc/ и положить его обратно, colord часто не может повторно зарегистрировать профиль на D-Bus, а объект профиля остаётся в памяти. Каждый такой случай увеличивает память процесса примерно на размер профиля. Если на системе регулярно переустанавливается пакет с несколькими сотнями ICC-профилей, colord за пару месяцев вырастает до нескольких гигабайт. Апстрим: https://github.com/hughsie/colord/issues/218 (там же разбор по исходникам 1.4.8). Воспроизведение (под root): cp /usr/share/color/icc/colord/FOGRA39L_coated.icc /tmp/test.icc cd-fix-profile /tmp/test.icc set-description "leak test" mkdir /usr/share/color/icc/test cp /tmp/test.icc /usr/share/color/icc/test/ ps -o rss= -C colord for i in $(seq 50); do rm /usr/share/color/icc/test/test.icc; sleep 2 cp /tmp/test.icc /usr/share/color/icc/test/; sleep 2 done ps -o rss= -C colord cd-fix-profile меняет описание, чтобы контрольная сумма отличалась от установленного профиля: дубликаты colord пропускает. Результат: на каждый неудачный цикл в журнале CdMain: failed to emit ProfileAdded: failed to register object: An object is already exported for the interface org.freedesktop.ColorManager.Profile at /org/freedesktop/ColorManager/profiles/icc_… Сбой происходит не каждый раз: в прогонах по 50 циклов было от 12 до 46 неудач, по ~125 КиБ на каждую (профиль 121 КиБ). Если удалить и заново поставить пакет с 307 профилями (177 уникальных), получается 177 предупреждений и около +70 МиБ. Ожидается: при удалении файла объект профиля снимается с регистрации, при повторном появлении регистрируется заново, память не растёт. Уборка: rm -r /usr/share/color/icc/test /tmp/test.icc; systemctl restart colord
Created attachment 22841 [details] Исправление утечек при удалении файла профиля (апстрим PR #219), для 1.4.8 Исправление отправлено в апстрим: https://github.com/hughsie/colord/pull/219 . Патч из этого PR прикреплён, на 1.4.8 накладывается чисто (patch -p1). Причина: при удалении файла профиля не освобождаются две ссылки, полученные с transfer full: 1. lib/colord/cd-icc-store.c, cd_icc_store_file_monitor_changed_cb(): CdIcc из cd_icc_store_find_by_filename() остаётся в памяти вместе с данными профиля. Это и есть рост памяти. 2. src/cd-main.c, cd_main_icc_store_removed_cb(): CdProfile из cd_profile_array_get_by_filename() не уничтожается, его объект остаётся на D-Bus, поэтому при повторном появлении файла выдаётся «already exported». Проверка на Sisyphus (демон и libcolordprivate с патчем, профиль 121 КиБ удаляется и возвращается): - 90 циклов: без патча RSS 13,5 → 24,9 МиБ, с патчем 13,3 → 13,3 МиБ; - 30 циклов: без патча 30 предупреждений «already exported», с патчем 0; профиль каждый раз регистрируется заново.
colord-1.4.9-alt0.5