LINUX.ORG.RU

RSS vs heap, падение производительности

 , ,


0

2

Я уже писала о проблеме с 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?


Сложно отвечать на вопрос, когда задан вопрос и даны на него все возможные ответы.

Могу посоветовать valgrind --tool=massif, у него в выводе есть соотношение полезной и неиспользуемой части кучи. С отзывчивостью сложнее. В голову приходит только идея обернуть все подозрительные функции в обёртки, подсчитывающие затраченное время. Или использовать профилировщик, который делает это автоматически.

он позволяет решить проблему с фрагментацией.

Он пытается решить проблему фрагментации, но ничего не знает о том, что за кусок сейчас выделен и сколько он будет нужен. Может стоит использовать (сделать свой) slab-подобный аллокатор?

i-rinat ★★★★★
()

я бы посоветовал прогнать профайлер до тормозов и после и сравнить.

true_admin ★★★★★
()

И ещё можно через perf stat посмотреть что происходит. Может, там кол-во промахов кэша растёт со временем. Это повод задуматься.

true_admin ★★★★★
()

какая видяха и версия видеодров (месы)?

x4DA ★★★★★
()
Последнее исправление: x4DA (всего исправлений: 1)

Как часто переключаются текстуры? Сколько текстур и каких они размеров? С каким флагом создан vbo? Как выглядит вертекс?

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.