如何用UPX压缩本地可执行文件

470 阅读6分钟

博客用UPX压缩本地可执行文件

12月20日,2021年#native#feature

用UPX压缩本地可执行文件

作者:Clement Escoffier

UPX是一个开源的、可移植的、高性能的可执行文件打包器,最初创建于1996年。它将一个可执行文件作为输入,并产生一个压缩的可执行文件。在很久以前,当程序需要压缩以适应软盘时,某个年龄段的读者可能已经使用过UPX。20多年后的今天,UPX仍在摇滚。

在Quarkus 2.6中,我们在Quarkus构建中整合了UPX压缩。因此,Quarkus可以自动产生一个压缩的可执行文件。这篇文章解释了你如何使用这个新功能。但是,在进一步了解之前,你需要明白,没有什么是免费的。压缩后的可执行文件在磁盘上更小,但其内存占用率更高。因此,在使用它之前,请确保阅读 "大警告 "部分。

让你准备好

如果你在你的系统上安装了UPX或者使用容器内构建,Quarkus可以压缩你的可执行文件。

UPX在大多数操作系统上都是可用的。所以,你应该可以从他们的发布页面下载。UPX是跨平台的。所以你甚至可以从macOS或Windows机器上压缩一个Linux 64位的可执行文件。

如果安装UPX对你来说不是一个选择,你可以要求Quarkus使用容器内构建你的本地可执行文件(与-Dquarkus.native.container-build=true )。你将得到一个Linux 64位的可执行文件(对容器来说是完美的,但如果你不使用Linux,就无法从你的机器上使用)。容器内构建提供了UPX,以便它可以压缩可执行文件。当使用容器内构建时,你的机器上不需要GraalVM或UPX。这个选项在CI上特别有趣。

在这篇文章中,我们将使用第一种方法。构建本地可执行文件页面解释了如何使用容器内构建。

让我们得到一些可以压缩的东西

首先,我们需要一个应用程序。为了简单起见,让我们从code.quarkus.io/?a=upx-comp…,创建一个新的应用程序这个应用程序使用了RESTEasy Reactive及其对Jackson的支持,但压缩功能适用于任何项目,我们甚至不会去看代码。

在使用UPX之前,我们需要测量未压缩的本地可执行文件的磁盘空间和内存用量。要做到这一点,我们需要本机可执行文件。

> ./mvnw package -Dnative

结果可执行文件使用了~46MB的磁盘空间。

.rwxr-xr-x 46M clement 11 Dec 17:44 upx-compression-demo-1.0.0-SNAPSHOT-runner

现在,让我们来看看内存消耗情况。用以下方法启动该应用程序。

> ./target/upx-compression-demo-1.0.0-SNAPSHOT-runner

在另一个终端,用curl调用应用程序,并得到它的内存用量。

> curl http://localhost:8080/hello
Hello RESTEasy Reactive%

> rss runner
PID 0M COMMAND
3947 21M ./target/upx-compression-demo-1.0.0-SNAPSHOT-runner

所以,它需要21MB的RSS,基本上是它使用的RAM量。

rss 命令的功能如下。
rss () {
  pgrep $1 | xargs ps -o pid,rss,command -p | awk '{$2=int($2/1024)"M";}{ print;}'
}

查看Quarkus - 测量性能,了解更多关于RSS和如何测量的信息

配置压缩

为了压缩你的可执行文件,你需要配置压缩级别。压缩等级从1到10。

  • 1: 更快的压缩

  • 9: 更好的压缩

  • 10:最好的压缩(对大文件来说可能很慢)

application.properties 文件中配置级别。

quarkus.native.compression.level=7

这就是你需要做的全部工作,以启用压缩功能。

构建压缩后的本地可执行文件

让我们重新生成本地可执行文件。这一次,由于配置了压缩级别,Quarkus将对其进行压缩。

> ./mvnw package -Dnative
...
...
[INFO] [io.quarkus.deployment.pkg.steps.UpxCompressionBuildStep] Executing /usr/local/bin/upx -7 /Users/clement/Downloads/upx-compression-demo/target/upx-compression-demo-1.0.0-SNAPSHOT-runner
 Ultimate Packer for eXecutables
 Copyright (C) 1996 - 2020
 UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020

 File size            Ratio  Format      Name
 -------------------- ------ ----------- -----------
 46242352 -> 14774288 31.95% macho/amd64 upx-compression-demo-1.0.0-SNAPSHOT-runner

...

正如你所看到的,这一次,它运行UPX来压缩本地可执行文件。如果你检查一下大小,你应该得到15MB左右的东西。

.rwxr-xr-x 15M clement 11 Dec 18:03 upx-compression-demo-1.0.0-SNAPSHOT-runner

因此,我们从46M到15M;这是一个相当大的进步,即使它仍然不能装入软盘。

巨大的警告

然而,正如介绍中所说,没有什么是免费的。早些时候,我们还测量了未压缩的可执行文件(21MB)的内存使用量。让我们与压缩后的可执行文件进行比较。

运行该应用程序。

> ./target/upx-compression-demo-1.0.0-SNAPSHOT-runner

然后,在另一个终端,运行。

> curl http://localhost:8080/hello
Hello RESTEasy Reactive%

> rss runner
PID 0M COMMAND
4501 57M ./target/upx-compression-demo-1.0.0-SNAPSHOT-runner

57 MB!所以,它比未压缩的可执行文件多用了~2.7倍的RSS。这种开销是因为压缩后的可执行文件必须在启动时解压程序并将其存储在内存中。它也会增加启动时间,但这种启动开销在大多数情况下是微不足道的。

总结

UPX可以让你压缩你的本地可执行文件。在Quarkus 2.6中,你只需要配置压缩级别,然后就可以为你压缩了。

然而,不要以为这一切都是免费的。虽然磁盘空间的收益非常好,但不要忽视RSS的开销。

UPX压缩可以使CLI工具或磁盘空间受限的环境受益。对于长期运行的应用程序或微服务,RSS的开销会降低部署密度。所以,如果存储不是问题,或者部署密度对你来说至关重要,最好不要压缩你的可执行文件。

Quarkus是开放的。这个项目的所有依赖性都在Apache软件许可2.0或兼容许可下提供。

这个网站是用Jekyll建立的,托管在GitHub Pages上,是完全开源的。如果你想让它变得更好,请分叉该网站并向我们展示你的成果。

导航

关注我们

获得帮助

Quarkus是由社区项目组成的

CC by 3.0|隐私政策 赞助者