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 U
ltimate P
acker for eX
ecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小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%
「如果这篇文章对你有用,请随意打赏」
如果这篇文章对你有用,请随意打赏
使用微信扫描二维码完成支付