使用 Python 子进程调用像 statfs 这样的系统调用是否比调用像 df 这样的 C 实用程序消耗更少的开销?

问题描述 投票:0回答:1

基于Unix的系统。我现在正在尝试在我正在处理的代码中使用尽可能少的开销(它位于资源受限的空间中)。在此特定代码中,我们正在收集一些基本的磁盘使用统计信息。一个建议是用

df
替换对
statfs
的调用,因为
df
是一个 C 实用程序,需要运行自己的子进程,而
statfs
是一个系统调用,可能使用较少的开销(这就是
df
)无论如何打电话)。

我们用 Python 的

df
命令
调用 subprocess.check_output():

import subprocess

DF_CMD = ["df", "-P", "-k"]


def get_disk_usage() -> str:
    try:
        output = subprocess.check_output(DF_CMD, text=True)
    except subprocess.CalledProcessError as e:
        raise RuntimeError(f"Failed to execute {DF_CMD} " + str(e)) from e

    return output

我想对我们的挂载点进行硬编码(我们认为我们可以接受),并将上面代码中对

df
的调用替换为对
statfs <mountpoint>
的调用。但是,我不确定使用相同的 Python 函数调用是否真的会减少开销。我计划使用探查器来检查它,但我很好奇是否有人对 Python/Unix 的内部工作原理有足够的了解,知道幕后发生了什么?

需要明确的是:“开销”是指操作系统/机器上的 CPU 和内存使用情况。

python unix diskspace overhead
1个回答
0
投票

但是,我不确定使用相同的 Python 函数调用是否真的会减少开销

生成新进程 -

fork
execve
- 通常是极其昂贵的系统调用。它们是 shell 如此缓慢的原因 - shell 中的几乎每个功能都是一个单独的进程,并且 shell 还在许多上下文中生成子 shell。如今,无论如何,计算机的速度都快得多,产生新进程的成本可以忽略不计。现在的计算机上有数千个进程。

是的,将

subprocess
替换为
os.statvfs
将减少开销。除非您正在使用真正真正资源受限的设备,例如,我不知道,64MB 内存,通常不值得花时间,但使代码独立且干净是非常好的并减少可能出现的错误。无论如何,Python 是“非常”消耗内存的,所以运行它的行为已经暗示我,你可能有足够的资源来生成一个子进程。

© www.soinside.com 2019 - 2024. All rights reserved.