Despliegue de la Aplicación, Reducir dimensión del compilado

¿Cómo reducir el tamaño de un programa compilado en Go?

Como se menciono, no se requieren dependencias para producir un archivo compilado en Go, incluso si este es para un sistema operativo diferente.

A diferencia de otros lenguajes como PHP o Python en donde se requiere tener el interprete y las librerías instaladas, para ejecutar una aplicación en Go todo lo que se necesita es tener el archivo compilado.

Supongamos que compilamos nuestra aplicación.

$ go build main.go

Esto va a generar un resultado con las siguientes características.

$ ls -la
-rwxr-xr-x    1 username  userid   2.0M Aug 28 23:51 main
-rw-r--r--    1 username  userid   241B Aug 21 22:33 main.go

En el ejemplo anterior el archivo compilado pesa 2 MB, aún y cuando apenas contiene algunas líneas. Esto se debe a que Go requiere incluir dentro del compilado todo lo requerido por el programa para ser ejecutado, incluyendo el run-time de Go. A diferencia de PHP o Python en donde este interprete es instalado en el servidor.

Para reducir el tamaño de un programa compilado en Go, algunos parámetros adicionales pueden ser especificados cuando se ejecuta el compilador. Estos parámetros permiten ignorar la tabla de símbolos, información de depuración, y la tabla de símbolos DWARF. Estas no son necesarias al momento de generar un release.

$ go build -ldflags="-s -w" main.go
$ ls -lh
-rwxr-xr-x  1 username  userid   1.6M Aug 28 23:59 main
-rw-r--r--  1 username  userid   241B Aug 21 22:33 main.go

El archivo se ha reducido de 2M a 1.6.

Existen casos en los que es necesario reducir aun mas el tamaño del compilado, como los dispositivos IoT (Internet Of Things) como Arduino o el Raspberry, que carecen de una cantidad significativa de espacio para almacenar aplicaciones. Para estos casos se puede hacer uso de la herramienta upx https://upx.github.io/, que permite una compresión adicional.

$ upx main
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95        Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   1657896 ->    622608   37.55%   macho/amd64   main

Packed 1 file.

UPX ha podido realizar una compresión del 37.55% de la aplicación.

$ ls -lh
-rwxr-xr-x    1 username  userid   608K Aug 28 23:59 main
-rw-r--r--    1 username  userid   241B Aug 21 22:33 main.go

El tamaño final del compilado es de solo 608K.

Si bien en un ambiente IoT el tamaño del compilado es importante, en otras situaciones comprimir el compilado no es necesario. Un ejemplo de esto son los servidores web, que almacenan cantidades bastante considerables de información.