Подтвердить что ты не робот

Перечислите все файлы, которые обрабатывает процесс эффективным образом

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

В настоящее время мы делаем это, используя LD_PRELOAD, предварительно загружая общую библиотеку, которая перехватывает вызовы библиотеки C, которые имеют дело с доступом к файлам. Этот метод эффективен без значительных издержек, но не является доказательством утечки.

Например, в общей библиотеке LD_PRELOAD у нас есть крючок для dlopen. Этот крючок используется для отслеживания доступа к общим библиотекам, но механизм не регистрирует третичные зависимости общей библиотеки.

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

Мысли?

4b9b3361

Ответ 1

Мы попытались использовать strace, но накладные расходы на использование strace были для нас не стартовыми.

strace медленный, поскольку он использует старую и медленную syscall для ptrace, чтобы быть чем-то вроде отладчика для приложения. Каждый syscall, созданный приложением, будет преобразован в сигнал в strace, вокруг двух системных вызовов ptrace от strace (также некоторые печати, доступа к другой памяти процесса для значений строки/структуры) и продолжения целевого приложения (2 контекстных переключателя). strace поддерживает фильтры syscall, но фильтр не может быть зарегистрирован для ptrace, а strace выполняет фильтрацию в пользовательском пространстве, отслеживая все системные вызовы.

Есть более быстрые решения на основе ядра, Брендан Грегг (автор Dtrace Book - Solaris, OSX, FreeBSD), есть много обзоров инструментов трассировки (в blog: отслеживание 15 минут, сверхдержавы BPF, 60s of linux perf, Выбор Tracer 2015 (с Magic pony), статистика кеша страниц), например

Брендан Грегг - Анализ и инструменты ядра Linux

Вас интересует левая часть этой диаграммы, рядом с блоком VFS. perf (стандартный инструмент), dtrace (поддерживается только в некоторых Linux, имеет проблемы с лицензией - CDDL несовместим с GPL), stap (systemtap, лучше работает с красными Linux, такими как CentOS).

Существует прямая замена strace - sysdig tool (требуется дополнительный модуль ядра, github), который работает для системных вызовов, таких как tcpdump, для обнюхивания сетевого интерфейса. Этот инструмент нюхает системные вызовы внутри ядра без дополнительных контекстных переключателей или сигналов или втыкается в другую память процесса с помощью ptrace (у ядра уже есть все строки, скопированные от пользователя), и он также использует интеллектуальную буферизацию для удаления следов в инструмент пользовательского пространства в огромных пакетах.

Существуют и другие универсальные трассировочные рамки/инструменты, такие как lttng (из дерева), ftrace/trace-cmd. И bcc с eBPF - очень мощная инфраструктура, включенная в современные (4.9+) ядра Linux (проверьте http://www.brendangregg.com/Slides/SCALE2017_perf_analysis_eBPF.pdf). bcc и eBPF позволяют писать небольшие (ans safe) фрагменты кода, чтобы выполнить некоторую агрегацию данных в ядре рядом с точкой трассировки:

Брендан Грегг список инструментов с открытыми окнами вокруг подсистем Linux

Попробуйте инструменты Brendan рядом с VFS, если ваше ядро ​​Linux достаточно последнее: opensnoop, statsnoop, syncsnoop; возможно, некоторые инструменты для файлов * (инструменты поддерживают фильтрацию pid с помощью -p PID или могут работать в рамках всей системы). Они частично описаны в http://www.brendangregg.com/dtrace.html и опубликованы в его github: https://github.com/brendangregg/perf-tools (также https://github.com/iovisor/bcc#tools)

Как и в Linux 4.9, ядро ​​Linux, наконец, имеет аналогичные исходные возможности, такие как DTrace....

opensnoop - программа для открытия файла snoop. Имя файла и дескриптор файла прослеживаются вместе с некоторыми подробностями процесса.

# opensnoop -g
  UID   PID PATH                                   FD ARGS
  100  3528 /var/ld/ld.config                      -1 cat /etc/passwd
  100  3528 /usr/lib/libc.so.1                      3 cat /etc/passwd
  100  3528 /etc/passwd                             3 cat /etc/passwd   
  100  3529 /var/ld/ld.config                      -1 cal
  100  3529 /usr/lib/libc.so.1                      3 cal

rwsnoop snoop для чтения/записи событий. Это измерение чтения и записи на уровне приложения - syscalls.

# rwsnoop
  UID    PID CMD          D   BYTES FILE
    0   2924 sh           R     128 /etc/profile
    0   2924 sh           R     128 /etc/profile
    0   2924 sh           R     128 /etc/profile
    0   2924 sh           R      84 /etc/profile
    0   2925 quota        R     757 /etc/nsswitch.conf
    0   2925 quota        R       0 /etc/nsswitch.conf
    0   2925 quota        R     668 /etc/passwd