Russian Qt Forum
Ноябрь 23, 2024, 14:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: 99% загрузка времени ЦП программой  (Прочитано 4165 раз)
titan83
Гость
« : Апрель 04, 2014, 07:11 »

Здравствуйте.
Написал я тут программку на Qt 4.8 для встраиваемой системы. Программа должна работать 24/7/365.
Сейчас наблюдаю такую неприятную картину - через 2-3 дня использования начинает ступенчато расти загрузка процессора, растет с 10% (штатный режим) до 99% и там и остается. В результате все адски тормозит, и хрен бы с ним только графический интерфейс, но и коммуникационный обмен тоже в опе(
Программка большую часть времени читает-пишет в ком-порты (QtSerialPort), и гораздо реже пишет в файлы.
git'ом пользовался крайне нерегулярно((( сам дурак.
Вопрос - как можно провести профилирование и понять, что именно вызывает это крайне нежелательное поведение?
Спасибо.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 04, 2014, 10:09 »

Проблем может быть несколько:
- генерация большого кол-ва событий, которые не успевают обрабатываться.
- забытый таймер.
Поймать можно под отладчиком - периодически останавливаь и смотреть backtrace stack либо через callgrind.
Записан

Qt 5.11/4.8.7 (X11/Win)
titan83
Гость
« Ответ #2 : Апрель 08, 2014, 14:29 »

Спасибо за ваш комментарий.
Хотел уточнить - генерация большого кол-ва событий, которые не успевают обрабатываться.
Я так думаю, что два-три события в секунду не являются большим количеством? Сейчас наконец-то могу посмотреть динамику: загрузка процессора моей программой растет на 9-10% в час.
Буду по очереди отключать различные секции и смотреть на результат.
Записан
Bepec
Гость
« Ответ #3 : Апрель 08, 2014, 14:35 »

Встраиваемые системы обычно имеют свои неприятные ограничения.
Записан
titan83
Гость
« Ответ #4 : Апрель 14, 2014, 10:15 »

Может кому-нибудь поможет, но разобрался я в своей проблеме.
В общем все дело было в файловых операциях.
Я пытался эмулировать syslog примерно такой конструкцией:
   
    systemLogFile.setFileName(SYSTEM_LOG_FILE + QDate::currentDate().toString());

    if (systemLogFile.open(QIODevice::Append))
    {
        systemStreamLog.setDevice(&systemLogFile);
    }
    else
    {
        return;
    }

    systemStreamLog << QDateTime::currentDateTime().toString("yyyy:MM:dd - hh:mm:ss ").toLocal8Bit();
    systemStreamLog << " - ";
    systemStreamLog << record;
    systemStreamLog << "\r\n";

    systemLogFile.flush();
    if (systemLogFile.isOpen())
    {
        systemLogFile.close();
    }

Т.е. открывал файл на запись в конец, записывал и закрывал. Все это делалось довольно часто (3-4 раза в секунду), небольшими порциями (около 100 байт) и на MicroSD карту.
В результате я имел постоянный рост дисковых кэшей (увидел в top'е) и такое же постоянное замедление программы.
Как только я убрал дисковые операции, все стало просто замечательно.
В качестве выхода из этой не очень приятной ситуации я планирую использовать настоящий syslogd (нашел в недрах busybox'а), сократить нформационный вывод, по умолчанию оставив лишь сообщения об ошибках.
Но все же хотелось бы понять на будущее - почему файловые операции вызывают такое поведение системы?
Спасибо.
Записан
Bepec
Гость
« Ответ #5 : Апрель 14, 2014, 10:41 »

Потому что запись на карту медленная. А если система на арме, то ещё и затратная. А вы забивали кеш своими данными постоянно. Висла я думаю система Веселый
Записан
titan83
Гость
« Ответ #6 : Апрель 14, 2014, 11:09 »

Потому что запись на карту медленная. А если система на арме, то ещё и затратная. А вы забивали кеш своими данными постоянно. Висла я думаю система Веселый
99% процессорного времени занимал именно мой процесс, при этом состоянии все остальное даже работало: 3g-соединение, ssh, т.е. я мог управлять системой.
На карту я писал меньше 0,5 килобайта в секунду, я, конечно, понимаю, что запись там блочная, но неужели все настолько печально?
Записан
Bepec
Гость
« Ответ #7 : Апрель 14, 2014, 11:11 »

Никто кроме вас, вашего кода не видел. Мб у вас там пустые цикла в 10 потоках Веселый
Ищите сами Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.