Linux内存管理和大文件
Posted
技术标签:
【中文标题】Linux内存管理和大文件【英文标题】:Linux memory management and large files 【发布时间】:2011-06-14 20:48:54 【问题描述】:我正在从远程服务器获取图像对象,然后尝试使用他们的 API 将它们上传到 Rackspace 的云文件。想知道 a) 我怎样才能使这个过程更高效,以及 b) 假设我需要购买更多内存,那么完成这个任务可能需要多少合理的 RAM(当前的开发服务器只有 512MB)。
在执行脚本时,我是:
在我的本地数据库中查询一组 ID(大约 1000 个) 对于每个id,查询远程服务器,返回10-20个图片对象,每张图片25-30k 根据我的数据库中的 id 创建一个 Cloud Files 容器 对于从远程服务器返回的每个图像对象,在我的容器中创建一个图像对象,并将图像数据写入该对象 使用添加图像的日期时间更新本地数据库中的行这在一小部分 id 上执行相对较快,但是 100 个(所以 700-1k 图像)可能需要 5-10 分钟,而且除此之外的任何东西似乎都无限期地运行。尝试了以下方法,但收效甚微:
几分钟后使用 php 的 set_timeout 来终止脚本,认为这会清除分配给执行的内存,让我可以从中断的地方继续工作并处理较小的部分。但是,永远不会抛出此错误 在上传后取消设置包含图像对象的数组键(不是just the reference inside the loop)。PHP 的 memory_limit 设置为 128MB,运行“tops”命令我看到用户“www-data”消耗了 16% 的内存资源。但是,它不再出现在用户列表中,但我继续看到:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2400 mysql 20 0 161m 8220 2808 S 0 1.6 11:12.69 mysqld
...但是 TIME+ 永远不会改变。我看到仍有 1 个任务在运行,但这些值从未改变:
Mem: 508272k total, 250616k used, 257656k free, 4340k buffers
为这篇冗长的帖子道歉 - 不完全确定什么(如果有的话)有用。这不是我的专业领域,所以有点抓住稻草。在此先感谢您的帮助。
【问题讨论】:
你不能一个接一个地处理一个图像吗? 听起来你不小心把代码写成了某种 N^2 算法——贴一些代码。 【参考方案1】:MySQL 是一个守护进程——它会一直运行并驻留在内存中,直到它死掉或者你杀死它。 TIME+ 是自上次重启以来使用的 CPU 时间。如果它是空闲的 (%CPU = 0),那么 TIME+ 将不会增加,因为没有消耗 cpu 时间。
您是否检查过 cloudfiles API 是否泄漏了某种句柄?您可能正在取消设置从服务中检索到的图像对象(服务->您),但 Cloudfiles API 仍然必须将该图像发送回门外(您->机架空间),这可能会泄漏到某个地方。
【讨论】:
感谢您的回复。正在寻找下一步,这绝对有帮助。以上是关于Linux内存管理和大文件的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )
Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )