一次和圈子里的朋友群聊的时候,谈到了vmstat的实现机制。我当时正在轻轨上,幻想着从轻轨飞下去的快感。在轻轨上我发表了自己的一些看法,不过都是意淫。
现在,已经过去半周了,今天终于闲下来把vmstat的源代码翻出来。vmstat其实只是一个简单的统计显示工具,早期NetBSD版本的vmstat实现总共才不到1500行。所以,也不用期望本文会有多么高深。
完整的源文件(加注释)在附件中。(到现在为止,CSDN的blog似乎还没有上传附件的功能)
函数调用栈如下:
核心的代码段如下:
fill_vmmeter(&sum); //vm信息获取
fill_vmtotal(&total); //vm信息汇总
(void)printf("%2d %1d %1d",
total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw);//显示t_rq,t_dw,t_sw三个值
#define vmstat_pgtok(a) ((a) * (sum.v_page_size >> 10))
#define rate(x) (((x) + halfuptime) / uptime) /* round */
if (hflag) { //如果设置了hflag
printf(" ");
prthuman(total.t_avm * (u_int64_t)sum.v_page_size, 7); //使用humanize_number格式显示v_page_size
printf(" ");
prthuman(total.t_free * (u_int64_t)sum.v_page_size, 6);
printf(" ");
} else {
printf(" %7d ", vmstat_pgtok(total.t_avm)); //使用一般格式显示t_avm
printf(" %6d ", vmstat_pgtok(total.t_free));
}
(void)printf("%5lu ",
(unsigned long)rate(sum.v_vm_faults - osum.v_vm_faults));//显示vm错误比率
(void)printf("%3lu ",
(unsigned long)rate(sum.v_reactivated - osum.v_reactivated));//显示v_reactivated比值
(void)printf("%3lu ",
(unsigned long)rate(sum.v_swapin + sum.v_vnodein -
(osum.v_swapin + osum.v_vnodein)));//显示v_swapin比值
(void)printf("%3lu ",
(unsigned long)rate(sum.v_swapout + sum.v_vnodeout -
(osum.v_swapout + osum.v_vnodeout)));//显示v_vnodeout比值
(void)printf("%5lu ",
(unsigned long)rate(sum.v_tfree - osum.v_tfree));//显示v_tfree比值
(void)printf("%3lu ",
(unsigned long)rate(sum.v_pdpages - osum.v_pdpages));//显示v_pdpages比值
devstats();
(void)printf("%4lu %4lu %4lu",
(unsigned long)rate(sum.v_intr - osum.v_intr),//显示v_intr比值
(unsigned long)rate(sum.v_syscall - osum.v_syscall),//显示v_syscall比值
(unsigned long)rate(sum.v_swtch - osum.v_swtch)); //显示v_swtch比值
if (Pflag)
pcpustats(ncpus, cpumask, maxid);
else
cpustats(); //这里会显示CPU的user时间、sys时间、Idle时间——百分比格式
(void)printf("\n");
(void)fflush(stdout);
if (reps >= 0 && --reps <= 0)
break;
osum = sum;
uptime = interval;
/*
* We round upward to avoid losing low-frequency events
* (i.e., >= 1 per interval but < 1 per second).
*/
if (interval != 1)
halfuptime = (uptime + 1) / 2;
else
halfuptime = 0;
(void)sleep(interval);//睡眠inteval长的时间
分享到:
相关推荐
vmstat核心源代码注释,对理解Linux下的工具原理挺有帮助。
Linux系统命令源码包,包含Top,Free,ps,kill等命令
Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。...下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。
linux vmstat命令详解和使用实例.docx
vmstat命令是最常见的Linux/...一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如: 代码如下:root@ubuntu:~# vmstat 2 1procs ———–memory—
Linux 中可以利用top,ps,iostat,vmstat等命令观察系统性能状况,但如果你觉得在几个工具间切换是件麻烦事,那可以试试 nmon。nmon 是IBM提供的运行于AIX/Linux平台的性能分析工具,可以在同一屏幕中输出CPU、内存、...
主要介绍了linux性能调试之vmstat分析。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
linux中vmstat的使用.docx
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都...
linux下的procps源代码,包括 top、free、ps、kill、vmstat等。从gitlab上下载的,日期20210518。系统上的top命令不好用,很久之前就想将其替换掉,终于找到源代码了。
本资源通过描述命令作用,并结合实例,讲解Linux下常见的几种性能分析工具,包括vmstat、sar、iostat、free、uptime、netstat和top
VMSTAT 用法 。
sar与vmstat命令简介 vmstat命令报告内核线程,虚拟内存、磁盘、陷阱、和CPU活动情况。 Kthr 线程活动情况 r 运行队列 b 等待队列
vmstat命令是常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix喜爱的命令,一个是Linux/Unix都支持...
vmstat详解.
vmstat是Virtual Meomory Statistics的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。iostat是I/O statistics的缩写,iostat工具将...
如果你想动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。 vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用...
vmstat命令详解
vmstat结果内容的解释,和大家共享一下
vmstat 命令详解