You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux进程累计IO等待时间测量及子进程该指标获取的C API咨询

嘿,这两个问题我刚好有经验,给你详细说说:

关于Linux进程IO等待时间的问题解答

1. 是否可以测量Linux进程的累计IO等待时间?

当然可以!Linux内核会持续跟踪进程的各类资源使用统计,包括IO等待时间。这里的IO等待时间特指进程处于**不可中断睡眠状态(D状态)**时,等待磁盘IO操作完成的时长——这正是你要找的、用来评估磁盘性能对应用程序影响的核心指标。不管进程是正在运行还是已经退出,只要内核还保留着它的统计数据,就能获取到这个值。

2. 获取已退出子进程磁盘IO等待总时间的C API

要获取已退出子进程的磁盘IO等待绝对值,最直接的方式是使用wait4()系统调用。它在等待子进程退出的同时,能返回包含详细资源使用信息的struct rusage结构体,其中就有我们需要的IO等待时间字段。

具体细节和代码示例

首先,你需要在编译时定义_GNU_SOURCE宏,才能访问Linux扩展的rusage字段。struct rusage里的ru_iowait字段就是子进程累计的IO等待时间,它是一个struct timeval类型,包含秒(tv_sec)和微秒(tv_usec)两个部分,直接对应你要的绝对值。

下面是一个简单的示例代码:

#define _GNU_SOURCE
#include <sys/wait.h>
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程模拟IO密集型操作
        FILE *fp = fopen("/tmp/test_io_file", "w");
        if (fp != NULL) {
            for (int i = 0; i < 100000; i++) {
                fputs("Sample IO data line\n", fp);
            }
            fclose(fp);
        }
        exit(EXIT_SUCCESS);
    } else if (pid > 0) {
        struct rusage child_usage;
        int exit_status;
        
        // 等待子进程退出并获取其资源使用情况
        if (wait4(pid, &exit_status, 0, &child_usage) == -1) {
            perror("wait4 failed");
            exit(EXIT_FAILURE);
        }
        
        // 输出IO等待时间
        printf("子进程累计IO等待时间:%ld秒 + %ld微秒\n",
               child_usage.ru_iowait.tv_sec, child_usage.ru_iowait.tv_usec);
    } else {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }
    return 0;
}

额外说明

  • ru_iowait统计的是进程真正卡在磁盘IO上的时间,不包含其他类型的等待(比如等待CPU调度),完全符合你用来评估磁盘缓慢影响的需求。
  • 如果是要获取非子进程的已退出进程的IO等待时间,可能需要通过解析/proc文件系统的历史数据,但这种方式可靠性较低,且依赖内核配置。对于自己创建的子进程,wait4()是最推荐的方案。

内容的提问来源于stack exchange,提问作者Anton Golubev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:58