2

getrusage-进程资源统计函数

 2 years ago
source link: https://answerywj.com/2021/06/23/getrusage/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

getrusage-进程资源统计函数

发表于 2021-06-23

| 分类于 C/C++

|

| 阅读次数 3次

字数统计: 1.3k 字

|

阅读时长 ≈ 5 分钟

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。


getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

目前在LinuxmacOS支持该函数。

#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

sys/time.h:为了得到timeval结构体的声明,这个结构体实际上在bits/time.h中声明。

who:资源统计的对象,有如下取值:

  • RUSAGE_SELF:返回调用进程的资源使用统计信息,即该进程中所有线程使用的资源总和;
  • RUSAGE_CHILDREN:返回调用进程所有已终止且被回收子进程的资源使用统计信息。如果进程有孙子进程或更远的后代进程,且这些后代进程和这些后代进程与调用进程之间的中间进程也已终止且被回收,那么这些后代进程的资源使用统计信息也会被统计;
  • RUSAGE_THREADLinux 2.6.26起支持):返回调用线程的资源使用统计信息;
宏定义 取值 RUSAGE_SELF 0 RUSAGE_CHILDREN -1 RUSAGE_THREAD 1

宏定义在sys/resource.h-> bits/resource.h

usage:资源使用统计信息,用如下结构体的形式返回到该指针指向的内存空间:

struct rusage {
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims (soft page faults) */
long ru_majflt; /* page faults (hard page faults) */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* IPC messages sent */
long ru_msgrcv; /* IPC messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};

结构体struct rusage各个成员释义如下:

  • ru_utime:返回进程在用户模式下的执行时间,以timeval结构的形式返回(该结构体在bits/timeval中声明);
  • ru_stime:返回进程在内核模式下的执行时间,以timeval结构的形式返回(该结构体在bits/timeval中声明);
  • ru_maxrssLinux 2.6.32起支持):返回rss(实际使用物理内存,包含共享库占用的内存)的大小,单位为KB;当who被指定为RUSAGE_CHILDREN时,返回各子进程rss的大小中最大的一个,而不是进程树中最大的rss
  • ru_ixrss:目前不支持;
  • ru_idrss:目前不支持;
  • ru_isrss:目前不支持;
  • ru_minflt:缺页中断的次数,且处理这些中断不需要进行I/O,不需要进行I/O操作的原因是系统使用reclaiming的方式在物理内存中得到了之前被淘汰但是未被修改的页框。(第一次访问bss段时也会产生这种类型的缺页中断);
  • ru_majflt:缺页中断的次数,且处理这些中断需要进行I/O
  • ru_nswap:目前不支持;
  • ru_inblockLinux 2.6.22起支持):文件系统需要进行输入操作的次数;
  • ru_oublockLinux 2.6.22起支持):文件系统需要进行输出操作的次数;
  • ru_msgsnd:目前不支持;
  • ru_msgrcv:目前不支持;
  • ru_nsignals:目前不支持;
  • ru_nvcswLinux 2.6起支持):因进程自愿放弃处理器时间片而导致的上下文切换的次数(通常是为了等待请求的资源);
  • ru_nivcswLinux 2.6起支持):因进程时间片使用完毕或被高优先级进程抢断导致的上下文切换的次数;

    其中有些结构体成员目前并不被Linxu支持,但是为了兼容其它系统以及未来扩展,仍被保留了下来,这些结构体成员在函数执行后会被内核默认设置为0

成功0
失败-1,并设置errno的值,包含如下两种错误:

  • EFAULTusage指针指向不可访问地址;
  • EINVALwho被指定为无效值;

getrusage函数是线程安全的。

#include <stdio.h>

/* include for getrusage */
#ifndef _WIN32
#include <sys/time.h>
#include <sys/resource.h>
#endif

static void print_rusage() {
#ifndef _WIN32
int ret;

struct rusage usage;
ret = getrusage(RUSAGE_SELF, &usage);
if (0 != ret) {
printf("getrusage failed\n");
goto end;
}

printf("%s: %.3fms\n", "ru_utime", (usage.ru_utime.tv_sec * 1000.0 + usage.ru_utime.tv_usec / 1000.0));
printf("%s: %.3fms\n", "ru_stime", (usage.ru_stime.tv_sec * 1000.0 + usage.ru_stime.tv_usec / 1000.0));
printf("%s: %.3fM\n", "ru_maxrss", (usage.ru_maxrss / 1024.0));
printf("%s: %ld\n", "ru_ixrss", usage.ru_ixrss);
printf("%s: %ld\n", "ru_idrss", usage.ru_idrss);
printf("%s: %ld\n", "ru_isrss", usage.ru_isrss);
printf("%s: %ld\n", "ru_minflt", usage.ru_minflt);
printf("%s: %ld\n", "ru_majflt", usage.ru_majflt);
printf("%s: %ld\n", "ru_nswap", usage.ru_nswap);
printf("%s: %ld\n", "ru_inblock", usage.ru_inblock);
printf("%s: %ld\n", "ru_oublock", usage.ru_oublock);
printf("%s: %ld\n", "ru_msgsnd", usage.ru_msgsnd);
printf("%s: %ld\n", "ru_msgrcv", usage.ru_msgrcv);
printf("%s: %ld\n", "ru_nsignals", usage.ru_nsignals);
printf("%s: %ld\n", "ru_nvcsw", usage.ru_nvcsw);
printf("%s: %ld\n", "ru_nivcsw", usage.ru_nivcsw);

#endif

end:
return;
}

完整代码:https://github.com/AnSwErYWJ/DogFood/blob/master/C/getrusage.c


微信公众号同步更新,微信搜索"AnSwEr不是答案"或者扫描二维码,即可订阅。

Recommend

  • 54

    1进程调度就绪进程最重要的特征是该进程是非阻塞的。进行用户交互、大量读写文件、响应I/O和网络事件的进程会花费大量时间来等待资源可用,在相当长的时间内无法转为就绪状态(长是相对于指令运行时间而言),因此就绪进程首先应该是非阻塞的。一个就绪进程还必须至...

  • 32
    • blog.51cto.com 5 years ago
    • Cache

    Linux进程内存统计-小科

    一、进程内存统计cat/proc/[pid]/status通过/proc/[pid]/status可以查看进程的内存使用情况,包括虚拟内存大小(VmSize),物理内存大小(VmRSS),数据段大小(VmData),栈的大小(VmStk),代码段的大小(VmExe),共享库的代码段大小(VmLib)等等。Name:java/...

  • 54
    • www.freebuf.com 5 years ago
    • Cache

    Linux进程网络流量统计

    前言 linux都有相应开源工具实时采集网络连接、进程等信息其中网络连接一般包括最基本的五元组信息(源地址、目标地址、源端口、目标端口、协议号)再加上所属进程信息pid, exe, cmdline)等。其中这两项数据大多可直接读取linux /p...

  • 9
    • 微信 mp.weixin.qq.com 3 years ago
    • Cache

    线程间到底共享了哪些进程资源?

    进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了。 关于进程和线程有一个 极其经典 的问题,那就是进程和线程的区别是什么?相信很多同学对答案似懂非懂。

  • 6

    Linux如何统计进程的CPU利用率 浏览:13461次  出处信息 0. 为什么写这篇博客

  • 4
    • www.lujun9972.win 3 years ago
    • Cache

    如何快速统计指定进程的个数

    如何快速统计指定进程的个数 最近某个系统由于处理来帐报文缓慢而导致被上级部门通报。 经过排查发现系统中有一段代码用来统计处理来帐的进程数,若进程数大于某个阀值则开始限流,等待一段时间后再开始接受来帐报文。 而比较讽刺的是,统计...

  • 5

    推荐文章 关于搜索统计资源(写给在统计学院学习的学弟学妹之二) 关键词:

  • 5

    V2EX  ›  Windows windows 下有没有统计进程历史资源占用的程序   huazhaozhe · 1 小时 52...

  • 5

    如何在 Linux 中找到最消耗内存和 CPU 资源的进程-51CTO.COM 如何在 Linux 中找到最消耗内存和 CPU 资源的进程 作者:聆听世界的鱼 2022-05-27 11:59:22 在这篇文章中,我们将解释如何...

  • 10

    微软重构资源管理器进程:Windows 11运行速度大提升 2022-12-22 23:02 出处/作者:快科技 整合编辑:佚名 0

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK