暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一次打印字体导致宕机的学习

济南小老虎 2025-03-18
65

宕机日志

2025.2.6 
年后第一周, 客户现场出现了宕机的问题.
当时反馈了下hs_err的异常日志文件: 
Problematic frame:
C  [libfreetype.so.6+0x20070]  TT_Load_Glyph_Header+0x20
Current thread
JavaThread "http-nio-5200-exec-183" daemon [_thread_in_native
siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR)
sun.font.FreetypeFontScaler.getGlyphMetricsNative
com.stimulsoft.report.export.tools.pdf.PdfFonts.getFontMetrics
com.stimulsoft.report.export.tools.pdf.PdfFonts.initFontsData

当天同事就基于异常Bug发现了一个链接: 
https://backend-with-java.hashnode.dev/a-jvm-crash-analysis

上面的异常bug日志与我们的是很接近的. 


宕机可能的原因

CentOS系列的 tmp dev等路径是tempfs 内存文件系统
/tmp 目录作为临时文件存储
默认文件不发生变化的话 十天就会被清理. 
/var/tmp 下的文件是默认30天进行清理.

因为Springboot在默认启动时,如果不设置 临时文件存放路径.
默认选择的是系统环境变量里面的 临时空间,
也就是会选择到 tmp 路径下面

因为打印文件生成后一般只读不写, 所以这个文件一般会在十天左右被清理. 

根据第一部分里面的文章, 会议是这一块的fonts 文件缺失之后,
再进行渲染的时候就会导致宕机了.  


解决思路

1. 修改临时文件的目录: 
export JAVA_OPTS="-Djava.io.tmpdir=/custom/tmp"

这里有一个风险: 
临时目录还是要择机进行清理的
不然里面的文件会越来越多的. 
第二个风险: 
磁盘文件的性能不如内存临时文件
如果这里面需要大量的读取操作性能会衰退.

2. 安装字体文件到系统目录
之前跟同事聊过
打印控件优先去找/usr/share/fonts 目录下面的字体文件
找不到在应用特定目录下面去找, 然后为了提高性能
会将字体文件缓存到 tmp 目录下面去
所以如果使用系统目录, 理论上也可以避免使用/tmp
并且效果可能更好. 


自定义temp存在的问题

自己有一个环境 经常重启, 然后发现里面的文件就很多了:

[root@auto81 temp]# ll -ltrh |head -n 10
总用量 470M
drwxr-xr-x    3 root root   20 11月 30 2023 hip
-rw-r--r--    1 root root    0 11月 30 2023 sqlite-3.41.2.2-073e119f-06fc-4f54-abb0-a0c80dd94491-libsqlitejdbc.so.lck
-rwxr--r--    1 root root 974K 11月 30 2023 sqlite-3.41.2.2-073e119f-06fc-4f54-abb0-a0c80dd94491-libsqlitejdbc.so
drwxr-xr-x    4 root root   37 11月 30 2023 e9442fe3-19bb-4764-9b65-71812a710c67
drwxr-xr-x    4 root root   34 11月 30 2023 docconverter
-rwxrwxrwx    1 root root    0 11月 30 2023 serverlist.lock
-rw-r--r--    1 root root 5.9K 11月 30 2023 da23052d-fdf8-4c05-9329-bcb9fecd9f1f投资组织20231130.xlsx
drwx------    2 root root    6 11月 30 2023 cxf-tmp-1201195666473717660
drwxr-xr-x    4 root root   37 12月  1 2023 2620a676-d037-48eb-b654-01e3e44cab33
[root@auto81 temp]# ll -ltrh |tail -n 10
-rwxr--r--    1 root root 1.1M 3月  17 00:12 sqlite-3.47.0.0-3fa9738d-14aa-46b9-8e6f-1fcd06613592-libsqlitejdbc.so
-rw-r--r--    1 root root 3.9K 3月  17 00:44 d29afbbe-9471-4cbf-85e6-4a3f450d943dIPO企业指标.xlsx
drwxr-xr-x 1044 root root  52K 3月  17 04:16 basaoutput
drwx------    2 root root    6 3月  17 13:56 cxf-tmp-3436231278669006615
drwxr-xr-x    4 root root   37 3月  17 15:06 bcb70aab-fb56-4b5f-a318-00b07de5662c
drwx------    2 root root    6 3月  17 17:32 cxf-tmp-4062533689848447530
drwxr-xr-x    2 root root 4.0K 3月  17 19:22 poifiles
drwx------    2 root root    6 3月  17 19:33 cxf-tmp-290910658745261467
-rw-r--r--    1 root root    0 3月  17 19:35 sqlite-3.47.0.0-c1188630-9a23-46e8-8442-1c4717f711a5-libsqlitejdbc.so.lck
-rwxr--r--    1 root root 1.1M 3月  17 19:35 sqlite-3.47.0.0-c1188630-9a23-46e8-8442-1c4717f711a5-libsqlitejdbc.so
[root@auto81 temp]# du -ahd 1 |tail -n 
1.3G    .

并且文件数也很多.
[root@auto81 temp]# find . |wc -l
22274

这么多文件如果再往里面写入后者是查询 性能其实是有比较大的负面影响的. 

清理应该有一个基准, 应该是在启动成功后清理前两次启动成功之前的文件.


文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论