2016-05-25 3 views
0

Система представляет собой встроенное ядро ​​Linux/Busybox на небольшой встроенной плате с запущенным веб-сервером (Boa).Определение причины задержки/паузы - планировщик ядра и т. Д.

Мы видим, что некоторые большие задержки в ответах на веб-сервер - иногда> 500мс без причины, так что я копал ...

На Обильно рассеяния отладочных принтами в коде это, кажется, пришел вплоть до всего процесса просто ... останавливаясь на бит, таким образом, который я могу только предположить, должен быть процесс/поток прерывается другим процессом.

Использование операторов печати и clock_gettime() для вычисления времени, затраченного на обработку запроса, я вижу, что код достигает нижней части цикла while() (разбор ввода), печатает что-то вроде "Time so far: 5ms", а затем следующую строку на верхняя часть цикла будет печатать "Time so far: 350ms" - и все, что делает код между нижней частью цикла и первой печатью вверху, является базовой проверкой вдоль строк while(position < end), у нее нет ничего сложного, что могло бы задержать ее.

Нет блокировки ввода-вывода, данные, которые он обрабатывает, уже появились, и он не делает никаких внешних вызовов или не блуждает в сложные функции.

Я изучил вопрос о том, будет ли планировщик ядра (CFS в нашем случае), добавив звонки на clock() (время процессора, а не настенные часы), и снова вычисляем разницу во времени Vs используемое время процессора. Я вижу, что временная задержка настенного времени может превышать 300 мс от одного цикла к следующему, но зарегистрированное время обработки процессора (которое, кажется, имеет разрешение ~ 10 мс), больше похоже на 50 мс.

Итак, это предполагает, что планировщик задач удерживает процесс в течение сотен миллисекунд за раз. Я проверил scheduler granularity and max delay, и он нигде не близок к 100 мс, задержка планировщика установлена ​​на уровне 6 мс, например.

Любые советы о том, что я могу сделать сейчас, чтобы попытаться отследить проблему - определить процессы, которые могли бы затормозить CPU за> 100 мс, измерить/отслеживать, что делает планировщик и т. Д.?

ответ

0

Сначала вы должны попробовать и запустить свою программу с помощью strace, чтобы увидеть, есть ли какие-либо системные вызовы, удерживающие вещи.

Если это неоднозначно или не помогает, я предлагаю вам попробовать и профилировать ядро. Вы можете попробовать OProfile

Это создаст график вызовов, который вы сможете проанализировать и посмотреть, что происходит.

 Смежные вопросы

  • Нет связанных вопросов^_^