dbproxy层:
1、dbproxy的com.ctg.udal.dbproxy.monitor.system.CpuMonitor对象专门用于统计CPU相关信息,该对象的info方法会用输入流读取linux的/proc/stat文件,文件格式如下
第一行的数值表示的是CPU总的使用情况,各数值的含义如下:
| 参数 | 解析(单位:jiffies) |
|---|---|
| user(227241) | 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。 |
| nice(16) | 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间 |
| system(330572) | 从系统启动开始累计到当前时刻,处于核心态的运行时间 |
| idle(21779298) | 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间 |
| iowait(26643) | 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41) |
| irq(0) | 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4) |
| softirq(15461) | 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4) |
| steal(0) | 从系统启动开始累计到当前时刻,这是在虚拟环境中运行时在其他操作系统上花费的时间。(Since Linux 2.6.11) |
| guest(0) | 从系统启动开始累计到当前时刻,在Linux内核的控制下为客户操作系统运行虚拟CPU的时间。(Since Linux 2.6.24) |
info读取第一行数据就能得到CPU空闲时间idle=iowait(26643),总运行时间total=user(227241)
2、类似的,dbproxy的com.ctg.udal.dbproxy.monitor.system.ProcessCpuMonitor对象专门用于统计进程CPU相关信息,该对象的ProcessInfo方法会用输入流读取linux的/proc/[PID]/stat文件,文件格式如下
| pid(9277) | 进程ID |
|---|---|
| comm(java) | task_struct结构体的进程名 |
| state(S) | 进程状态, 此处为S |
| ppid(1) | 父进程ID (父进程是指通过fork方式,通过clone并非父进程) |
| pgrp(9251) | 进程组ID |
| session(9251) | 进程会话组ID |
| tty_nr(0) | 当前进程的tty终点设备号 |
| tpgid(-1) | 控制进程终端的前台进程号 |
| flags(1077944320) | 进程标识位,, 此处等于定义在include/linux/sched.h中的PF_* |
| minflt(182201) | 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数 |
| cminflt(45976727) | 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目 |
| maj_flt(447) | 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数 |
| cmaj_flt(65) | 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目 |
| utime(150149) | 该任务在用户态运行的时间,单位为jiffies |
| stime(519431) | 该任务在核心态运行的时间,单位为jiffies |
| cutime(19396) | 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies |
| cstime(42601) | 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies |
| …… | ……. |
ProcessInfo方法通过计算可得进程运行总时间ctotal=utime+stime+cutime+cstime;
3、com.ctg.udal.dbproxy.monitor.system.SystemInfoThread是专门用于统计进程信息的线程,每隔0.5s会调用上述两个方法计算系统和dbproxy的数据并记录在一个map上。
4、com.ctg.udal.dbproxy.monitor.system.LinuxSystemMonitorManager类提供了根据上述map的数据计算实时CPU的方法:
4.1系统CPU使用率:
4.1.1获取第三步中map文件的相邻的系统CPU数据(total1,idle1)和(total2,idle2);
4.1.2系统CPU使用率=((total1-total2)-(idle1-idle2))/(total1-total2);
4.2dbproxy的CPU使用率:
4.2.1获取第三步中map文件的相邻的系统CPU数据(total1,idle1)和(total2,idle2);
4.2.2获取第三步中map文件的相邻的dbproxy的CPU数据ctotal1和ctotal2;
4.2.3dbproxy的CPU使用率=(ctotal1-ctotal2)/(total1-total2);
com.ctg.udal.dbproxy.command.show.ShowServerCommand#executeQuery方法中分别在89和107行使用以下两行代码获得dbproxy的CPU和System的CPU数据
row.add(String.valueOf(SystemMonitorManager.getInstance().getProcessCpuData().getUsage()));
row.add(String.valueOf(SystemMonitorManager.getInstance().getSystemCpuData().getUsage()));
