连接中断可能的原因,LAMP堆栈

3

MySQL 5.1.73 Apache/2.2.15 PHP 5.6.13 CentOS 6.5 Cakephp 3.1

导入过程大约4分钟后(3分57秒),我正在运行的导入过程停止了。 我找不到任何日志中的错误或警告。 导入过程包括许多SQL调用和数据处理,没有太复杂的东西,但如果进行完整比较以进行更新,则可能需要约10分钟才能完成5500个记录。

Firefox:安全连接失败-在页面加载时重置与服务器的连接。 Chrome:ERR_NO RESPONSE

  1. php设置的时间限制为900,这是有效的。 我可以将其设置为5秒并获得错误。 没有达到限制。
  2. 我可以暂停另一个控制器10分钟,而此错误不会发生,表明实际程序中的某些内容导致它失败,而不是托管服务因花费太长时间而终止请求(阅读有关VPS执行此操作以防止垃圾邮件的文章)。
  3. php.ini中已将php错误全部打开,并且只有为了确保,在控制器本身中也打开了。
  4. 如果我减少要导入的文件的大小,则导入过程完成。 如果恰到好处,它将完成并显示浏览器消息。 这对我表明它不会在执行的每个点上都失败。
  5. 我已经删除了所有缓存并重新启动了服务器。
  6. 我在apache日志中没有看到任何输出,除非是请求已进行。
  7. 我没有在mysql日志中看到任何错误,但是我不知道是否因为其未开启。
  8. 相同的代码在我的本地主机上完全没有问题。 它与服务器不完全匹配,但接近。 Ubuntu Desktop vs Centos,php 5.5 vs php 5.6
  9. 我已经注意到内存使用情况,并没有发现任何问题。

此时,我正在寻找关于需要查看或可能导致失败的原因的任何好建议。 有许多可能的地方可以查看,而没有错误,很难缩小问题可能出现的范围。 提前感谢您的任何建议!

更新

在更仔细地查看请求期间的内存使用情况后,我注意到它比理想状态高得多。

Apache进程(httpd)被杀死并产生一个新线程。一旦新线程消耗完内存,屏幕上就会显示错误信息。之前我看过它,只有30%的内存使用率,可能是因为刚刚结束了旧进程。这一次我一直观察到它达到80%,加上其他进程,使得它的内存不足而被终止。被终止的进程不能记录任何错误或警告信息,这就是为什么没有出现任何错误或警告的原因。对我来说,有趣的是进程会马上重新启动。
我发现一个命令可以显示哪些进程由于内存原因被杀死,这非常有用:
dmesg | egrep -i 'killed process'

你说:“在我的本地主机上完全相同的代码没有任何问题。” 你是在共享主机上吗? 你确定这个服务器上的900秒最大执行时间正在工作吗? 你能验证一下apache上是否有超时实现吗? - Kyle Domingo
这不是共享主机,它是私人的,并且只有一个应用程序在上面运行。我的测试是通过将超时设置为4分钟以下并查看PHP错误来确保超时正常工作。Apache配置中有超时,但所有超时时间都远低于4分钟。 - blur0224
如果它足够长,那么具体有多长呢?也许你的问题与文件大小有关,或者与你用来扫描文件本身的某个计数器有关... - arilia
文件大小似乎与此无关。如果我删除导入表中的数据并且所有操作都是插入,那么所需时间会更短(因为不需要查找现有记录),并且在大约4分钟左右导入。该过程标记为已完成,但仍然连接失败。这表明对我来说问题不在于文件大小,而在于处理持续时间。 - blur0224
1
结果证明这是一个内存问题(请参见主贴中的更新)。随着记录集随时间增长,我可能会采取分批处理的方式来减少发生这种情况的机会。但理想情况下,我希望摆脱Cakephp ORM,因为它在快速开发方面很有用,但除非密切管理,否则效率非常低下。 - blur0224
显示剩余2条评论
1个回答

0

我曾经遇到过DebugKit的类似问题。 在内存峰值期间,我的代码出现了错误,并且上下文被写入HTML格式的错误“日志”中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接