当前位置: 代码迷 >> 报表 >> 生成报表内存溢出有关问题
  详细解决方案

生成报表内存溢出有关问题

热度:451   发布时间:2016-04-29 01:51:27.0
生成报表内存溢出问题
?
? ? ? 最近常在系统中发现内存不够用的情况,这里简单总结下对应场景和处理思路

背景:线上很多客户生成报表失败,由于采用是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更加合理,其他就是临时紧急的修改方案。目前已经使用方案四进行改进了。
?
  相关解决方案