Название: 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
Ищите сами :) |