文件在线预览开源组件 kkFileView 配置优化

文件在线预览开源组件 kkFileView 配置优化

问题现象

使用文件在线预览开源组件 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_TYPERedisKK_SPRING_REDISSON_ADDRESS 为 Redis 的 IP 和端口号,让 kkFileView 使用 Redis 记录文件的缓存记录,这样一方面可以节省进程使用的内存,另一方面在进程重启后缓存记录不会丢失,会继续使用缓存预览(需要同时将 pod 的存储挂载到 k8s PVC),加快文件的预览速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值