生成报表内存溢出问题

 
      最近常在系统中发现内存不够用的情况,这里简单总结下对应场景和处理思路

背景:线上很多客户生成报表失败,由于采用是celery和异步方案,事后只能去查查日志,没发现异常情况,为了复现场景只能后台手动执行下脚本来生成,过程中用top,htop或者free来观察状态,发现在转pdf过程中内存一直增加,最         后不够用导致失败。生pdf存在该问题,rtf不存在。

分析:pdf的生成使用了第三方工具包,过程中使用shell命令调用执行,他的内部逻辑无法去控制和改变,所以只能从os层面和业务上想办法。

方案1:加物理内存,只能临时应付。而且比较麻烦,不能长久解决问题。交付物不变。

方案2:加swap,只能临时解决,不过比较简单方便,对于处理第一象限中紧急重要的事情可以这样做。交付物不变。
         具体方法如下:
 一、
dd if=/dev/zero of=/root/swap bs=1024 count=1024000
    count表示block的数量,一般一个block为1k,这样就创建了一个1G的文件。不过需要注意在/tmp目录下的文件,在系统重启后会清理,所以最后不要放在/tmp下。
 二、
    变为swsp分区
mkswap /root/swap
  三、
    使其变为有效状态
swapon /root/swap
  四、
    为了使其在重启后也有效。需要把信息写入/etc/fstab中。格式如下:
/root/swap              swap                    swap    defaults        0 0
  五、
   增加前:
            
   增加后:
            
 明显看到free 增加了1G,这时候在去执行生成报表的程序就OK了。

方案3:修改代码,分成多份报表提供给客户。这样就不会引发内存不够的问题。但需要客户同意,交付物改变。

方案4:长久方案,拆分成更细粒度 ,交付物改变。
从合理角度来看。方案4更加合理,其他就是临时紧急的修改方案。目前已经使用方案四进行改进了。
 

猜你喜欢

转载自wangleide414.iteye.com/blog/2260999
今日推荐