dbproxy层:
    1、dbproxy的com.ctg.udal.dbproxy.monitor.system.CpuMonitor对象专门用于统计CPU相关信息,该对象的info方法会用输入流读取linux的/proc/stat文件,文件格式如下
    image.png
    第一行的数值表示的是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文件,文件格式如下
    image.png

    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()));