Я уже писала о проблеме с OpenGL/Qt4 приложении написанном на C++.
Тогда проблема оказалась в том, что на машине с Ubuntu монитор был подключен по VGA, а все энергосберегающие режимы были отключены. На других машинах мониторы были подключены по DVI, а энергосберегающие режимы включены, в том числе и для монитора.
Когда на машине с DVI монитор выключался или по бездействию уходил в энергосберегающий режим, контекст OpenGL терялся, что приводило либо к зависанию иксов, либо к зависанию приложения.
Разработчик OpenGL-движка пообещал исправить как руки дойдут, а пока обходимся `xset -dpms`.
Но вот новая напасть. Даже две.
Одна связана с потреблением памяти, другая с производительностью.
Если в приложении активен один источник данных, оно потребление памяти (RSS) с использованием jemalloc достигает 1.5 Gb. При этом google perftools стабильно говорит о том, что в куче 800 Mb. Когда приложение запускается количество примитивов (различных сущностей) доходит до максимум за полчаса. Дальше старые сущности удаляются, а новые добавляются на сцену. При этом отзывчивость интерфейса хорошая. Через двое суток размер потребляемой памяти тот же, количество примитивов то же. А вот отзывчивость ниже плинтуса. Если отключить обработку данных от источника данных, удалить все примитивы со сцены размер потребляемой памяти снизится, но отзывчивость останется той же: перемещение по сцене дикими рывками, меню и диалоги открываются с сильной задержкой.
Хотя, повторюсь, по количеству данных, сущностей на сцене и размеру потребляемой памяти ситуация не отличается от той, что была в начале, когда все быстро крутилось-вертелось.
Это что касается производительности. Тут у меня есть только одно предположение: фрагментация видео и оперативной памяти. Можно ли как-нибудь продиагностировать эту фрагментацию?
Вторая напасть: потребление памяти. Описанное выше происходит при использовании одного источника данных. Когда их пять, к примеру, количество сущностей возрастает кратно. А вот потребление памяти в процессе работы не останавливается на какой-то определенной цифре, а растет перманентно, даже тогда, когда количество сущностей доходит до максимума.
При это google perftools все так же говорит о том, что размер кучи не меняется. А вот значение RSS ползет.
Тут опять же в голову мне приходит фрагментация. Но даже использование jemalloc не спасает. А как мне казалось, он позволяет решить проблему с фрагментацией.
Что думаете по этому поводу?
1) Из-за чего возможно ситуация, когда RSS возрастает перманентно, а судя по показаниям google perftools размер кучи не меняется? Стек явно не причина.
2) Из-за чего возможно такое падение отзывчивости, при тех же условиях по количеству OpenGL-примитивов и размеру RSS?