当前位置: 首页 > 面试题库 >

跟踪PHP中的内存使用情况

富建章
2023-03-14
问题内容

我正在尝试跟踪处理URL的脚本的内存使用情况。基本思想是在将另一个URL添加到cURL多处理程序之前,检查是否存在合理的缓冲区。我正在使用“滚动cURL”概念,该概念在多处理程序运行时处理URL数据。这意味着我可以在每次处理和删除现有URL时通过从池中添加新URL来保持N个连接处于活动状态。

我已经使用memory_get_usage()了一些积极的结果。添加该real_usage标志很有帮助(虽然并不清楚“系统”内存和“
emalloc”内存之间的区别,但是系统显示的数字更大)。memory_get_usage()确实会随着URL的添加而增加,而随着URL设置的耗尽而减少。但是,我刚刚超过了32M限制,最后一次内存检查为〜18M。

每当cURL
multi信号返回请求时,我都会轮询内存使用情况。由于可能同时返回多个请求,因此一堆URL可能同时返回数据,并且实际上使内存使用量跃升了14M。但是,如果memory_get_usage()准确的话,我想这就是事实。

[ 更新
:在问我猜之前,应该运行更多测试,增加php的内存限制(但在脚本中保留“安全”数量相同),并且报告的内存使用量确实从我自己施加的25M限制以下跃升至32M以上。然后,如预期的那样,缓慢地降低为未添加的URL。但是我会提一个问题:这是正确的方法吗?]

我可以这样信任memory_get_usage()吗?是否有更好的替代方法来获取内存使用情况(我已经看到一些脚本解析shell命令的输出)?


问题答案:

real_usage 这样工作:

Zend的内存管理器不会为每个需要的块使用系统malloc。相反,它分配了一大块系统内存(以256K为增量,可以通过设置环境变量进行更改ZEND_MM_SEG_SIZE)并在内部进行管理。因此,有两种内存使用情况:

  1. 引擎从操作系统占用了多少内存(“实际使用量”)
  2. 应用程序实际使用了多少内存(“内部使用情况”)

可以通过返回其中之一memory_get_usage()。哪种对您更有用取决于您要寻找的内容。如果您要优化特定部分的代码,则“内部”对您可能更有用。如果您要全局跟踪内存使用情况,则“实际”将更有用。memory_limit限制“实数”,因此一旦限制所允许的所有块都从系统中取出,并且内存管理器无法分配请求的块,分配就会失败。请注意,在这种情况下,“内部”使用量可能小于限制,但是由于碎片,分配仍然可能失败。

另外,如果您使用某些外部内存跟踪工具,则可以设置此环境变量USE_ZEND_ALLOC=0,该变量将禁用上述机制并使引擎始终使用malloc()。这会带来更差的性能,但允许您使用malloc跟踪工具。



 类似资料:
  • 问题内容: 我想找出在调用函数期间(在Python中)分配的最大RAM量是多少。还有其他与跟踪RAM使用情况有关的问题: 建议使用哪个Python内存分析器? 如何剖析Python中的内存使用情况? 但是这些似乎允许您在调用方法(例如guppy)时更多地跟踪内存使用情况。但是,我要跟踪的是外部库中的一个函数,该函数无法修改,并且会逐渐占用大量RAM,但是一旦函数执行完成,就可以释放它。有什么方法可

  • 问题内容: 我在Linux中玩ptrace。我正在尝试使用/ proc / pid / mem接口编写跟踪进程的内存。 我用来完成此任务的功能是: 但是我总是会得到错误:编写:错误的文件描述符。 是否可以使用此方法编写跟踪过程? 问题答案: 您正在以只读模式()打开文件。我建议改用: 但是,从目前尚不清楚这是否可行: memory through open(2), read(2), and lse

  • 本文向大家介绍详解JVM中的本机内存跟踪,包括了详解JVM中的本机内存跟踪的使用技巧和注意事项,需要的朋友参考一下 1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存。这些额外的分配最终会使消耗的内存超出-Xmx限制。 在本教程中,我们将列举JVM中的一些常见内存分配源,以及它们的大小

  • 我们有一个应用程序引擎应用程序,它将许多相对较大的文件写入谷歌云商店。这些文件是动态创建的CSV,因此我们使用Python的作为写入该缓冲区的接口。 通常,我们的流程如下所示: 据我们所知,不需要自己关闭。相反,只需要关闭上面的和。 我们在appengine的任务队列调用的

  • 问题内容: 我看到了这个Python问题:推迟了AppEngine:跟踪内存泄漏 …同样,我遇到了这个可怕的错误: 总共为384个请求提供服务后,超出了128 MB的软私有内存限制 … 处理此请求后,发现处理此请求的进程使用了​​过多的内存并被终止。这很可能导致新流程用于您的应用程序的下一个请求。如果您经常看到此消息,则可能是应用程序内存泄漏。 根据另一个问题,可能是“实例类”太小而无法运行此应用

  • 我正在考虑在使用表存储时为我的应用程序实现一个审计跟踪。 我需要能够记录一个特定客户的所有操作和来自该客户的实体的所有操作。 我的第一个猜测是为每个客户创建一个表(Audits_CustomerXXX),并使用实体id和行键(datetime.max.ticks-datetime.now.ticks).ToString(“D19”)值作为分区键。当我的问题是某个实体发生了什么时,这很有效?例如,购