使用 top 进行进程的细粒度内存记录会减慢所述进程

使用 top 进行进程的细粒度内存记录会减慢所述进程

我正在尝试记录 R 代码中的内存消耗峰值,但 R 分析器都无法测量已编译模块的内存消耗。所以我一直使用 top 作为替代方案,它足以获取我想要的信息。问题是,为了捕获短暂的内存峰值,我需要将延迟设置得非常低,从而导致 R 进程在 top 运行时运行速度大大减慢。我不完全理解 top 如何读取已用内存,但是有没有办法使用 top 或其他工具来避免这种减速?

我的 bash 脚本实际上是:

top -b -d 0.1 -p $1 | awk -v OFS="," -v metavar=$2 '@load "time"; $1+0>0 { printf metavar "%.3f,",gettimeofday(); print $10; fflush() }' >> ./other/bench.csv

当我需要对一段代码进行基准测试时,我使用 R 生成一个新进程并执行此脚本,传入 R 的 PID 和一些额外信息,以便我稍后分割 csv 文件(它包含多个相关基准测试)。然后,当我进行基准测试的代码运行完成时,R 会终止 top 正在运行的进程。

编辑:发布此文后 10 分钟,我意识到我从未尝试排除脚本的其他部分(awk 并将数据输出到文件)作为速度减慢的罪魁祸首。事实证明,如果我将输出重定向为 null 或者直接删除

>> ./other/bench.csv

然后减速就会消失。所以我想现在的问题转移到如何在不减慢速度的情况下保存这些数据?

答案1

受到 Sotto Voce 对我的问题的评论回应(表明 R 可能对磁盘使用情况敏感)的启发,我尝试将日志信息输出到使用 tmpfs(在内存中)存储的 csv 文件,并且速度下降完全消失了。这表明在我运行基准测试时,R 正在尝试使用文件系统,这是我没有预料到的,因为我的代码都没有显式访问文件。我现在怀疑我用于构建测试数据的库之一正在幕后使用磁盘存储来存储数据,作为减少 RAM 使用的一种方式(这是一个记录在案的功能,用于从文件显式加载数据,但显然当数据在代码中动态生成时,没有很好的记录)。

所以,简而言之,top、awk 或 bash 脚本中的其他任何内容都不是问题。只是意外的竞争磁盘访问。

相关内容