【问题标题】:Is "stat" a cpu-consuming command?“stat”是一个消耗 CPU 的命令吗?
【发布时间】:2021-01-14 07:25:00
【问题描述】:

我的问题是:如果我不断地调用这个命令(例如每秒 50 次),Linux 系统中的“stat”命令是否会消耗过多的 CPU?

问题是这样来的:

我正在用 Java 编写程序,它经常调用 File.length() 方法。我注意到 CPU 使用率很快就达到了 20%(非常高)。

我检查了 File.length() 的源代码,它使我进入了非常深层次的文件系统,我看到源代码是这样的:

#include <sys/stat.h>
...
#define stat64 stat
...
    // Android-changed: Name changed because of added thread policy check
JNIEXPORT jlong JNICALL
Java_java_io_UnixFileSystem_getLength0(JNIEnv *env, jobject this,
                                       jobject file)
{
    jlong rv = 0;

    WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) {
        struct stat64 sb;
        if (stat64(path, &sb) == 0) {
            rv = sb.st_size;
        }
    } END_PLATFORM_STRING(env, path);
    return rv;
}

它看起来像是在系统中使用“stat”命令。 我检查了 stat 的手册页:

这些函数返回有关文件的信息。文件本身不需要权限,但是在 stat() 和 lstat() 的情况下 - 需要对指向文件的路径中的所有目录具有执行(搜索)权限。

由于它不需要读取权限,我想知道我是否可以断定它不打开文件并读取内容,因此应该消耗很少的CPU?

在哪里可以看到命令“stat”的实际实现?

任何想法都会有所帮助,谢谢!

【问题讨论】:

    标签: java linux file linux-kernel filesystems


    【解决方案1】:

    “stat”是一个消耗 CPU 的命令吗?

    这是一个系统调用,而不是一个命令。 (如果是命令的话,成本会高很多。)

    由于它不需要读取权限,我不知道我是否可以得出结论,它不打开文件并读取内容,因此应该消耗很少的CPU?

    这不是一个有效的结论。只有深入了解stat CPU 使用率的实际作用以及它的作用方式,才能得出关于它的初步结论。

    stat 的情况下,从第一原理预测太复杂了。即使您对现代 Linux 内核的工作原理有深入的了解,也需要考虑一些方面来做出可靠的预测。

    为了说明一些潜在的复杂性:

    • 解析路径可能涉及在多个目录中查找目录条目
    • 需要为每个目录查找执行访问检查
    • 目录和 inode 可能需要从磁盘读取
    • 可以缓存磁盘块和/或元数据
    • 环回和远程文件系统使事情变得更加复杂

    在某些情况下,这可能相对较快。在其他情况下,不是。

    简而言之......不,你不应该假设。

    在哪里可以看到stat的实际实现。

    通常它都在 Linux 内核源代码中。但在某些情况下,可能会涉及到用户空间回送文件系统之类的代码。

    有很多东西要拖网。我不会推荐它……除非你有强烈的学习内核内部的愿望。

    一个更好的主意是用 C/C++ 编写一个基准并对其进行测量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2015-05-18
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多