今天遇到一个问题,导出线上2个月的Excel统计数据频繁导致报错,一查php-fpm日志,则是提示:

PHP Fatal error:  Allowed memory size of 298844160 bytes exhausted (tried to allocate 262144 bytes)

一开始首先想到是Excel导出时很吃内存,数据一多就容易将内存耗尽,于是先从代码上做优化,取完数据后将无用的数组全部unset()掉。

继续去预发布环境(全量数据)尝试,发现还是error错误,于是继续排查错误,发现还是上面的报错,只不过这次是ORM提示的。然后赶紧检查ORM的写法,果然是很低效的写法:一是关联了两张无用表,二是取了全量的数据(检查发现包括一个很大的text类型字段)。于是赶紧优化,删除无用的关联表,然后将select(*)改成select('a','b','c')特定的字段。再去预发布环境测试,终于没有再报内存耗尽的错误了……那就耐心等待数据处理和下载吧……

结果意想不到的问题,是php-fpm报"time out"错误,于是再将php-fpm超时处理修改下:

ini_set('max_execution_time', '300');
ini_set('memory_limit', '285M');

然后再做尝试,继续等待……结果又是nginx报504错误……真是按下葫芦浮起瓢,再去nginx上添加参数:

...
fastcgi_read_timeout 300;
...

再尝试后,期待已久的nginx终于被下载下来……

总结下,今天遇到问题的原因——

  • 使用过ORM导致太多无用字段被加载,这是内存泄露的原因之一
  • 从DB取回的大量的数据做计算,数组没有及时unset,这是内存泄露的原因之二
  • ini_set()函数起初只将内存设置为128m,不够支撑取出的数据,这是内存泄露的原因之三
  • ini_set()函数直将php-fpm进程的处理时间设为55s,不够数据处理的时间,这是超时原因之一
  • nginx的fastcgi_read_time_out时间默认为60s,这是超时的原因之二

下载下来的数据无非也就7000条……但是暴露的问题却很多。

大量数据的处理和平时CURD是很不相同的场景,这种情形下对内存和CPU都有极大的考验。我们习惯了ORM的方便却往往忽略它带来的性能损耗。ORM容易取出全量字段,在数据量大时容易占用太多内存,同时ORM会在取出数据后做额外封装,这又是一笔额外的开销,数据量小时看不出来,但是数据量大时就很要命。因此在处理数据量的请求时慎用ORM,而是采用比较贴近原生SQL的类似QueryBuilder的写法,后者在运行效率和开发效率中取一个平衡点。

此外,类似于下载文件等耗时较长的请求,对各种超时也是有要求的。不管是nginx还是php-fpm,对超时的默认限制都不高,nginx的proxy_read_timeout默认是60s,对长时处理这显然太短了……因此对各种超时的处理也要格外注意。

记一次Excel导出导致内存耗尽的问题相关推荐

  1. [转]避免PHP-FPM内存泄漏导致内存耗尽

    对于PHP-FPM多进程的模式,想要避免内存泄漏问题很简单,就是要让PHP-CGI在处理一定数量进程后退出即可. 否则PHP程序或第三方模块(如Imagemagick扩展)导致的内存泄漏问题会导致内存 ...

  2. Linux下php-fpm进程过多导致内存耗尽问题解决

    当个人博客数据库服务经常突然挂断,造成无法访问时我们能做什么?本篇主题就是记录博主针对这一现象时发现问题,分析问题,最后解决问题的过程. 欢迎访问我的个人博客 发现问题 最近,发现个人博客的Linux ...

  3. 大数据excel导出,内存溢出解决方案(SXSSF流用户模型)

    SXSSF(流用户模型 API) SXSSF(包:org.apache.poi.xssf.streaming)是 XSSF 的一个 API 兼容的流扩展,当必须生成非常大的电子表格并且堆空间有限时使用 ...

  4. 由excel导出引起的cpu 100% 和gc 的问题

    大家好,我是烤鸭:     记一次 由excel导出 导致的cpu飙升200%,jvm 内存不足. 1.  场景复现 前端页面导出Excel,之前导出4,5W条数据都没什么问题的.     今天业务突 ...

  5. java代码耗尽内存_windows server 2008 环境下,运行java程序,内存耗尽问题

    经历的几天的分析,希望把自己学到的知识总结一下. 系统版本:Windows Server 2008 R2 Standard 系统类型:64bit 内存:32GB 程序:在系统上部署了solr,然后写5 ...

  6. C++内存耗尽怎么办?

    C++内存耗尽怎么办? 如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败.通常有三种方式处理"内存耗尽"问题. (1)判断指针是否 ...

  7. java service wrapper导致内存剧增直至崩溃

    应用程序使用wrapper包装之后导致内存溢出,直至应用程序崩溃. 现象: java应用程序在运行一段时间后把服务器内存耗光,程序死掉,但是守护进程wrapper还活着.虽然java应用程序死了,但是 ...

  8. 大数据导出Excel导致内存溢出的解决方案

    一.问题描述: 公司之前的项目中客户有一个需求是将业务数据导出到Excel表中,方便他们对账,单个导出任务数据量近100W,每当月初任务量多时,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每个 ...

  9. 记一次悲惨的 Excel 导出事件

    背景 话说这个背景挺惨的,京东某系统使用了poi-ooxml-3.5-final做excel导出功能.起初使用该版本的poi的HSSF配合多线程生成excel,没有任何问题,后来改成了XSSF生成后上 ...

最新文章

  1. 传感器是大数据的重要来源
  2. SpringBoot引用lombok让代码更简洁
  3. Qt QDialog将窗体变为顶层窗体(activateWindow(); 和 raise() )
  4. 设计一个带有getmin功能的栈,保证时间复杂度在O(1)
  5. oracle10 数据库审计,Oracle数据库审计用法实例
  6. android intent参数是上次的结果,【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动...
  7. mybatis学习笔记-01什么是mybatis
  8. 【Python】可视化的离散傅里叶变换+快速傅里叶变换后时域信号的频域分析
  9. 一款非常好用的音乐标签及管理工具:Yate for Mac
  10. edup网卡 linux,应用笔记--使用USB WiFi网卡
  11. CString,string,char*之间的转换
  12. 简简单单利用字典破解zip文件口令
  13. 自动移动鼠标避免锁屏
  14. matlab实现手写数字识别案例,Matlab手写数字识别
  15. git提交代码时遇到代码库有更新以及本地有更新的解决方法
  16. 苹果平板计算机音乐,iphone、ipad上传照片、视频、音乐到电脑中 手机电脑互传文件...
  17. 计算机程序如何计算除法,在EXCEL表格公式中怎样计算乘积及除法?
  18. php解决商品超卖,商品超卖问题,你用PHP如何解决?
  19. 菲尼克斯2961105继电器REL-MR- 24DC/21
  20. 互联网晚报 |12/2星期五 | 天猫向ofo及戴威索要5亿借款;优衣库创始人称在中国开3K家店还不够;国美电器回应已被破产清算...

热门文章

  1. vue3 移动端裁切图片后上传
  2. redis深度系统学习三:主从复制的原理与注意事项
  3. 互联网进入千兆时代,智能路由器PK焦点是谁更快?
  4. H.264 数据示例
  5. bilibili手机端追剧在哪里?
  6. 知识变现海哥|知识付费 VS 知识免费
  7. 词云生成库wordcloud详解(三):IntegralOccupancyMap类——词云布局机制
  8. 【更新】解密工具 /密钥公开|新型勒索软件WannaRen风险通告
  9. php图片批量上传插件下载,vue.js图片批量上传插件
  10. Redis的使用场景