snakemake中基准变量的含义

时间:2017-10-18 15:03:29

标签: psutil snakemake

我在我的snakemake工作流程中的一些规则中包含了benchmark指令,结果文件包含以下标题:

s   h:m:s   max_rss max_vms max_uss max_pss io_in   io_out  mean_load

The only documentation I've found提到了一个“基准txt文件(它将包含一个以制表符分隔的运行时和MiB内存使用情况表)”。

我可以猜测第1列和第2列是显示执行规则所用时间的两种不同方式(以秒为单位,并转换为小时,分钟和秒)。

io_inio_out可能与磁盘读写活动有关,但它们的测量单位是什么?

其他是什么?这是在某处记录的吗?

编辑:查看源代码

我在/snakemake/benchmark.py中找到了以下代码,这可能是基准数据的来源:

def _update_record(self):
    """Perform the actual measurement"""
    # Memory measurements
    rss, vms, uss, pss = 0, 0, 0, 0
    # I/O measurements
    io_in, io_out = 0, 0
    # CPU seconds
    cpu_seconds = 0
    # Iterate over process and all children
    try:
        main = psutil.Process(self.pid)
        this_time = time.time()
        for proc in chain((main,), main.children(recursive=True)):
            meminfo = proc.memory_full_info()
            rss += meminfo.rss
            vms += meminfo.vms
            uss += meminfo.uss
            pss += meminfo.pss
            ioinfo = proc.io_counters()
            io_in += ioinfo.read_bytes
            io_out += ioinfo.write_bytes
            if self.bench_record.prev_time:
                cpu_seconds += proc.cpu_percent() / 100 * (
                    this_time - self.bench_record.prev_time)
        self.bench_record.prev_time = this_time
        if not self.bench_record.first_time:
            self.bench_record.prev_time = this_time
        rss /= 1024 * 1024
        vms /= 1024 * 1024
        uss /= 1024 * 1024
        pss /= 1024 * 1024
        io_in /= 1024 * 1024
        io_out /= 1024 * 1024
    except psutil.Error as e:
        return
    # Update benchmark record's RSS and VMS
    self.bench_record.max_rss = max(self.bench_record.max_rss or 0, rss)
    self.bench_record.max_vms = max(self.bench_record.max_vms or 0, vms)
    self.bench_record.max_uss = max(self.bench_record.max_uss or 0, uss)
    self.bench_record.max_pss = max(self.bench_record.max_pss or 0, pss)
    self.bench_record.io_in = io_in
    self.bench_record.io_out = io_out
    self.bench_record.cpu_seconds += cpu_seconds

所以这似乎来自psutil提供的功能。

2 个答案:

答案 0 :(得分:3)

使用snakemake进行基准测试肯定可以更好地记录,但是psutil是有记录的here

get_memory_info()
Return a tuple representing RSS (Resident Set Size) and VMS (Virtual Memory Size) in bytes.
On UNIX RSS and VMS are the same values shown by ps. 
On Windows RSS and VMS refer to "Mem Usage" and "VM Size" columns of taskmgr.exe.

psutil.disk_io_counters(perdisk=False)

Return system disk I/O statistics as a namedtuple including the following attributes:
    read_count: number of reads
    write_count: number of writes
    read_bytes: number of bytes read
    write_bytes: number of bytes written
    read_time: time spent reading from disk (in milliseconds)
    write_time: time spent writing to disk (in milliseconds)

您找到的代码确认所有内存使用情况和IO计数都以MB(=字节* 1024 * 1024)报告。

答案 1 :(得分:2)

我将把它留在这里以备将来参考。

通读

如前所述:

<头>
列名 类型(单位) 描述
s 浮动(秒) 以秒为单位的运行时间
h:m:s 字符串 (-) 运行时间以小时、分钟、秒格式
max_rss 浮动 (MB) 最大“驻留集大小”,这是进程已使用的非交换物理内存。
max_vms 浮动 (MB) 最大“虚拟内存大小”,这是进程使用的虚拟内存总量
max_uss 浮动 (MB) “Unique Set Size”,这是一个进程唯一的内存,如果进程现在终止,它将被释放。
max_pss 浮动 (MB) “Proportional Set Size”,是与其他进程共享的内存量,以在共享它的进程之间平均分配的方式计算(仅适用于 Linux)
io_in 浮动 (MB) 读取的 MB 数(累计)。
io_out 浮动 (MB) 写入的 MB 数(累计)。
mean_load 浮动(-) CPU 使用率随时间的变化,除以总运行时间(第一行)
cpu_time float(-) 用户和系统的总CPU时间