写点什么

编程基础:CPU 资源监控

用户头像
正向成长
关注
发布于: 7 小时前
编程基础:CPU资源监控

在工作中涉及一些系统资源管理相关的工作,针对 CPU 资源的获取和监控的一些实现和理论基础,会随着更多的理解进行更多的补充。

CPU 使用状态

 系统平均负载

系统平均负载(Load Average)被定义为在特定时间间隔内运行队列中的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中[1]:

  • 没有在等待 I/O 操作的结果

  • 它没有主动进入等待状态(也就是没有调用wait)

  • 没有被停止(例如:等待终止)


该信息取自/proc/loadavg,在 shell 端可以通过cat /proc/loadavg来获取。

17.56 18.47 14.99 30/40312 353731
复制代码
  1. 第一个数字代表前 1 分钟 CPU 和 IO 的利用率

  2. 第二个数字代表前 5 分钟 CPU 和 IO 的利用率

  3. 第三个数字代表前 15 分钟 CPU 和 IO 的利用率

  4. 第四个数字分子代表当前正在运行的进程数,分母代表进程总数

  5. 最后一个数字代表最近运行的进程 ID。


CPU 调度

进程资源信息

Unix 提供了getrusage系统调[2]用获取进程的资源信息。接口定义如下

#include <sys/resource.h>/*	@parm who的可能取值如下:		RUSAGE_SELF              Return resource usage statistics for the calling process,              which is the sum of resources used by all threads in the              process.
RUSAGE_CHILDREN Return resource usage statistics for all children of the calling process that have terminated and been waited for. These statistics will include the resources used by grandchildren, and further removed descendants, if all of the intervening descendants waited on their terminated children. RUSAGE_THREAD (since Linux 2.6.26) Return resource usage statistics for the calling thread.*/int getrusage(int who, struct rusage *usage);
复制代码

获取到的rusage信息如下:

struct  rusage {    struct timeval ru_utime;    /* user time used  用户态下程序运行时间*/    struct timeval ru_stime;    /* system time used  内核态下程序运行时间*/    long    ru_maxrss;      /* maximum resident set size 应用程序实际使用的内存,不包含SWAP,不包含共享的内存*/    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  页面回收数*/    long    ru_majflt;      /* page faults    页面错误数*/    long    ru_nswap;       /* swaps    交换页面的个数*/    long    ru_inblock;     /* block input operations   块输入操作数*/    long    ru_oublock;     /* block output operations  块输出操作数*/    long    ru_msgsnd;      /* messages sent  发送的消息*/    long    ru_msgrcv;      /* messages received  接受的消息*/    long    ru_nsignals;    /* signals received  接收的信号数*/    long    ru_nvcsw;       /* voluntary context switches  自愿上下文切换数*/    long    ru_nivcsw;      /* involuntary context switches 非自愿上下文切换数*/};
复制代码

参考资料

  1. 博客园:linux /proc/loadavg(平均负载)

  2. getrusage(2) — Linux manual page

发布于: 7 小时前阅读数: 3
用户头像

正向成长

关注

正向成长 2018.08.06 加入

想要坚定地做大规模数据处理(流数据方向),希望结合结合批处理的传统处理方式,以及之后流批混合处理方向进行学习和记录。

评论

发布
暂无评论
编程基础:CPU资源监控