Что означает предупреждение OProfile "отбрасывание образца гиперпространства"?
При использовании статистического профилировщика выполнения OProfile для визуализации профиля графа для моего C-приложения оно несколько раз включает следующее предупреждение. Предупреждение довольно загадочно для меня:
warning: dropping hyperspace sample at offset 1af9 >= 2be8 for binary /home/myuser/mybinary
Я использую OProfile в виртуальной среде Xen, например:
modprobe oprofile timer=1
opcontrol --no-vmlinux
opcontrol --start
(wait for profiling data to accumulate)
opcontrol --stop
opreport --session-dir=/var/lib/oprofile --exclude-dependent --demangle=smart \
--symbols /home/myuser/mybinary --callgraph
Полный вывод последней команды:
Overflow stats not available
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
warning: dropping hyperspace sample at offset 84d0 >= 79a0 for binary /home/myuser/mybinary
warning: dropping hyperspace sample at offset 7ac0 >= 79a0 for binary /home/myuser/mybinary
warning: dropping hyperspace sample at offset 7d90 >= 79a0 for binary /home/myuser/mybinary
warning: dropping hyperspace sample at offset 7ac0 >= 79a0 for binary /home/myuser/mybinary
warning: dropping hyperspace sample at offset 7d90 >= 79a0 for binary /home/myuser/mybinary
warning: dropping hyperspace sample at offset 8210 >= 79a0 for binary /home/myuser/mybinary
samples % symbol name
-------------------------------------------------------------------------------
После этого он печатает правдоподобные данные графа вызовов.
Что означает предупреждение о гиперпространстве? Что вызывает это? Влияет ли это на результаты профилирования? Как я могу это исправить?
1 ответ
Мейнард Джонсон объясняет это предупреждение в сообщении в список рассылки:
Сообщалось о случаях, когда выборки, записанные драйвером ядра oprofile, по-видимому, были отнесены к неправильному двоичному файлу, в частности, если частота выборки очень высока или при профилировании графа вызовов (поскольку профилирование графа вызовов, как и высокая частота выборки, также приводит к очень высокие издержки драйвера ядра oprofile и переполнения его внутренних буферов сэмплов). Я подозреваю, что это то, что вы сталкиваетесь. К сожалению, это очень коварная ошибка, и пока никто не смог найти причину. Драйвер ядра сообщает о количестве переполнений своих внутренних буферов, и журнал oprofiled их выводит. Для удобства, начиная с oprofile 0.9.5, opreport также выводит предупреждение, когда находит ненулевые значения переполнения и предлагает уменьшить интервал выборки.
Я предлагаю заглянуть в ваш /var/lib/oprofile/samples/oprofiled.log и найти статистику переполнения для вышеуказанного запуска профиля (записи журнала имеют временную метку). Если вы видите только несколько или очень небольшой процент (скажем, менее 3%), вы можете просто игнорировать аномалии. В общем, чтобы избежать / ограничить такого рода вещи, вы должны профилировать с наименьшей практической частотой дискретизации, особенно когда вы выполняете профилирование с помощью callgraph. Так что я подразумеваю под "практическим"? Ну, как и с любым профилировщиком на основе выборки, oprofile имеет статистический характер. И чем больше у вас точек данных, тем больше уверенности в них. Таким образом, для 100% уверенности, вы должны (теоретически) профилировать со значением счетчика "1". Однако это не слишком практично, поскольку ваша машина может заблокироваться, поскольку большая часть выполняемой работы - это запись сэмплов. Для профилирования событий циклов вы, вероятно, можете использовать значение счетчика в несколько миллионов или около того (на современных процессорах) и при этом быть достаточно уверенным в данных. Для других событий это действительно зависит от их частоты возникновения.