问题现象
使用文件在线预览开源组件 kkFileView (kkview.cn)预览 word 大文件(50M以上)时没有正常显示文件内容,使用的是 k8s 部署。
问题分析
因为在预览 word 小文件时没有问题,只有在文件比较大时才有问题,所以认为可能是内存不足引起的,就先把 k8s pod 配置的内存从 1G 扩大到 2G,通过修改 k8s deployment 文件实现:
resources:
limits:
cpu: "1"
memory: 2Gi
requests:
cpu: "1"
memory: 2Gi
但是修改之后测试还是有问题。
通过查看 kkFileView 的源代码,发现除了主进程之外,还启动了两个进程进行文件转换(如将 word 转换为 pdf)。当预览文件比较大时,查看主进程日志,发现主进程和文件转换进程的连接中断重启了,应该是文件转换进程挂掉重启了,所以应该要扩大文件转换进程的内存。
024-04-12 15:21:38.705 INFO 1 --- [ter-poolentry-3] o.j.local.task.LocalConversionTask : Executing local conversion task [docx -> pdf]...
2024-04-12 15:22:15.244 INFO 1 --- [ssageDispatcher] o.j.local.office.OfficeConnection : Disconnected from 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
2024-04-12 15:22:15.245 WARN 1 --- [ssageDispatcher] o.j.l.o.LocalOfficeManagerPoolEntry : Connection lost unexpectedly; attempting restart
2024-04-12 15:22:15.245 INFO 1 --- [ssageDispatcher] o.j.l.office.LocalOfficeProcessManager : Restarting due to lost connection...
2024-04-12 15:22:15.247 INFO 1 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Process exited with code 137
2024-04-12 15:22:15.330 INFO 1 --- [er-offprocmng-0] o.j.local.office.OfficeDescriptor : soffice info (from exec path): Product: LibreOffice - Version: ??? - useLongOptionNameGnuStyle: true
2024-04-12 15:22:15.823 INFO 1 --- [er-offprocmng-0] o.j.local.office.OfficeDescriptor : soffice info (from help output): Product: LibreOffice - Version: 7.5.3.2 - useLongOptionNameGnuStyle: true
2024-04-12 15:22:15.909 INFO 1 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Starting process with --accept 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1;urp;StarOffice.ServiceManager' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2001_tcpNoDelay-1'
2024-04-12 15:22:17.006 INFO 1 --- [extShutdownHook] o.e.jetty.server.AbstractConnector : Stopped ServerConnector@3427b02d{HTTP/1.1, (http/1.1)}{0.0.0.0:8012}
2024-04-12 15:22:17.006 INFO 1 --- [extShutdownHook] org.eclipse.jetty.server.session : node0 Stopped scavenging
2024-04-12 15:22:17.008 INFO 1 --- [extShutdownHook] o.e.j.s.h.ContextHandler.application : Destroying Spring FrameworkServlet 'dispatcherServlet'
2024-04-12 15:22:17.009 INFO 1 --- [extShutdownHook] o.e.jetty.server.handler.ContextHandler : Stopped o.s.b.w.e.j.JettyEmbeddedWebAppContext@3e694b3f{application,/file-view,[file:///tmp/jetty-docbase.8012.7489575892966677003/],STOPPED}
2024-04-12 15:22:17.608 WARN 1 --- [er-offprocmng-0] o.j.l.o.StartProcessAndConnectRetryable : Office process died with exit code 81; restarting it
2024-04-12 15:22:23.222 INFO 1 --- [er-offprocmng-0] o.j.local.office.OfficeConnection : Connected: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
2024-04-12 15:22:23.222 INFO 1 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Started process; pid: 700
2024-04-12 15:22:32.104 INFO 1 --- [extShutdownHook] o.s.s.c.ThreadPoolTaskScheduler : Shutting down ExecutorService 'taskScheduler'
2024-04-12 15:22:32.105 INFO 1 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2024-04-12 15:22:32.106 INFO 1 --- [extShutdownHook] cn.keking.service.OfficePluginManager : Shutting down office process
2024-04-12 15:22:32.106 INFO 1 --- [extShutdownHook] o.j.c.office.AbstractOfficeManagerPool : Stopping the office manager pool...
2024-04-12 15:22:32.415 INFO 1 --- [ssageDispatcher] o.j.local.office.OfficeConnection : Disconnected from 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
2024-04-12 15:22:32.716 INFO 1 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Process exited with code 0
2024-04-12 15:22:32.809 ERROR 1 --- [ter-poolentry-3] o.j.local.task.LocalConversionTask : Local conversion failed.
com.sun.star.uno.RuntimeException: com.sun.star.lib.uno.environments.remote.JobQueue.removeJob - unexpected:java.lang.InterruptedException
at com.sun.star.lib.uno.environments.remote.JobQueue.removeJob(JobQueue.java:222) ~[jurt-4.1.2.jar!/:na]
at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:330) ~[jurt-4.1.2.jar!/:na]
at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:303) ~[jurt-4.1.2.jar!/:na]
at com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter(JavaThreadPool.java:87) ~[jurt-4.1.2.jar!/:na]
at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest(java_remote_bridge.java:636) ~[jurt-4.1.2.jar!/:na]
at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.request(ProxyFactory.java:146) ~[jurt-4.1.2.jar!/:na]
at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.invoke(ProxyFactory.java:128) ~[jurt-4.1.2.jar!/:na]
at com.sun.proxy.$Proxy80.storeToURL(Unknown Source) ~[na:na]
at org.jodconverter.local.task.LocalConversionTask.storeDocumentToURL(LocalConversionTask.java:214) ~[jodconverter-local-4.4.6.jar!/:4.4.6]
at org.jodconverter.local.task.LocalConversionTask.storeDocument(LocalConversionTask.java:192) ~[jodconverter-local-4.4.6.jar!/:4.4.6]
at org.jodconverter.local.task.LocalConversionTask.execute(LocalConversionTask.java:131) ~[jodconverter-local-4.4.6.jar!/:4.4.6]
at org.jodconverter.local.office.LocalOfficeManagerPoolEntry.doExecute(LocalOfficeManagerPoolEntry.java:121) [jodconverter-local-4.4.6.jar!/:4.4.6]
at org.jodconverter.core.office.AbstractOfficeManagerPoolEntry.lambda$execute$0(AbstractOfficeManagerPoolEntry.java:81) [jodconverter-core-4.4.6.jar!/:4.4.6]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_251]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_251]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_251]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_251]
刚才只是扩大了 pod 的内存,pod 里面运行了 3 个进程,1 个主进程和 2 个文件转换进程,应该让主进程使用 pod 内存的三分之一左右,剩下的内存供 2 个文件转换进程使用。因此在主进程的启动命令上增加参数:
command:
- java
- -jar
- -Xms700M
- -Xmx700M
- app.jar
修改后再测试没有问题。
同时修改 kkFileView 的配置项 KK_CACHE_TYPE
为 Redis
,KK_SPRING_REDISSON_ADDRESS
为 Redis 的 IP 和端口号,让 kkFileView 使用 Redis 记录文件的缓存记录,这样一方面可以节省进程使用的内存,另一方面在进程重启后缓存记录不会丢失,会继续使用缓存预览(需要同时将 pod 的存储挂载到 k8s PVC),加快文件的预览速度。