package service
|
|
import (
|
"basic.com/pubsub/protomsg.git"
|
"basic.com/valib/bhomedbapi.git"
|
"regexp"
|
"strings"
|
"vamicro/sysinfo-service/models/gogpu"
|
|
"github.com/shirou/gopsutil/process"
|
)
|
|
const ProcName = "sysinfo-service"
|
|
var BasicProc = map[string]string{
|
"analysis": "算法处理单元",
|
"apiserver": "basic接口服务",
|
"decoder": "视频解码服务",
|
"elasticsearch": "分布式数据搜索引擎",
|
"faceDetect": "人脸识别服务",
|
"file-service": "文件服务",
|
"pollcontrol": "轮询管理",
|
"ruleServer": "规则处理单元",
|
"dataProcess": "规则处理单元",
|
"schedule": "调度进程",
|
"sdkCompare": "人脸比对服务",
|
"sshd": "ssh服务端",
|
"videopublish": "实时视频推流服务",
|
"videosvr.out": "国标上级服务",
|
"weed": "分布式文件系统",
|
}
|
|
type UsedMap map[int]int64
|
|
func (u UsedMap) Get(key int) int64 {
|
if _, ok := u[key]; !ok {
|
return 0
|
} else {
|
return u[key] / 1024 / 1024
|
}
|
}
|
|
type Proc struct {
|
Name string `json:"name"`
|
Desc string `json:"desc"`
|
Pid int32 `json:"pid"`
|
Cpu float64 `json:"cpu"`
|
Mem float32 `json:"mem"`
|
disk int64 `json:"disk"`
|
Gpu int64 `json:"gpu"`
|
Net int32 `json:"net"`
|
}
|
|
func CollectAlgoProcess() []Proc {
|
var procs []Proc
|
var gpuMemTotal int64
|
var re = regexp.MustCompile(`-sdk=(\S+)`)
|
gpuPer := UsedMap{}
|
|
gpuInfo, err := gogpu.Info()
|
if err == nil {
|
for _, gpu := range gpuInfo.Info {
|
gpuMemTotal = gpuMemTotal + gpu.GpuMemoryTotal
|
}
|
|
for _, proc := range gpuInfo.Processes {
|
if _, ok := gpuPer[proc.Pid]; ok {
|
gpuPer[proc.Pid] = gpuPer[proc.Pid] + int64(proc.UsedMem)
|
} else {
|
gpuPer[proc.Pid] = int64(proc.UsedMem)
|
}
|
}
|
}
|
|
ps, _ := process.Processes()
|
|
// 统计算法信息
|
for _, p := range ps {
|
if name, err := p.Name(); err == nil {
|
if name == "analysis" {
|
cmdLine, _ := p.Cmdline()
|
if len(cmdLine) > 0 {
|
match := re.FindAllStringSubmatch(cmdLine, -1)
|
if len(match) > 0 && len(match[0]) > 1 {
|
proc := Proc{
|
Name: match[0][1],
|
Pid: p.Pid,
|
Desc: match[0][1],
|
}
|
|
proc.Cpu, _ = p.CPUPercent()
|
proc.Mem, _ = p.MemoryPercent()
|
proc.Gpu = gpuPer.Get(int(p.Pid))
|
|
procs = append(procs, proc)
|
}
|
}
|
}
|
}
|
|
}
|
|
return procs
|
}
|
|
func CollectAppProcess() []Proc {
|
var procs []Proc
|
var gpuMemTotal int64
|
|
dbApi := bhomedbapi.AppApi{}
|
installedAppMap := make(map[string]protomsg.App)
|
|
// 存储appMap的文件名
|
apps := dbApi.FindAppMap()
|
for k, v := range dbApi.FindAppMap() {
|
if v.ProcName != "" {
|
installedAppMap[v.ProcName] = apps[k]
|
}
|
}
|
|
// 统计gpu
|
gpuPer := UsedMap{}
|
|
gpuInfo, err := gogpu.Info()
|
if err == nil {
|
for _, gpu := range gpuInfo.Info {
|
gpuMemTotal = gpuMemTotal + gpu.GpuMemoryTotal
|
}
|
|
for _, proc := range gpuInfo.Processes {
|
if _, ok := gpuPer[proc.Pid]; ok {
|
gpuPer[proc.Pid] = gpuPer[proc.Pid] + int64(proc.UsedMem)
|
} else {
|
gpuPer[proc.Pid] = int64(proc.UsedMem)
|
}
|
}
|
}
|
|
// 统计正在运行的应用信息
|
ps, _ := process.Processes()
|
for _, p := range ps {
|
if name, err := p.Name(); err == nil {
|
if app, isExist := installedAppMap[name]; isExist {
|
proc := Proc{
|
Name: app.Name,
|
Pid: p.Pid,
|
Desc: app.Title,
|
}
|
|
proc.Cpu, _ = p.CPUPercent()
|
proc.Mem, _ = p.MemoryPercent()
|
proc.Gpu = gpuPer.Get(int(p.Pid))
|
|
procs = append(procs, proc)
|
|
delete(installedAppMap, name)
|
}
|
}
|
}
|
|
// 追加未启动的应用
|
for _, v := range installedAppMap {
|
proc := Proc{
|
Name: v.Name,
|
Pid: 0,
|
Desc: v.Title,
|
}
|
|
proc.Cpu = 0
|
proc.Mem = 0
|
proc.Gpu = 0
|
|
procs = append(procs, proc)
|
}
|
|
return procs
|
}
|
|
func CollectVasystemService() (rsp []Proc) {
|
ps, _ := process.Processes()
|
|
for k, v := range BasicProc {
|
proc := Proc{
|
Name: k,
|
Desc: v,
|
}
|
|
for _, p := range ps {
|
if name, err := p.Name(); err == nil {
|
if name == k {
|
proc.Pid = p.Pid
|
|
break
|
}
|
}
|
|
if k == "elasticsearch" {
|
cmdLine, _ := p.Cmdline()
|
if strings.Contains(cmdLine, k) {
|
proc.Pid = p.Pid
|
|
break
|
}
|
}
|
}
|
|
rsp = append(rsp, proc)
|
}
|
|
return
|
}
|