我正在尝试测量Linux中正在运行的程序的内存消耗.我写了一个C程序来分配1G内存,然后用时间输出它的"最大驻留集大小":
/ usr/bin/time -f'%Uu%Ss%er%MkB%x%C'./takeMem 1000000000
0.85u 0.81s 1.68r 3910016kB 0./takeMem 1000000000
从'man time',我应该解释这个程序的"最大驻留集大小"需要3.9G内存,尽管程序只分配了1G内存.它没有任何意义.
任何人都知道发生了什么导致"最大居民设置大小"那么高?
C代码非常简单:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int memLength = atoi(argv[1]);
fprintf(stderr, "Allocating %d memory...", memLength);
unsigned char* p = new unsigned char[memLength];
fprintf(stderr, "Done\n");
while (true) {
int i = rand() % memLength;
char v = rand() % 256;
p[i] = v;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常大的表,有250,000多行,其中很多都在其中一列中包含一个大的文本块.目前它的容量为2.7GB,预计至少增长十倍.我需要在表的每一行上执行特定于python的操作,但是一次只需要访问一行.
现在我的代码看起来像这样:
c.execute('SELECT * FROM big_table')
table = c.fetchall()
for row in table:
do_stuff_with_row
Run Code Online (Sandbox Code Playgroud)
当表格较小时,这种工作正常,但是当我尝试运行它时,表格现在比我可用的ram和python挂起的要大.是否有更好的(更有效率的)方法在整个表上逐行迭代?
我正在运行许多短期的 docker 容器,每个容器都执行一些内存密集型批处理。我正在寻找一种方法来查找每个容器在运行时达到的峰值内存使用量。知道这一点将使我能够优化运行这些容器的基础架构,以备将来运行。
实现此目的的一种天真的方法是将流输出重定向docker stats
到某个文件:docker stats container_id > stats.log
. 但是,这需要为每个容器运行一个进程,然后对非常冗长的日志进行排序以找到使用高峰。我想知道是否有更简单的方法。
我正在实现一个算法,并希望测量它的时间和内存消耗.在我的帮助下,我编写了自己的测量实用程序,它可以读取/proc/[pid]/stat
用户和系统消耗的时间量,以及虚拟内存和常驻设置的峰值大小.(我不是100%清楚这两个内存统计数据之间的差异,但这不是手头的问题.)
到目前为止一直很好,但随之而来的是第三方实施,我希望比较我自己的程序.由于我不想摆弄它的来源,我无法使用我自己的测量程序收集有关其效率的数据(我可能会,但它需要我重新考虑我的测量方案).所以我发现/usr/bin/time
也采取了这些措施.
当我比较输出时,我发现/usr/bin/time
确实报告与我自己的工具相同的时间使用,但内存数据是非常不同的.首先,/usr/bin/time
不报告有关虚拟内存使用情况的任何内容,它仅提供最大驻留集大小的帖子.其次,报告的居民规模大小/usr/bin/time
比我自己的措施大六到八倍.
所以,我一直试图找出/usr/bin/time
实际测量的方式,以及差异为何如此根本.另外,哪个是正确的值?
输出示例(单位为MB):
<program>: <virtual mem> <resident set size>
autotest (my own utility): 23.2266 2.19531
/usr/bin/time: N/A 11.23437
Run Code Online (Sandbox Code Playgroud)
我使用的是GNU/Linux 3.8.13 Mageia 3 x86_64.
编辑:作为一个信心提升,我发现KDE系统监视器支持我自己的实用程序报告的数据.事实上,它从我所在的地方获取信息.因此,信任数据/proc/[pid]/stat
应该非常安全.但问题仍然存在......
编辑2:在下面的答案的帮助下,推断出这wait3()
是GNU使用的命令time
.它以手册页getrusage(2)中描述的形式返回数据.在RSS上,它说:
这是使用的最大驻留集大小(以千字节为单位).
手册页也指proc/[pid]/stat
,其中说
驻留集大小:进程在实际内存中的页数.这只是计算文本,数据或堆栈空间的页面.这不包括未加载需求或换出的页面.
那么,第二个版本在短短的测量更加精确我的程序的内存使用情况,并在第一个版本还可以测量某种外部库使用的?
我有一个旧的代码库,广泛使用GD(不,切换到imagemagick不是一个选项).它已经运行了几年,通过几个版本.但是,当我在当前的开发环境中运行它时,我遇到了一个神秘的gd-png错误:调用时无法分配图像数据错误imagecreatefrompng()
.我正在使用的PNG文件与我一直使用的相同,所以我知道它有效.
目前的设置:
Ansible-provisioned vagrant box
Ubuntu 14.04
PHP 5.5.9
GD 2.1.1
libPNG 1.2.50
Run Code Online (Sandbox Code Playgroud)
脚本运行时PHP的内存限制为650M,尽管最终内核本身最终会破坏脚本,并且更改PHP的内存限制似乎没有效果.
图像尺寸为7200x6600,磁盘上约为500KiB.这在我的其他环境中不是问题,只是在我的开发环境中新出现.不幸的是,我不再能够访问其他环境来进行比较了,尽管在上一个工作中的设置类似--Ubuntu 14.04,PHP 5.5,足够的内存分配.
在此设置中可能发生的事情在我之前的设置中没有发生?我怎样才能解决这个问题?
在Ubuntu中,/usr/bin/time -v any-command
告诉我的内存使用情况any-command
和一些信息。(来源:https : //stackoverflow.com/a/774601/2885946)
我想在OS X / macOS中做同样的事情。
您能告诉我如何在OS X上获得像/usr/bin/time -v
Ubuntu 一样的进程的内存使用吗?
有没有办法测量执行的终端命令/操作使用了多少内存,例如time
用于测量执行时间的内置命令。我想比较具有不同参数的命令。
下面的内存消耗有什么不同吗?
users = User.where("created_at > ?", 2.months.ago) # select all fields
users = User.select(:user_name).where("created_at > ?", 2.months.ago) # just select one field
Run Code Online (Sandbox Code Playgroud)