php实现在linux下计算cpu和mem的使用率情况
Linux下可以非常方便的读取系统、进程、以及线程的运行状态和信息。
在/proc下面,可以读取系统的运行参数
比如:
cpuinfo 获取服务器的cpu信息
meminfo 获取内存的使用情况
stat 获取cpu的活动情况,累计cpu从系统启动到现在的时长,单位都是1/100秒
statm 获取内存的活动情况
在/proc/<pid>下面,可以读取pid为<pid>的进程信息,
比如:
stat 获取cpu的占用时间,累计进程占用cpu的时长,单位是1/100秒
statm获取内存的占用空间大小
在/proc/<pid>/task/<tid>下面是读取tid为<tid>的线程信息
比如:
stat,statm等,与进程中文件结构相同
计算某个进程cpu和内存使用率
内存使用率计算:
总内存量:totalmem = meminfo中获取内存的总量MemTotal对应的值
进程实际占用内存大小:processmem = <pid>/status文件中获取VmRSS对应的值
Ps: (实际也可以在<pid>/statm中获取,但里面是页数,要乘以每页的大小字节数,一般4k)
内存使用率:pmem = processmem/totalmem * 100%;
cpu使用率计算:
cpu总的使用时长: totalcpu1 = stat文件第一行数字总和,里面是各种时间,user + nice + system + idle + iowait + irq + softirq + stealstolen + guest
进程使用cpu时长:processcpu1 = 读取<pid>/stat文件,按照空格区分,第14位到17位数字,分别表示为utime,stime,cutime,cstime,时长为utime+stime
ps:(有些文章写需要四个时间加和,但我测试后结果和top,ps不一致,后看top源文件,发现并没有使用cutime,cstime,因此去掉)
隔一段时间后,在同样方法取一次,标记为totalcpu2,processcpu2
ps:(间隔时间不能过短,因为文件中记录的时间单位为1/100秒,即至少要大于10毫秒才有意义)
cpu核数:cpunum = /proc/stat中,可以根据cpu[0-9]计算cpu核数
cpu使用率:pcpu = (processcpu2-processcpu1)/(totalcpu2-totalcpu1)*cpunum*100%