Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: titan83 от Апрель 04, 2014, 07:11



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


Название: Re: 99% загрузка времени ЦП программой
Отправлено: GreatSnake от Апрель 04, 2014, 10:09
Проблем может быть несколько:
- генерация большого кол-ва событий, которые не успевают обрабатываться.
- забытый таймер.
Поймать можно под отладчиком - периодически останавливаь и смотреть backtrace stack либо через callgrind.


Название: Re: 99% загрузка времени ЦП программой
Отправлено: titan83 от Апрель 08, 2014, 14:29
Спасибо за ваш комментарий.
Хотел уточнить - генерация большого кол-ва событий, которые не успевают обрабатываться.
Я так думаю, что два-три события в секунду не являются большим количеством? Сейчас наконец-то могу посмотреть динамику: загрузка процессора моей программой растет на 9-10% в час.
Буду по очереди отключать различные секции и смотреть на результат.


Название: Re: 99% загрузка времени ЦП программой
Отправлено: Bepec от Апрель 08, 2014, 14:35
Встраиваемые системы обычно имеют свои неприятные ограничения.


Название: Re: 99% загрузка времени ЦП программой
Отправлено: titan83 от Апрель 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'а), сократить нформационный вывод, по умолчанию оставив лишь сообщения об ошибках.
Но все же хотелось бы понять на будущее - почему файловые операции вызывают такое поведение системы?
Спасибо.


Название: Re: 99% загрузка времени ЦП программой
Отправлено: Bepec от Апрель 14, 2014, 10:41
Потому что запись на карту медленная. А если система на арме, то ещё и затратная. А вы забивали кеш своими данными постоянно. Висла я думаю система :D


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


Название: Re: 99% загрузка времени ЦП программой
Отправлено: Bepec от Апрель 14, 2014, 11:11
Никто кроме вас, вашего кода не видел. Мб у вас там пустые цикла в 10 потоках :D
Ищите сами :)