El equipo de Go anuncia un nuevo mecanismo integrado en Go 1.27 para localizar fugas de gorutinas en programas en ejecución, incluidos sistemas en producción. Se trata del goroutine leak profiler, accesible a través del paquete runtime/pprof como tipo de perfil goroutineleak, y también mediante los handlers de net/http/pprof, que lo exponen en /debug/pprof/goroutineleak. Quienes ya tengan net/http/pprof configurado no requieren cambios adicionales para empezar a usarlo.
El artículo explica por qué las fugas de gorutinas son un problema relevante: una gorutina se considera fugada cuando permanece bloqueada y las condiciones para desbloquearla jamás se cumplirán. Con el tiempo, la memoria y la CPU del recolector de basura se degradan, sobre todo si está activo GOMEMLIMIT. Herramientas previas como el detector de carreras, la biblioteca goleak de Uber o el paquete synctest de Go 1.25 cubren las pruebas unitarias, pero no son fiables a escala de producción.
A diferencia de los perfiles de gorutinas clásicos, este nuevo perfilador es preciso y genera pocos o ningún falso positivo, aunque limita su alcance a gorutinas bloqueadas permanentemente en canales o en primitivas del paquete sync. Para ilustrarlo, el texto reproduce un ejemplo típico de workers concurrentes con un canal sin búfer que, al retornar antes de tiempo por un error, deja a las emisoras bloqueadas para siempre. Tras ejecutar el programa de demostración y recoger el perfil con curl, pprof localiza el bloqueo exactamente en la línea ch <- result{res, err}. La corrección consiste en declarar el canal con búfer de tamaño len(ws), lo que permite a todas las emisoras enviar su resultado sin quedar atrapadas.
