Как интерпретировать вывод strace? - PullRequest
23 голосов
/ 13 июня 2011

Мне нужно профилировать производительность приложения, для которого я использую 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

Буду признателен, если кто-нибудь сможет кратко объяснить простым языком, что на самом деле означают эти строки от (A) до (F) с точки зрения ввода / вывода, передаваемых данных, значения производительности и т. Д.

Я просмотрел справочные страницы strace, но все еще не очень уверен в себе. Если бы вы дали мне другие советы, это было бы здорово.

Я немного знаком с операционными системами и понимаю, что такое системные вызовы, память, виртуальная память, планирование и т. Д.

Ответы [ 2 ]

21 голосов
/ 13 июня 2011

Чтобы понять это, вы должны ознакомиться с системными вызовами 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 возвращает различную информацию, хранящуюся в файловой системе о размере файла, последнем изменении, разрешениях и т. Д.

3 голосов
/ 11 апреля 2016

Для каждой команды есть страница справочника, которую вы можете прочитать, набрав man и имя функции C, например, man lseek (также проверьте apropos). У них также есть описание переданных параметров.

Вот краткие резюме:

  • lseek - изменить положение файлового смещения дескриптора файла
  • write - запись в дескриптор файла из буфера
  • close - удалить дескриптор из справочной таблицы объектов для процесса
  • mmap - выделить память или отобразить файлы или устройства в память
  • munmap - удалить сопоставление для указанного диапазона адресов
  • fstat - получить статус файла, на который указывает путь

Обратите внимание, что интерпретация единичных / случайных сискалей не будет иметь смысла с точки зрения производительности. Чтобы проверить значимость этих системных вызовов, вы должны использовать параметр -c, который может рассчитывать время, вызовы и ошибки для каждого системного вызова и сообщать сводку. Тогда вы можете прочитать больше о них, которые занимают больше всего времени.

Чтобы узнать больше о выходе и параметрах strace, отметьте man strace.

См. Также: Как преобразовать strace в оболочке в обычный текст?

...