still ugly, get pid and some pids and sum it

master
codeskyblue 8 years ago
parent 4105d99628
commit 6e3c782d75

@ -4,6 +4,7 @@ var vm = new Vue({
data: {
name: name,
pid: '-',
subPids: [],
}
});
@ -14,6 +15,7 @@ var ws = newWebsocket('/ws/perfs/' + name, {
onmessage: function(evt) {
var data = JSON.parse(evt.data);
vm.pid = data.pid;
vm.subPids = data.sub_pids;
console.log("pid", data.pid, data); //evt.data.pid);
if (memData && data.mem && data.mem.rss) {
memData.push({

@ -38,6 +38,9 @@
<h1>{{name}}</h1>
<p>
pid: {{pid}}
<br> sub pids: {{subPids.join(',')}}
</p>
<p>
<br> status: running
<br> time: 2016/09/07 12:00:00
</p>
@ -92,6 +95,9 @@
},
xAxis: {
type: 'time',
splitLine: {
show: false
}
},
yAxis: {
type: 'value',
@ -116,23 +122,16 @@
chartCpu.setOption(option);
// var timeTicket = setInterval(function() {
// for (var i = 0; i < 1; i++) {
// data.shift();
// data.push(randomData());
// }
// chartCpu.setOption({
// series: [{
// data: data
// }]
// });
// }, 1000);
var memData = [];
var option = {
title: {
text: 'Memory'
},
toolbox: {
feature: {
saveAsImage: {}
}
},
tooltip: {
trigger: 'axis',
formatter: function(params) {
@ -151,6 +150,9 @@
},
xAxis: {
type: 'time',
splitLine: {
show: false
}
},
yAxis: {
type: 'value',

100
web.go

@ -19,6 +19,7 @@ import (
"github.com/go-yaml/yaml"
"github.com/gorilla/mux"
"github.com/gorilla/websocket"
gps "github.com/mitchellh/go-ps"
"github.com/qiniu/log"
"github.com/shirou/gopsutil/process"
)
@ -456,6 +457,63 @@ func (s *Supervisor) wsLog(w http.ResponseWriter, r *http.Request) {
}
}
func getAllSubPids(pid int) (subps []int, err error) {
pses, err := gps.Processes()
if err != nil {
return
}
pidMap := make(map[int][]gps.Process, 0)
for _, p := range pses {
pidMap[p.PPid()] = append(pidMap[p.PPid()], p)
}
var travel func(int)
travel = func(pid int) {
for _, p := range pidMap[pid] {
subps = append(subps, p.Pid())
travel(p.Pid())
}
}
travel(pid)
return
}
func getTotalMem(pids []int) *process.MemoryInfoStat {
minfo := &process.MemoryInfoStat{}
for _, pid := range pids {
p, err := process.NewProcess(int32(pid))
if err != nil {
continue
}
m, err := p.MemoryInfo()
if err != nil {
continue
}
minfo.RSS += m.RSS
minfo.Swap += m.Swap
minfo.VMS += m.VMS
}
return minfo
}
func getTotalCpu(pids []int) float64 {
var pcpu float64
for _, pid := range pids {
p, err := process.NewProcess(int32(pid))
if err != nil {
continue
}
// still need to fix here
// use gosigar instead
n, err := p.Percent(300 * time.Millisecond)
log.Println(p.Pid, n, err)
if err != nil {
continue
}
pcpu += n
}
return pcpu
}
// Performance
func (s *Supervisor) wsPerf(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
@ -472,28 +530,38 @@ func (s *Supervisor) wsPerf(w http.ResponseWriter, r *http.Request) {
// TODO: raise error here?
return
}
if proc.cmd == nil || proc.cmd.Process == nil {
log.Println("process not running")
return
}
var pid = proc.cmd.Process.Pid
ps, err := process.NewProcess(int32(pid))
if err != nil {
log.Println(err)
return
}
for {
mstat, _ := ps.MemoryInfo()
pcpu, _ := ps.Percent(300 * time.Millisecond)
if proc.cmd == nil || proc.cmd.Process == nil {
log.Println("process not running")
return
}
pid := proc.cmd.Process.Pid
spids, err := getAllSubPids(pid)
if err != nil {
log.Println(err)
break
}
pids := append(spids, pid)
log.Println(pids)
mstat := getTotalMem(pids)
pcpu := getTotalCpu(pids)
// for _, spid := range spids {
// fmt.Println("spid:", spid)
// }
// mstat, _ := ps.MemoryInfo()
// pcpu, _ := ps.Percent(300 * time.Millisecond)
err = c.WriteJSON(map[string]interface{}{
"pid": pid,
"mem": mstat,
"cpu": pcpu,
"pid": pid,
"sub_pids": spids,
"mem": mstat,
"cpu": pcpu,
})
if err != nil {
break
}
time.Sleep(500 * time.Millisecond)
time.Sleep(700 * time.Millisecond)
}
}

Loading…
Cancel
Save