Как интерпретировать вывод strace?
Мне нужно профилировать производительность приложения, для которого я использую strace. Тем не менее, я не знаю, как интерпретировать различные системные вызовы, исходящие из strace. Примеры некоторых из них приведены ниже:
(A) lseek(3, 1600, SEEK_SET) = 1600
(B) write(3, "G_DATA 300 0 "..., 800) = 800
(C) close(3) = 0
(D) mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b600b179000
(E) munmap(0x2b600b179000, 4096) = 0
(F) fstat(3, {st_mode=S_IFREG|0644, st_size=1600, ...}) = 0
Я был бы признателен, если бы кто-нибудь мог вкратце объяснить на простом английском языке, что эти строки от (А) до (F) действительно означают с точки зрения ввода-вывода, передачи данных, значимости для производительности и т.д.
Я просмотрел страницы руководства strace, но все же не очень уверен. Если у вас есть другие указатели на чтение, это будет здорово.
У меня есть опыт работы с операционными системами и понимание того, какие системные вызовы, память, виртуальная память, планирование и т.д.
Ответы
Ответ 1
Чтобы понять это, вам нужно ознакомиться с системными вызовами POSIX. Это интерфейс, который использует программа пространства пользователя для взаимодействия с ядром.
lseek
, write
, close
, mmap
, munmap
и fstat
- все системные вызовы и описаны в разделе 2 руководства по эксплуатации Linux.
Вкратце, lseek
перемещает внутренний указатель поставляемого файлового дескриптора в байт с позицией, на которую указывает второй аргумент, начиная с SEEK_SET
(начало), SEEK_CUR
(текущая позиция) или SEEK_END
(конец). Любые последовательные вызовы read
и write
для одного и того же дескриптора начнут свое действие с этой позиции. Обратите внимание, что lseek
не реализуется для всех типов дескрипторов - это имеет смысл для файла на диске, но не для сокета или канала.
write
копирует поставляемый буфер в ядерное пространство и возвращает количество фактически записанных байтов. В зависимости от типа дескриптора ядро может записывать данные на диск или отправлять их через сеть. Обычно это дорогостоящая операция, потому что она включает перенос этого буфера в ядро.
close
закрывает предоставленный дескриптор и любые связанные с ним ресурсы в ядре освобождаются. Обратите внимание, что каждый процесс имеет ограничение на количество одновременно открытых дескрипторов, поэтому иногда необходимо закрыть дескрипторы, чтобы не достигнуть этого предела.
mmap
- сложный системный вызов и используется для многих целей, включая общую память. Однако общее использование состоит в том, чтобы выделить больше памяти для процесса. Библиотечные функции malloc
и calloc
обычно используют его внутри.
munmap
освобождает память mmap
'.
fstat
возвращает различную информацию о том, что файловая система поддерживает размер файла, последний модификатор, разрешения и т.д.
Ответ 2
Для каждой команды есть страница руководства, ее можно прочитать, набрав man
и имя функции C, например. man lseek
(также проверьте apropos
). Они также имеют описание пройденных параметров.
Вот краткие сводки:
-
lseek
- переместить смещение чтения/записи файла дескриптора файла
-
write
- записать в дескриптор файла из буфера
-
close
- удалить дескриптор из таблицы ссылок на объект для каждого процесса.
-
mmap
- выделять память или отображать файлы или устройства в память
-
munmap
- удалить сопоставление для указанного диапазона адресов
-
fstat
- получить статус файла, на который указывает путь
Обратите внимание, что интерпретация одиночных/случайных сечений не будет иметь смысла с точки зрения производительности. Чтобы проверить значение при выполнении этих системных вызовов, вы должны использовать параметр -c
, который может подсчитывать время, вызовы и ошибки для каждого системного вызова и сообщать сводку. Затем вы можете прочитать больше об этих, которые занимают самое длинное время.
Чтобы узнать больше о параметрах вывода и strace
, отметьте man strace
.
Смотрите также: Как разобрать strace в оболочке в обычный текст?