Perfilado de código Go: encuentra cuellos de botella con pprof y trace

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Perfilado de código Go: encontrando cuellos de botella



La optimización del rendimiento es una de las tareas clave del desarrollador, especialmente cuando se trata de sistemas de alta carga en Go. Sin embargo, antes de optimizar algo, es necesario saber exactamente qué partes del código son los cuellos de botella. Para esto existe el perfilado — la recopilación y análisis de métricas de ejecución del programa.



En este artículo analizaremos cómo perfilar aplicaciones Go utilizando herramientas integradas: pprof y trace. Aprenderá a encontrar problemas relacionados con CPU, memoria, bloqueos y gorutinas, así como a interpretar los datos obtenidos.



¿Qué es el perfilado y para qué sirve?



El perfilado es el proceso de recopilar datos sobre el funcionamiento de un programa durante su ejecución. Estos datos ayudan a responder preguntas como:



  • ¿Qué funciones consumen la mayor parte del tiempo de CPU?
  • ¿Dónde se produce una gran asignación de memoria?
  • ¿Qué gorutinas se bloquean y en qué?
  • ¿Cuánto tiempo toma una llamada al sistema o una operación de entrada/salida?


Go proporciona potentes herramientas de perfilado directamente desde su instalación. Las principales son net/http/pprof para aplicaciones web y runtime/pprof para utilidades de línea de comandos.



Herramienta pprof: Perfiles de CPU y Memoria



pprof es la herramienta principal para el perfilado en Go. Puede recopilar perfiles de CPU, memoria, bloqueos, gorutinas y contención de mutex.



Añadir pprof a una aplicación web



La forma más sencilla de habilitar el perfilado es importar el paquete net/http/pprof:



package main

import ( "net/http" _ "net/http/pprof" // registra los manejadores de pprof)

func main() { // Su aplicación http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}


Después de esto, estarán disponibles varios perfiles en la dirección /debug/pprof/. Por ejemplo:



  • /debug/pprof/profile — perfil de CPU (por defecto 30 segundos)
  • /debug/pprof/heap — perfil de memoria (heap)
  • /debug/pprof/goroutine — volcado de todas las gorutinas
  • /debug/pprof/block — perfil de bloqueos


Recopilación del perfil de CPU



Para recopilar el perfil de CPU, use el comando:



go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30


Una vez finalizada la recopilación, se abrirá la consola interactiva de pprof. Los comandos más útiles son:



  • top — muestra las funciones que más CPU consumen
  • list <función> — muestra el desglose de tiempo línea por línea
  • web — abre el gráfico de llamadas en el navegador (requiere Graphviz)
  • peek <función> — muestra las funciones que llaman y son llamadas


Ejemplo de salida de top:



Showing nodes accounting for 3.50s, 70% of 5.00s total      flat  flat%   sum%        cum   cum%     1.20s 24.00% 24.00%      1.20s 24.00%  encoding/json.(*Decoder).Decode     0.80s 16.00% 40.00%      0.80s 16.00%  runtime.mallocgc     0.60s 12.00% 52.00%      1.80s 36.00%  main.processData     0.50s 10.00% 62.00%      0.50s 10.00%  runtime.memmove     0.40s  8.00% 70.00%      0.40s  8.00%  strings.ToLower


Recopilación del perfil de memoria



Para analizar el uso de memoria:



go tool pprof http://localhost:8080/debug/pprof/heap


Comandos importantes en pprof para memoria:



  • top — funciones que asignan más memoria
  • sample_index=alloc_space — cambiar a la cantidad total de memoria asignada
  • sample_index=inuse_space — cambiar a la memoria actualmente en uso
  • tr

Blogs

Book Recommendations