Ответ 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), статистика кеша страниц), например
Вас интересует левая часть этой диаграммы, рядом с блоком 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) фрагменты кода, чтобы выполнить некоторую агрегацию данных в ядре рядом с точкой трассировки:
Попробуйте инструменты 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