记载一次wkhtmltopdf生成pdf造成oom题目

[复制链接]
发表于 2025-7-9 00:35:33 | 显示全部楼层 |阅读模式
题目现象
有个生成pdf的接口,到处pdf为空;docker环境必现,但是本地环境无法复现
1、代码增长各处错误判断,发现docker环境调用接口出现
Loading pages (1/6)
[>                                                           ] 0%
[======>                                                     ] 10%
[======================>                                     ] 37%
[========================>                                   ] 41%
[==============================>                             ] 50%
[====================================>                       ] 61%
[======================================================>     ] 90%
signal: killed

2、查看docker系统日记
dmesg|grep "kill"
发现oom


查看资料后显示wkhtmltopdf创建pdf会造成高内存分配
优化pdf参数,题目得到解决
  1. // Configure PDF generator with memory-saving options
  2.     pdfg, err := wkhtmltopdf.NewPDFGenerator()
  3.     if err != nil {
  4.         return nil, fmt.Errorf("PDF generator initialization failed: %w", err)
  5.     }
  6.     pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
  7.     pdfg.Dpi.Set(96) // 1、设置dpi,降低内存使用
  8.     pdfg.NoCollate.Set(true)  // Disable collation to reduce memory
  9.     pdfg.Grayscale.Set(false)
  10.    
  11.     // Configure page with memory optimization settings
  12.     page := wkhtmltopdf.NewPageReader(r)
  13.     page.LoadErrorHandling.Set("ignore")
  14.     page.JavascriptDelay.Set(2000) // Allow time for JS to execute
  15.     pdfg.AddPage(page)
  16.     // Set environment variables for memory constraints
  17.     os.Setenv("QTWEBKIT_SETTINGS", "MaximumPages=1") //2、限制同时处理的页数,避免内存峰值
  18.     os.Setenv("QTWEBKIT_MAX_MEMORY", "256M") // Limit WebKit memory usage
  19.     // Create PDF with timeout
  20.     // 3、增加超时判断
  21.     pdfCtx, pdfCancel := context.WithTimeout(context.Background(), 5*time.Minute)
  22.     defer pdfCancel()
  23.     errChan := make(chan error, 1)
  24.     go func() {
  25.         defer close(errChan)
  26.         errChan <- pdfg.Create()
  27.     }()
  28.     select {
  29.     case err := <-errChan:
  30.         if err != nil {
  31.             return nil, fmt.Errorf("PDF generation failed: %w", err)
  32.         }
  33.     case <-pdfCtx.Done():
  34.         return nil, fmt.Errorf("PDF generation timed out")
  35.     }
  36.     // Return the generated PDF
  37.     return pdfg.Bytes(), nil
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-25 08:23 , Processed in 0.081022 second(s), 31 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表