Golang之 golang binary超级压缩

Golang编译后二进制文件超级压缩方法

Posted by 董江 on Sunday, February 11, 2018

golang 二进制文件编译后,特别大, 不利于私有化部署和执行。 特别是kubernetes 安装,附带上etcd、coredns、kubeadm 以及 云平台组件,超过1.4G

Golang 二进制压缩方法

现象复现

先test Hello World代码

package main

import "fmt"

func main(){
 fmt.Println("hello world")
}
#include<stdio.h>

int main(){
    printf("Hello world!");
}

编译

dongjiang@dongjiangdeMacBook-Pro ~ %  go build -o go-binary main.go
dongjiang@dongjiangdeMacBook-Pro ~ %  gcc main.c -o c-binary
dongjiang@dongjiangdeMacBook-Pro temp % ls -l -h
total 4096
-rwxr-xr-x  1 dongjiang  staff    48K  2 11 01:22 c-binary
-rwxr-xr-x  1 dongjiang  staff   1.9M  2 11 01:22 go-binary
-rw-r--r--  1 dongjiang  staff    61B  2 11 01:21 main.c
-rw-r--r--  1 dongjiang  staff    71B  2 11 01:20 main.go

两者编译后,go-binary竟然是c-binary的41倍。仅仅只是输出Hello World,为什么Golang文件编译后的大小足足有2M呢?因为Golang程序它会静态链接某些运行时的库,而C程序则不是这种情况。那么如何缩减Golang程序大小呢

压缩方法

编译参数优化

通过指定编译参数的方式减小,-s 的作用是去掉符号信息。 -w 的作用是去掉调试信息

dongjiang@dongjiangdeMacBook-Pro temp % go build -ldflags "-s -w" -o go-ldflags main.go  
dongjiang@dongjiangdeMacBook-Pro temp % ls -l -h
total 7096
-rwxr-xr-x  1 dongjiang  staff    48K  2 11 01:22 c-binary
-rwxr-xr-x  1 dongjiang  staff   1.9M  2 11 01:22 go-binary
-rwxr-xr-x  1 dongjiang  staff   1.5M  2 11 01:28 go-ldflags
-rw-r--r--  1 dongjiang  staff    61B  2 11 01:21 main.c
-rw-r--r--  1 dongjiang  staff    71B  2 11 01:20 main.go

通过编译制定参数,文件虽然缩小,但是缩小的并不明显,由原来的1.9M大小,缩减到1.5M大小. 压缩比例21%

二进制邻位压缩机制 UPX 压缩

UPX (the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70%

通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行. 通过各系统的包管理工具一般可以自动安装 UPX。

例如 CentOS 上 epel 库 yum install -y upx。 MacOS 上通过 brew 安装brew install upx

dongjiang@dongjiangdeMacBook-Pro temp % brew install upx
dongjiang@dongjiangdeMacBook-Pro temp % upx -9 -o go-upx go-ldflags 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   1532320 ->    606224   39.56%   macho/amd64   go-upx                        

Packed 1 file.
dongjiang@dongjiangdeMacBook-Pro temp % ls -l -h                                
total 8296
-rwxr-xr-x  1 dongjiang  staff    48K  2 11 01:22 c-binary
-rwxr-xr-x  1 dongjiang  staff   1.9M  2 11 01:22 go-binary
-rwxr-xr-x  1 dongjiang  staff   1.5M  2 11 01:28 go-ldflags
-rwxr-xr-x  1 dongjiang  staff   592K  2 11 01:28 go-upx
-rw-r--r--  1 dongjiang  staff    61B  2 11 01:21 main.c
-rw-r--r--  1 dongjiang  staff    71B  2 11 01:20 main.go

基于通过方式二的可执行文件进行再次进行压缩,文件大小已经由原来的1.5M变为现在的192K,压缩比例61%

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付