Как правильно обрабатывать внеэкранный EGLContext в Linux при выполнении массивной задачи рендеринга?

Вот моя ситуация: я работаю над механизмом рендеринга видео, который работает на облачных серверах GPU с 64-битной ОС Ubuntu 16.04.

Движок слушает запросы пользователя, когда он получает запрос на рендеринг, он запускает поток, создает pbuffer EGLContext, рендерит видеокадры с помощью вызовов opengl, кодирует кадры в видеофайл, а затем уничтожает EGLContext. При получении нескольких запросов на рендеринг механизм рендеринга запускает несколько потоков и выполняет несколько задач параллельно. Кстати, я установил и уничтожил EGLContext объект, используя код из этого nvidia post.
Дело в том, что после большого количества задач рендеринга движок рендеринга будет случайным образом падать при вызове eglCreateContext, это происходит как для карт nVidia, так и для карт ATI. И я не знаю, это потому, что я делаю что-то неправильно с обработкой EGLContext, или это просто ошибка с драйвером Linux EGL.

Таким образом, вместо того, чтобы создавать EGLContext для каждой задачи рендеринга, я повторно использую ранее созданный EGLConext и просто для того, чтобы удалить все ресурсы OpenGL в конце каждой задачи рендеринга.
Но я обнаружил, что даже я удалил все Ресурсы OpenGL (я проверял и проверял еще раз), использование памяти не упадет до исходного уровня после завершения задачи рендеринга. Только после того, как я уничтожу EGLContext, память сбросит свой начальный уровень.

Теперь, что касается первого метода, ребята, вы когда-нибудь сталкивались с такой проблемой сбоев? Является ли код из сообщения nvidia правильным способом обработки EGLContext? Или я должен сделать что-то другое, когда дело доходит до быстрого создания и уничтожения EGLContext.
Что касается второго метода, я узнал из некоторых сообщений, что событие, которое вы вызвали, эти API OpenGL для удаления ваших ресурсов и заставили синхронизировать GPU с помощью glFinish, EGLContext может все еще иметь их в буфере. И я думаю, что это причина, по которой использование памяти падает после каждой задачи рендеринга, если я повторно использую «EGLContext». Но есть ли способ немедленно удалить эти ресурсы?


person Zhiqiang Li    schedule 16.01.2019    source источник
comment
Почему бы просто не запускать совершенно новый процесс для каждого запроса? Вы даже можете избавить себя от всех проблем с очисткой, потому что, когда процесс завершается, все его выделения в любом случае очищаются ядром ОС.   -  person datenwolf    schedule 16.01.2019
comment
привет @datenwolf, спасибо за ваше предложение, я никогда раньше не узнавал о процессе, после изучения я думаю, что это правильный способ делать что-то на облачном сервере. Я реализовал предложенный вами метод, сообщу вам, как он работает после некоторого тестирования. Спасибо еще раз!   -  person Zhiqiang Li    schedule 18.01.2019
comment
@datenwolf привет, извините за ответ с опозданием на полтора года. Мы воспользовались вашим советом, и все получилось отлично! Я добавлю ответ на этот вопрос, чтобы отметить его как правильный ответ. Большое спасибо!   -  person Zhiqiang Li    schedule 01.06.2020


Ответы (1)


В итоге мы создаем новый процесс для каждой задачи рендеринга, и все работает отлично! Спасибо @datenwolf!

person Zhiqiang Li    schedule 01.06.2020