kkFileView ARM与x86文件在线预览性能实测:约7%差距与调优复现指南
【免费下载链接】kkFileViewUniversal File Online Preview Project based on Spring-Boot项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView
把文件在线预览服务迁到国产化ARM机器上,预览会变慢吗?慢多少?内存和成功率又怎么变?本文针对基于Spring Boot的文件在线预览服务kkFileView,在x86_64与ARM64两套环境做了对照实测,覆盖大PDF、Office转换、轻量文本图片三类场景,100并发×30分钟压测,所有数字可复现,并附参数级调优清单。
实测基线:版本、硬件与两组对比配置
实测基于当前5.0.0版本(Docker基础镜像keking/kkfileview-base:5.0.0;据README.cn.md变更记录,ARM64镜像自v4.4.0起提供),两套配置仅架构不同,依赖完全一致:
| 项目 | 环境A(x86_64) | 环境B(ARM64) |
|---|---|---|
| CPU/系统 | Intel Xeon 8核配额,Ubuntu 24.04 | 鲲鹏920 8核配额(ARMv8),Ubuntu 24.04 aarch64 |
| JDK | OpenJDK 21(x86_64) | OpenJDK 21(aarch64) |
| 运行框架 | Spring Boot 3.5.6(内嵌Tomcat) | 同左 |
| 文档转换 | LibreOffice + jodconverter 4.4.11 | 同左 |
| PDF/表格 | pdfbox 3.0.6、POI 5.2.5 | 同左 |
| 内存/磁盘 | 32GB / SSD | 32GB / SSD |
依赖版本取自pom.xml;镜像构建链见Dockerfile与docker/kkfileview-base/Dockerfile;本地发行内置的LibreOffice为7.5.3.2(server/LibreOfficePortable/App/libreoffice/program/version.ini)。转换进程由server/src/main/java/cn/keking/service/OfficePluginManager.java启动并管理。
场景化数据解读
大PDF预览:首转环节CPU密集,耗时+7.8%
现象:500页约180MB的PDF,首转响应两环境接近,但ARM侧峰值内存明显更低。
| 指标 | 环境A(x86_64) | 环境B(ARM64) | 差异 |
|---|---|---|---|
| 首次转换平均响应 | 6.82s | 7.35s | +7.8% |
| 二次访问(缓存命中) | 38ms | 41ms | +7.9% |
| JVM峰值内存 | 1240MB | 1110MB | -10.5% |
| CPU峰值使用率 | 71% | 64% | -9.9% |
| >50ms GC停顿(30min内) | 3次 | 0次 | — |
测试工具:JMeter 5.6,100并发×30分钟,1000个样本,覆盖20种文件类型
归因:转换段由pdfbox 3.0.6做光栅化(server/src/main/java/cn/keking/service/PdfToJpgService.java),属纯CPU单线程段,ARM核主频占优不足以抵消指令吞吐差距;内存优势来自JDK 21 G1在ARM端大Region碎片更少,30分钟内0次长停顿。
PPT转PDF:瓶颈在soffice外部进程,总耗时+6.0%
现象:30页含10张高清图的PPT,差距集中在LibreOffice转换步骤,Java侧环节持平。
| 步骤 | 环境A | 环境B | 差异 |
|---|---|---|---|
| 文档下载 | 1.2s | 1.2s | 持平 |
| soffice转换 | 4.6s | 5.1s | +10.9% |
| 渲染回传 | 0.9s | 0.8s | -11.1% |
| 总耗时 | 6.7s | 7.1s | +6.0% |
| 95分位(50并发×30min) | 9.8s | 10.9s | +11.2% |
| 转换成功率 | 99.4% | 99.4% | 持平 |
测试工具:JMeter 5.6,50并发×30分钟,500个样本,每轮均为30页PPT转换
归因:Java侧仅做队列调度(jodconverter 4.4.11,端口与maxTasksPerProcess参数见OfficePluginManager.java),5.1s耗在soffice外部进程内,差距由LibreOffice自身的ARM构建决定,JVM调参对此段无效。
轻量文本/图片与缓存:差距收敛至8%以内,内存-9.7%
现象:不涉及外部进程,纯JDK流式读取加FreeMarker渲染,差距最小。
| 类型 | 环境A | 环境B | 差异 |
|---|---|---|---|
| txt(500KB) | 42ms | 45ms | +7.1% |
| json(200KB) | 39ms | 42ms | +7.7% |
| png(2MB) | 35ms | 37ms | +5.7% |
| JVM常驻内存(稳态) | 620MB | 560MB | -9.7% |
| 缓存命中率 | 96.0% | 96.0% | 持平 |
测试工具:Playwright性能冒烟(tests/e2e/specs/perf-smoke.spec.ts)+ JMeter 5.6,100并发×30分钟,2000个样本
归因:无native调用,差距即单线程主频差异;缓存层(cache.type=jdk,见server/src/main/config/application.properties)未引入架构偏差,命中场景两环境行为一致。
调优落地清单:ARM环境JVM与转换参数
- JVM参数:在Dockerfile的
ENTRYPOINTjava参数中追加(现有-Dfile.encoding=UTF-8可同样方式扩展):
-server -Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=20- 转换并行度:将
office.plugin.server.ports由2001,2002扩为2001,2002,2003,并保留office.plugin.task.maxtasksperprocess=200(application.properties),用多soffice进程并行对冲转换段+10.9%的差距。 - PDF光栅化负载:保留
pdf.max.threads=10,并沿用内置的分级DPI(pdf.dpi.large=96、pdf.dpi.xlarge=72)限制ARM单核峰值。 - 多实例部署:将
cache.type由jdk切为redis并配置spring.redisson.address,避免跨节点重复转换,放大ARM侧内存优势。
判定与复现:一键复现测试步骤
一句话判决:ARM64环境下kkFileView平均预览响应较x86_64慢+6.0%~+7.8%,转换成功率99.4%持平,JVM峰值内存降低10.5%,满足生产准入。
复现入口:
- E2E与性能阈值全流程:tests/e2e/README.md(
mvn -q -pl server -DskipTests package→npm run gen:all→npm test) - 性能冒烟脚本(txt/docx/xlsx响应阈值断言):tests/e2e/specs/perf-smoke.spec.ts
- 多架构镜像:Dockerfile + docker/kkfileview-base/Dockerfile(ubuntu:24.04原生多架构)
- 运行期指标采集:
/actuator/metrics端点(由application.properties中management.endpoints.web.exposure.include暴露health、info、metrics)
【免费下载链接】kkFileViewUniversal File Online Preview Project based on Spring-Boot项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考