Эталонные следы памяти с Intel Pin приложений обработки пакетов
Я изучаю, как использовать Intel Pin, и у меня есть пара вопросов, касающихся процесса инструментария для конкретного варианта использования. Я хотел бы создать трассировку памяти для простого приложения обработки пакетов. Для этой цели я разработал необходимый пинтоин, и у меня следующие вопросы.
Предполагая, что я всегда использую одну и ту же трассировку сетевых пакетов в качестве входных данных для моего приложения обработки пакетов, и, скажем, я использую это же приложение на двух разных машинах. Как будут различаться следы памяти? Судя по всему Pin закрепляет пользовательское пространство и не зависит от архитектуры, поэтому я не ожидаю увидеть больших качественных различий в двух эталонных трассах выходной памяти. Это предположение верно?
Как изменится трассировка памяти, если я поэкспериментирую со скоростью, с которой я внедряю сетевые пакеты в мое приложение для обработки пакетов? Или это вообще изменится, и если да, то как я могу определить, как отличаются выходные трассы?
Спасибо
1 ответ
Я предполагаю, что вы делаете что-то, связанное с отслеживанием потока данных / потока кода сетевого пакета, возможно, тесно связанное с порчей данных?
Предполагая, что я всегда использую одну и ту же трассировку сетевых пакетов в качестве входных данных для моего приложения обработки пакетов, и, скажем, я использую это же приложение на двух разных машинах. Как будут различаться следы памяти?
Есть несколько факторов, которые могут сделать трассировку памяти совершенно другой, решающим моментом являются "две разные машины":
Точная копия той же ОС: трассировки практически одинаковы (поскольку стек, куча и менеджер виртуальной памяти будут работать одинаково), за исключением того, что адреса будут меняться (ASLR).
Та же ОС (но не обязательно та же версия общих библиотек системы): вероятно, такая же, как и выше, если нет перекомпиляции целевого приложения. Возможно небольшая разница из-за менеджера кучи, который может вести себя по-другому.
Разные ОС (где требуется перекомпиляция отслеживаемого приложения): совершенно разные трассировки.
Судя по всему Pin закрепляет пользовательское пространство и не зависит от архитектуры, поэтому я не ожидаю увидеть больших качественных различий в двух эталонных трассах выходной памяти. Это предположение верно?
Pintools необходимо перекомпилировать для разных арок, но сам pintool не должен изменять способ трассировки целевого приложения (тот же pintool + то же os + то же приложение = почти одинаковая трассировка).
Как изменится трассировка памяти, если я поэкспериментирую со скоростью, с которой я внедряю сетевые пакеты в мое приложение для обработки пакетов?
Это зависит от системы, а также зависит от ваших точек вставки. Если вы начнете отслеживать в recv()
или же recvfrom()
могут быть некоторые перегрузки или пропущенные пакеты (UDP), если, например, скорость слишком важна. Зависит от протокола, вашего окна приема и т. Д. Здесь действительно много факторов.
Или это вообще изменится, и если да, то как я могу определить, как отличаются выходные трассы?
Я бы, вероятно, проверил поток кода, а не поток данных для этого случая (мне кажется, проще). Если в точности один и тот же пакет, но разные скорости, если ветви кода не одинаковы (возможно, на уровне базового блока (BBL)), это сразу говорит о том, что один и тот же пакет обрабатывается по-разному.