¿Qué significan estas llamadas al sistema strace?

5 minutos de lectura

Avatar de usuario de Ketan Maheshwari
Ketan Maheshwari

Necesito perfilar el rendimiento de una aplicación para la que estoy usando strace. Sin embargo, realmente no sé cómo interpretar las diversas llamadas al sistema que emite strace. Ejemplos de algunos de ellos están a continuación:

(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

Estaría agradecido si alguien pudiera explicar brevemente en inglés simple qué significan realmente estas líneas de (A) a (F) en términos de E/S, datos transferidos, importancia en el rendimiento, etc.

Revisé las páginas de manual de strace pero todavía no tengo mucha confianza. Si tienes algún otro consejo para que lo lea, sería genial.

Tengo algo de experiencia en sistemas operativos y entiendo qué son las llamadas al sistema, la memoria, la memoria virtual, la programación, etc.

  • strace es más una herramienta de depuración que un generador de perfiles. ¿Estás realmente buscando algo como gprof?

    – Pato

    13 de junio de 2011 a las 19:24

  • Estoy de acuerdo. Dado que ‘strace’ solo le mostrará las llamadas al sistema, lo mejor que puede hacer es ver una gran brecha de tiempo entre las llamadas al sistema e intentar averiguar qué estaba haciendo el programa entre esas llamadas que demoraron tanto. Esta no es una buena manera de perfilar. En su lugar, utilice ‘callgrind’ (parte de ‘valgrind’) y analice los resultados con ‘kcachegrind’. O utilice gprof, sysprof, oprofile o similares.

    –David Schwartz

    14 de agosto de 2011 a las 17:44

  • Debe leer la página de manual de las llamadas al sistema que se realiza aquí. correr man lseek , man open , man mmap y así.

    – nos

    23 de febrero de 2014 a las 18:26


Avatar de usuario de Blagovest Buyukliev
Blagovest Büyükliev

Para comprenderlos, debe familiarizarse con las llamadas al sistema POSIX. Son la interfaz que utiliza un programa de espacio de usuario para interactuar con el kernel.

lseek, write, close, mmap, munmap y fstat son todos llamadas al sistema y están documentados en la sección 2 del manual de Linux.

Brevemente, lseek mueve el puntero interno del descriptor de archivo proporcionado al byte con la posición señalada por el segundo argumento, comenzando desde SEEK_SET (el principio), SEEK_CUR (posición actual) o SEEK_END (el fin). Cualquier consecutivo read y write las llamadas en el mismo descriptor comenzarán su acción desde esta posición. Tenga en cuenta que lseek no está implementado para todo tipo de descriptores; tiene sentido para un archivo en el disco, pero no para un socket o una tubería.

write copia el búfer suministrado en kernelspace y devuelve el número de bytes realmente escritos. Según el tipo de descriptor, el núcleo puede escribir los datos en el disco o enviarlos a través de la red. Por lo general, esta es una operación costosa porque implica transferir este búfer al núcleo.

close cierra el descriptor suministrado y se liberan todos los recursos asociados con él en el kernel. Tenga en cuenta que cada proceso tiene un límite en la cantidad de descriptores abiertos simultáneamente, por lo que a veces es necesario cerrar los descriptores para no alcanzar este límite.

mmap es una llamada de sistema compleja y se usa para muchos propósitos, incluida la memoria compartida. Sin embargo, el uso general es asignar más memoria para el proceso. Él malloc y calloc las funciones de biblioteca generalmente lo usan internamente.

munmap libera el mmapped memoria.

fstat devuelve diversa información que el sistema de archivos guarda sobre un archivo: tamaño, última modificación, permisos, etc.

  • Gracias por una respuesta rápida. Por manual de linux, ¿te refieres a las páginas de manual o es un documento separado?

    – Ketan Maheshwari

    13 de junio de 2011 a las 18:30

  • Sí, las páginas man. Por ejemplo, man 2 write o man 2 mmap.

    – Blagovest Büyükliev

    13 de junio de 2011 a las 18:30

  • Muy bien, eché un vistazo a estos. Sin embargo, solo explican lo que hacen las llamadas. ¿Cómo puedo saber la importancia relativa de estas llamadas con respecto al rendimiento general?

    – Ketan Maheshwari

    13 de junio de 2011 a las 18:41

  • @ketan: pasando el -r opción a strace

    – ninjalj

    13 de junio de 2011 a las 19:47

  • ¿Qué significa el número a la derecha del signo igual?

    – 425nesp

    17 ene a las 21:50

avatar de usuario de kenorb
kenorb

Para cada comando hay una página de manual, puede leerla escribiendo man y el nombre de la función C, por ejemplo man lseek (también verifique apropos). También tienen descripción de los parámetros pasados.

Aquí hay breves resúmenes:

  • lseek – reposicionar el desplazamiento de archivo de lectura/escritura del descriptor de archivo
  • write – escribir en un descriptor de archivo desde el búfer
  • close – eliminar un descriptor de la tabla de referencia de objetos por proceso
  • mmap – asignar memoria o asignar archivos o dispositivos a la memoria
  • munmap – eliminar una asignación para el rango de direcciones especificado
  • fstat – obtener el estado del archivo señalado por la ruta

Tenga en cuenta que la interpretación de syscales únicos/aleatorios no será significativa en términos de rendimiento. Para probar la importancia del rendimiento de estas llamadas al sistema, debe usar -c parámetro que puede contar el tiempo, las llamadas y los errores para cada llamada al sistema e informar el resumen. A continuación, puede leer más sobre los que están tardando más tiempo.

Para obtener más información sobre la salida y strace parámetros, comprobar man strace.

Ver también: ¿Cómo analizar strace en shell en texto sin formato?

¿Ha sido útil esta solución?