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

Как интерпретировать вывод 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, но все же не очень уверен. Если у вас есть другие указатели на чтение, это будет здорово.

У меня есть опыт работы с операционными системами и понимание того, какие системные вызовы, память, виртуальная память, планирование и т.д.

4b9b3361

Ответ 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 в оболочке в обычный текст?