2017-02-14 18 views
1

В Linux последнее значение счетчика программных средств (основного потока) представлено в /proc/$PID/stat. Это, по-видимому, простой и простой способ сделать некоторые выборочные профилирования без необходимости каким-либо образом использовать программу.Использование/proc/*/stat для профилирования

Мне интересно, если это имеет какие-либо оговорки, когда дело доходит до качества выборки. Я предполагаю, что это значение обновляется всякий раз, когда процесс истекает из его таймлиса, который должен происходить с полными случайными интервалами в программном коде и что образцы, взятые с длиной, превышающей длину времени, должны быть равномерно распределены в случайном порядке в зависимости от того, где программа фактически тратит свое время. Но это всего лишь предположение, и я понимаю, что это может быть неправильно в любом количестве способов.

Кто-нибудь знает?

ответ

-1

Если это работает, что она может, это будет иметь недостатки проф, который дргоЕ должен был исправить. Затем gprof имеет свой собственный shortcomings, который привел к многочисленным более современным профилировщикам. Некоторые из нас считают, что this являются наиболее эффективными и могут быть выполнены с помощью инструмента, такого простого, как pstack или lsstack.

+1

О, я очень согласен с тем, что ручная выборка с отладчиком часто самая приятная, но моя проблема в том, что я пытаюсь профилировать программу с программным обеспечением реального времени с кодом LLVM-JIT, что заставляет gdb принимать ~ 1 секунду (для чтения таблиц символов, созданных JIT), что нарушает ограничения в реальном времени. Поэтому я пытаюсь найти различные способы его отбора. :) – Dolda2000

+0

@ Dolda2000: Мысли: 1) Можете ли вы запустить все это под отладчиком, так что заплатите стоимость таблицы символов раньше? 2) Можете ли вы запустить его, не дожидаясь внешних событий?- если там есть какая-то потеря, это должно разоблачить его. 3) По моему опыту, это неважно, сколько времени требуется * после того, как я прервал его. Я могу весь день изучить его. Важно то, что само прерывание происходит в то время, когда программа непредсказуема, поэтому будет видно, что потеря будет в той степени, в которой требуется время. –

+0

Все остальное в стороне, я просто хотел бы сказать, что меня будет интересовать фактический ответ на вопрос, поскольку это поможет мне решить, когда и какие ситуации значение EIP из '/ proc/*/stat' может быть полезным. Но да, как и для 1) и 3), тогда проблема в том, что время для меня прерывать программу, печатать стеклу и возобновлять ее также занимает около секунды (преимущество вызова 'gdb' заново - это то, что я могу дать это опции '-batch -ex'). Если есть способ исправить это, это тоже будет очень интересно. Что касается 2), мне нужно запустить программу «в производстве», чтобы результаты были значимыми. – Dolda2000

1

Почему бы не попробовать современные встроенные инструменты linux, такие как perf (https://perf.wiki.kernel.org/index.php/Main_Page)?

Он имеет record режим с регулируемой частотой (-F100 для 100 Гц), со многими событиями, к примеру, на событии программного обеспечения task-clock без использования счетчиков производительности аппаратных средств (остановить perf с Ctrl-C или добавить sleep 10 права на образец в течение 10 секунд):

perf record -p $PID -e task-clock -o perf.output.file 

Перф работает для всех потоков без Инструментирование (перекомпиляции или код редактирования) и не будет мешать выполнению программы (только таймер прерывания слегка изменен). (Существует также некоторая поддержка выборки StackTrace с -g опции.)

Выхода может быть проанализирован в автономном режиме с perf report (только этой командой будет пытаться разобрать бинарные и разделяемые библиотеки)

perf report -i perf.output.file 

или преобразован в сырой ПК (EIP) с perf script -i perf.output.file.

PS: указатель EIP в файле/proc/$ pid/stat указан в официальной странице руководства linux 5 proc http://man7.org/linux/man-pages/man5/proc.5.html как kstkeip - «Текущий EIP (указатель инструкции)». Он читается в fs/proc/array.c:do_task_stateip = KSTK_EIP(task);, но я не уверен, где и когда он заполняется. Его можно записать на переключатель задачи (как на непроизвольном, когда tasklice заканчивается, так и на добровольной основе, когда задачи делают что-то вроде sched_yield) или при блокировке системных вызовов, поэтому, вероятно, это не лучший выбор в качестве источника выборки.

+0

Я действительно открыл 'perf record' сам и использовал его для некоторого успеха (как упоминалось в комментариях к ответу Майка), и я также создал простую программу на C, которая использует' libunwind', чтобы очень быстро получить полную стекцию от запущенного процесса. Тем не менее, я не совсем понимаю, на каком основании вы заключаете, что информация '/ proc/*/stat' является субоптимальной. – Dolda2000

+0

У меня нет точной идеи, когда обновляется поле «ip» '/ proc/*/stat'; может быть систематическое смещение блокировки системных вызовов. Он также ограничен временным разрешением (около 100 обновлений в секунду), когда 'perf' по умолчанию может допускать события с частотой 2-4 кГц (хорошо для коротких программ). Какой доступ вы использовали с libunwind, ptrace? – osgx

+0

Я предполагаю, что может быть такое предубеждение, но из того, что мы знаем до сих пор, я не вижу особого указания на то, что есть, или я чего-то не хватает? И да, я использовал ptrace-доступ с libunwind. – Dolda2000