内容提要
文章介绍了使用gzip压缩技术减少大量数据请求的带宽消耗和CPU资源的方法。作者发现开启gzip压缩后,应用服务器的CPU资源消耗增加,导致性能下降。通过分析发现,gzip压缩消耗大量CPU资源的原因是静态文件中包含大量重复字符,而gzip压缩可以通过距离加长度表达来减少字符数,从而降低带宽消耗。作者通过在本地生成.gz文件并配置nginx进行静态压缩,成功降低了CPU资源的消耗,提高了性能。最后,作者总结了适合动态压缩和静态压缩的场景,并表示这次优化是一次技能拓展的机会。
延伸解读
动态压缩与静态压缩的适用场景
文章通过实践总结出:纯静态且不会变化的文件适合静态压缩,即提前生成.gz文件,由nginx直接返回,避免实时压缩消耗CPU;而API接口返回的动态数据适合动态压缩,因为内容会变化,需要nginx根据响应实时压缩以节省带宽。这一区分有助于在实际部署中合理选择压缩策略。
性能优化中的瓶颈转移与排查思路
案例中,应用服务器CPU成为瓶颈,最初通过扩容机器未能根本解决。最终发现是nginx的gzip动态压缩消耗大量CPU。这提示我们,在高并发场景下,性能瓶颈可能出现在任何环节,包括看似简单的压缩操作。排查时应关注所有可能消耗资源的组件,而不仅仅是传统的I/O或数据库。
静态压缩带来的显著收益与实施要点
通过将gzip压缩级别从6调低至2,QPS勉强达到9万,但CPU仍很快打满;而改用静态压缩后,40台机器CPU仅7%,QPS可达27万,性能提升显著。实施静态压缩需要预先使用GZIPOutputStream等工具生成.gz文件,并确保nginx编译了ngx_http_gzip_static_module模块,配置gzip_static on即可。
Q&A
为什么开启 gzip 压缩后 nginx 服务器的 CPU 消耗反而增加了?
因为 nginx 的动态 gzip 压缩是在服务器端实时进行的,需要消耗 CPU 资源来压缩文件。当大量请求并发时,压缩计算会占用大量 CPU,导致 CPU 使用率飙升,成为性能瓶颈。
如何解决 nginx 动态 gzip 压缩导致的 CPU 性能问题?
可以采用静态压缩方案:预先在本地生成 .gz 文件,然后在 nginx 中配置 gzip_static on,这样 nginx 会直接返回已压缩好的 .gz 文件,不再实时压缩,从而大幅降低 CPU 消耗。
nginx 的动态压缩和静态压缩有什么区别?分别适用什么场景?
动态压缩是服务器在返回响应时实时压缩,消耗 CPU 资源,适合 API 接口返回的动态数据;静态压缩是直接返回预先压缩好的 .gz 文件,不消耗 CPU,适合纯静态不会变化的文件。
静态压缩优化后,nginx 的性能提升了多少?
优化后,40 台机器在 9 万 QPS 下 CPU 使用率仅为 7%,而之前 80 台机器 CPU 仍被打满。继续加压到 27 万 QPS 时 CPU 增长缓慢,整体性能提升超过 50 倍。
gzip 压缩的基本原理是什么?
gzip 是一种无损压缩技术,通过将文件中重复出现的字符用「距离加长度」的方式表达,减少字符数量,从而降低带宽消耗。压缩在服务端完成,传输中保持不变,直到客户端解压。
在 nginx 中配置静态压缩需要哪些步骤?
首先确保 nginx 编译了 ngx_http_gzip_static_module 模块;然后在本地使用 GZIPOutputStream 生成 .gz 文件;最后在 nginx 配置中添加 gzip_static on; 即可。