Opened 8 years ago

Closed 8 years ago

Last modified 8 years ago

#347 closed баг (fixed)

При обработке события ESL программа портебляет слишком много процессорного времени

Reported by: san Owned by: dimag
Priority: blocker Milestone: 1 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords: CPU load
Cc: alx

Description

На мой взгляд стоит обратить внимания на алгоритм обработки событий, явно не должны присутствовать такие "пики" потребления процессорного времени программой.
Картинка зафиксирована на ноутбуке (процессор достаточно мощный: Celeron N2830@2.16 GHz, двухядерный, ОС Windows 10)

Расшифровка подписей на картинке:
1."Простой" - пользователь и ещё один абонент в диспетчерской - ничего не происходит.(8-15%)

  1. Активно переключаюсь между вкладками программы, перемещаю селекты, провоцирую многократные перерисовки (10-20%)
  2. Каждый пик - событие mute или unmute у произвольного абонента (до 60%)
  3. Удаляю пользователя из Диспетчерской, диспетчерская закрывается, затем автоматически туда добавляется пользователь и ещё абонент (до 80%)
  4. Создание новой конф, затем добавление в неё абонента.

Attachments (1)

bug0829-1.png (31.5 KB ) - added by san 8 years ago.

Download all attachments as: .zip

Change History (10)

by san, 8 years ago

Attachment: bug0829-1.png added

comment:1 by san, 8 years ago

Cc: alx added

comment:2 by alx, 8 years ago

У меня есть два, пожалуй, риторических вопроса.

  1. Откуда известно, что нагрузка на CPU связана именно с событиями ESL? Если только со слов Дмитрия, то у меня вопрос: он пршел к такому выводы в результате проведенного исследования данной проблемы или просто сделал ни на чем не основанное предположение (уж простите, Дима, но много раз уже такое бывало)?
  2. Когда-то уже довольно давно было устное обсуждение проблемы, суть которой сводилась к тому, что программа может не успевать обрабатывать события, поступающие из коммутатора (Саша жаловался на большие задержки реакции программы). Дима объяснил это тем, что программа перерисовывает элементы на экране (например список пользователей) при получении каждого события (например об изменении состояний пользователей), а события могут поступать чаще чем программа успевает обновлять экран. В качестве решения Сашей было предложено (в моем переводе) реализовать механизм отложенного обновления, суть которого заключалась в том, что при получении события обновляется лишь внутренняя информация в памяти программы и запускается таймер, по истечение которого выполняется обновление экрана. Был ли реализован такой механизм?

comment:3 by san, 8 years ago

  1. На самом деле, связь прожорливости с событиями ESL предположил я. Как минимум, прожорливой программа становится именно в тот момент, когда появляется событие.

comment:4 by san, 8 years ago

Часть проблемы Дима обнаружил. По словам Димы это было связяно с выводом сообщений в Журнал.
В результате исправления пиковая загрузка CPU уменьшилась до 20-40%(зоны 3,4,5 на картинке).

comment:5 by dimag, 8 years ago

Keywords: CPU load added
Resolution: fixed
Status: newclosed

comment:6 by san, 8 years ago

Resolution: fixed
Status: closedreopened

comment:7 by dimag, 8 years ago

заменил текст редактор QTextEdit на QPlainTextEdit, запретил вывод списка пользователей, конференций, пользователей конференции до полного обновления содержимого соотвествующих списков.

comment:8 by san, 8 years ago

Milestone: Текущее1 очередь

comment:9 by alx, 8 years ago

Resolution: fixed
Status: reopenedclosed

Так как старый код, взаимодействовавший с FS и обрабатывавший приходящие из FS события (классы ESL, Commands, Events) полностью удален из проекта, полностью переписан код, выводящий списки конференций, пользователей, записей и т.п. (старым остался только код редактирования пользователей), этот тикет можно считать неактуальным (см. r725). Заркываю его с резолюцией fixed, так как, вероятнее всего, новый код не будет иметь проблем, связанных с производительностью.

Если к новому коду будут какие-то нарекания, создавайте, пожалуйста, новый тикет.

Last edited 8 years ago by alx (previous) (diff)
Note: See TracTickets for help on using tickets.