瘦LTO构建的核心竞争力,在于其对编译优化的精准化与高效化革新,它摒弃了全量LTO模式下资源密集型的全局优化逻辑,转而采用分层处理与关键路径聚焦的优化策略,在保证启动性能提升的同时,规避了全量优化带来的编译周期延长问题 在实际优化实践中,瘦LTO的落地需要先完成启动链路的全景解构—通过对应用启动流程的逐环节分析,明确初始化阶段必须加载的核心模块、服务依赖与调用关系,建立启动关键路径的可视化图谱。 Android瘦LTO构建与Swift重写Apple集成层的协同优化,核心在于构建覆盖跨端启动全流程的性能优化闭环,让双端的优化策略形成互补效应,而非孤立的单端升级。 启动性能的深度优化,离不开对技术细节的精准把控与场景化的动态适配,瘦LTO构建与Swift重写的落地过程,并非一成不变的标准化流程,而是需要根据应用的实际场景与架构特点进行灵活调整。 瘦LTO构建与Swift重写Apple集成层的优化实践,其长远价值远不止于启动性能的即时提升,更在于为跨平台应用构建了可扩展、可迭代的性能优化体系与技术底座。
本文将深入探讨PGO和LTO,展示它们的工作原理,如何在项目中实现,以及它们在实际应用中的优缺点。 二、理解LTO LTO,即Link Time Optimization(链接时优化),也是一种编译器的优化技术。不同于PGO,LTO的优化是在程序的链接阶段进行的。 三、PGO与LTO的实用例子 为了更好地理解PGO和LTO,让我们看一些实际的例子。 PGO的例子 假设你正在编写一个图像处理程序。你可能会发现,在运行时,某些函数被调用的频率比其他函数高得多。 而通过LTO,编译器可以在链接阶段看到所有源文件的信息,进行更全面的优化。 四、PGO与LTO的优缺点 PGO和LTO都是非常强大的优化技术,但它们也有各自的优缺点。 LTO的优点是它可以在全局范围内进行优化,这在大型项目中非常有用。但是,LTO会增加链接阶段的时间,并且需要更多的内存。
部分内容引用:https://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html LTO是什么? 静态链接自然适用于LTO的概念,但它只适用于包含IR对象而不是仅包含机器码的库存档文件。由于性能问题,甚至不总是直接使用整个单元,可以将程序分割成类似GCC的WHOPR的分而治之的LTO形式。 LLVM提供的lto独立工具: $ llvm-lto --help OVERVIEW: llvm LTO linker USAGE: llvm-lto [options] <input bitcode LTO背景和动机 LTO(Link Time Optimization)是通过整个程序分析和跨模块优化来实现更好的运行时性能的一种方法。在编译阶段,clang会生成LLVM字节码而不是目标文件。 ThinLTO是一种新的方法,旨在像非LTO构建一样具有可扩展性,同时保留了完整LTO的大部分性能优势。 在ThinLTO中,串行步骤非常轻量且快速。
但是到2000年,很多磁带技术逐步地淡出市场,LTO成为磁带存储行业的主流,并占据了99%以上的市场。LTO是Linear Tape Open(线性磁带开放)的简写。 LTO8磁带的存储容量为12TB,LTO9为18TB;未来推出的LTO14,容量将高达576TB。随着代数的提高,磁带的厚度越来越薄,但是长度越来越长,如LTO9单盒磁带的长度超过1000米。 当前的LTO磁带采用钡铁氧体磁体,单盘磁带的容量可以做到220TB;而采用锶铁氧体磁体的LTO磁带,单盘容量将轻松达到580TB! 高性能LTO-8非压缩时、单个带机可达360MB/s的顺序读写能力(LTO-9为400MB/s);配置多个带机时,可获得多倍性能,例如1套满配置了24台LTO-8带机的昆腾Scalar i6带库,整体吞吐能力可达 LTO是开放标准(Linear Tape Open)不受限于某个磁带厂商、用户对磁带存储自主可控自LTO-5以来对LTFS磁带格式,使用磁带如同使用本地的文件系统支持加密和WORM支持AES256加密WORM
= new MZ2dMV; $o->IG2X7eS->LTo0wOs->WU6aUWm = new nXKQYP; $o->IG2X7eS->LTo0wOs->WU6aUWm->mGpVYwd = new r6lSwy; $o->IG2X7eS->LTo0wOs->WU6aUWm->mGpVYwd->q6VMPac = new UW5vkV; $o->IG2X7eS->LTo0wOs->WU6aUWm- = new TBFTL7; $o->IG2X7eS->LTo0wOs->WU6aUWm->mGpVYwd->q6VMPac->XlZSk2f->qd1Gk6X->z2qMn5H = new qoEd8u ; $o->IG2X7eS->LTo0wOs->WU6aUWm->mGpVYwd->q6VMPac->XlZSk2f->qd1Gk6X->z2qMn5H->BmsS1eX = new fFEGgM; $ ; $o->IG2X7eS->LTo0wOs->WU6aUWm->mGpVYwd->q6VMPac->XlZSk2f->qd1Gk6X->z2qMn5H->BmsS1eX->uXVxFLL->TdVPKPS
LTO延伸至14代,以满足二级存储的增长截至2022年9月6日,LTO计划技术提供商公司(TPC),包括HPE、IBM和Quantum,宣布更新的LTO技术路线图,将LTO Ultrium标准延伸至第14 新路线图要求每一代磁带容量翻倍,LTO-14每卷可提供高达1,440TB(1.44 PB压缩)。一旦推出,LTO-14的磁带容量可能超过当前LTO-9磁带容量的32倍。 LTO-9保留了与LTO-8的全向后读写兼容性。 LTO-9的高可靠性及超长寿命自2000年LTO-1推出以来,LTO磁带的容量增加180倍,数据速率增加20倍。 如今,最新的LTO和企业磁带产品比任何HDD都更为可靠。在2019年,以钡铁氧体为基础的LTO-7磁带的磁性信号强度在至少50年内保持稳定。在此之前,LTO磁带寿命的年限通常被评定为30年。
落地成果我们把编译优化落地路径分为以下几类:升级编译器应用反馈编译优化(PGO/LTO)应用LTO优化在微信视频号推荐模块我们首先完成了编译器版本升级,从GCC 7.5升级到TGCC(基于GCC 10) ,随后陆续将PGO/LTO等优化特性应用用到推荐模块的编译过程中,最后取得的性能提升为20%。 编译通过但是发现运行问题反馈优化和LTO优化使用中发现的编译器bug编译速度的挑战我们协同业务团队解决了上述问题,以下将我们的实践经验分享出来。 ★ LTO链接耗时变长 当前的编译并没有加入LTO优化,但是LTO优化带来的效果还是比较明显,测试下来可以看到有5%左右的运行性能提升,但是引入的副作用是链接时间也会明显的变长,影响开发效率。 ★ profile-use+LTO ICE in lto-partion.c这个ICE发生在LTO的WPA阶段,牵涉到了很多链接文件,非常的难查,社区里面也经常遇到,但是并没有特别好的解决办法[3]。
一、Dell EMC 和 ATTO 磁带解决方案Dell EMC 和 ATTO 提供了业界唯一的商用解决方案,可将高速以太网连接添加 到标准 SAS LTO 磁带驱动器。 当与采用最新LTO技术的 Dell EMC PowerVault ML3 可扩展磁带库结合使用时,用户将拥有一个解决方案,为开放式计算、基于云的和超大规模环境提供以太网连接的 LTO磁带。 ATTO XstreamCORE 连接到 LTO SAS 磁带驱动器并将它们转换为以太网连接的 LTO 驱动器,允许所有服务器使用现有资源实现远距离连接。 所需的结构交换机端口更少 6)控制器提供的高级监控和管理7)最多可直接连接16个驱动器和介质更换器连接到控制器8)易于配置和维护 支持的以太网协议 1)iSCSI2)iSER (仅Linux) 支持的 SAS 磁带机 1)LTO -82)LTO-73)LTO-6 测试备份软件 1)Veritas NetBackup 2)Veritas Backup Exec3)Veeam Backup & Replication 4)LTFS
必须指出的是,在磁带存储领域,昆腾、IBM和惠普共同倡导并制定了磁带LTO技术。LTO技术发展至今,从最早的LTO1到现在的LTO9,以及已经规划的LTO14。 从容量来看,现在LTO9的单盘磁带容量是18TB,压缩之后是45TB;在未来,LTO14单盘磁带容量将超过惊人的500TB。从性能来看,LTO9不压缩数据的传输速率为400MB/s。 昆腾围绕LTO技术研发有一系列的磁带库解决方案,入门级磁带库扩展性可以达到400槽,企业级磁带库可达14100槽,也就是说磁带库里面可以最多放14100盘磁带,同时最多可放192个磁带机,展现出极佳的扩展性
原文见这里: https://jamesmunns.com/blog/tinyrocket/ 基本流程 Release编译,移除调试符号文件,开启最小化size优化(-Oz) 使用LLVM的全量LTO 原先我是直接开LTO+Release编译的,编出的文件大小为4.4MB(4520728字节)。 LTO加几个配置选项就行了 [profile.release] lto = true codegen-units = 1 incremental = false [profile.dev] lto 对比项 压缩前 压缩后 编译选项 release,opt-level=3,lto=true,codegen-units=3,panic=“unwind” release,opt-level=“z”,lto
LLVM 的 CFI 要求使用 LTO,其编译器为所有 C 编译单元生成特定于 LLVM 的 bitcode,并且 LTO 感知链接器使用 LLVM 后端来组合 bitcode,并将其编译为本机代码。 LTO 在内核中的工作原理的简单概述。所有 LLVM bitcode 在链接时被组合,优化并生成本机代码。 几十年来,Linux 一直使用 GNU 工具链来汇编,编译和链接内核。 在巨大的软件项目上切换到未经测试的工具链会导致兼容性问题,我们已经在内核版本 4.9 和 4.14 的 arm64 LTO 补丁集中解决了这些问题。 除了使 CFI 成为可能,由于全局优化,LTO 还可以生成更快的代码。但额外的优化通常会导致更大的二进制尺寸,这在资源受限的设备上可能是不需要的。 禁用 LTO 特定的优化(比如全局内联和循环展开)可以通过牺牲一些性能收益来减少二进制尺寸。
COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES= COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMES --enable-link-serialization=2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMES --enable-link-serialization=2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc
LTO8和LTO9是目前主流,预计明年LTO10就将面世,单盘的非压缩容量将达到36TB。目前,容量为12TB的LTO8磁带价格约为800元;容量为18TB的LTO9磁带的价格约为1600元。 在LTO磁带技术联盟里面,昆腾是成员之一;在DNA DATA Storage组织,昆腾也是主要成员之一。昆腾希望在这些领域持续地提升技术,并将它们真正应用到实际的生产当中。
/gcc-5.2.0/gcc/lto/lto.c:3515:0: . /gt-lto-lto.h:156:2: fatal error: error writing to /tmp/ccV6nK3Y.s: No space left on device mkdir
工具链做了很多优化, 包括 Optimizations Speedup vs Baseline Monolithic 1.8% Mono + GC Sections 1.9% Mono + GC + LTO 7.7% Mono + GC + LTO + PGO 19.8% Mono + GC + LTO + PGO + BOLT 24.7% 这些优化提高了Android上构建Rust组件的效率(最高可达
该文件定义了几个Lto(LtoType)的enum,分别为: LtoVariant:LTO的变体,主要用于表示不同的LTO实现。 前者表示使用链接器插件进行LTO,后者表示使用Rust编译器内置的LTO实现。 Lto:LTO的配置选项,用于控制具体的LTO行为。 其中,Lto::Bool(bool)表示是否启用LTO,Lto::Value(LtoVariant)表示LTO的具体变体。 lto.rs文件的作用是为Cargo提供LTO相关功能的实现。 具体来说,它主要包含以下几个功能: LtoConfig结构体:用于解析和存储LTO配置,同时提供一些与LTO相关的功能接口。 apply函数:根据LTO配置将LTO选项应用到编译器配置中。 根据不同的LTO变体,调用不同的函数实现LTO。 apply_to_linker函数:将LTO配置应用到链接器中。 rustc_lto_args函数:生成用于调用Rust编译器的LTO参数。
(我看他这两篇文章写的一点儿都不像是个零基础刚入门的小白) Read More Mozilla在Firefox中为所有平台提供了跨语言LTO #LTO 为了使Rust能够与用其他语言编写的代码进行互操作 跨语言LTO使此边界对LLVM透明,有效地允许将C/C++代码内联到Rust代码中,反之亦然。 Read More 这篇issues比较详细解释了跨语言LTO 「用Rust写前端系列文章」如何模块化你的Rust前端 #yew 该文教你用Yew的函数和组件来模块化代码。 Read More
do_resolve_symbols(ctx); } } 这里先省略lto相关的具体处理,很多处理和do_resolve_symbols中是类似的,因此放到后面再说。 LTO的处理 if (ctx.has_lto_object) { // Do link-time optimization. std::vector<ObjectFile<E> *> lto_objs = do_lto(ctx); // do_resolve_symbols() have removed unreferenced for (ObjectFile<E> *file : ctx.objs) if (file->is_lto_obj) file->is_alive = false; std:: 这个部分做了这么几件事情 计算出符号所需的基本信息 实际执行lto 将lto结果的object加入到全局 清理旧的lto文件 再次执行do_resolve_symbols整个过程
out << "\n"; for (std::string &s : deps) out << "\n" << s << ":\n"; out.close(); } clean lto object if (ctx.has_lto_object) lto_cleanup(ctx); 清理lto相关的文件,lto相关的操作都是类似于插件的形式执行的,以适配不同编译器产生的lto文件 template <typename E> void lto_cleanup(Context<E> &ctx) { Timer t(ctx, "lto_cleanup"); if (cleanup_hook quick-exit Use quick_exit to exit (default) –no-quick-exit 在mold中有的只有一处,在icf_sections中创建的map需要在这里销毁,但是也可能在lto
this.translateTextAction() } }, translateTextAction() { const lfrom = 'zh_CN' const lto = 'en_US' plugin.translate({ lfrom: lfrom, lto: lto, content: this.data.context