fix: 获取进程数据处理信息优化

This commit is contained in:
TsMask
2024-09-06 14:21:03 +08:00
parent a7b57af939
commit 83cd5fbd58

View File

@@ -31,48 +31,42 @@ func GetProcessData(requestID string, data any) ([]byte, error) {
return nil, err
}
var (
dataArr = []model.PsProcessData{}
resultMutex sync.Mutex
wg sync.WaitGroup
numWorkers = 4
)
handleData := func(proc *process.Process) {
// 解析数据
handleData := func(proc *process.Process) (model.PsProcessData, bool) {
procData := model.PsProcessData{
PID: proc.Pid,
}
if query.Pid > 0 && query.Pid != proc.Pid {
return
}
procName, err := proc.Name()
if procName == "" || err != nil {
return
} else {
if procName, err := proc.Name(); err == nil {
procData.Name = procName
}
if query.Name != "" && !strings.Contains(procData.Name, query.Name) {
return
}
if username, err := proc.Username(); err == nil {
procData.Username = username
}
// 查询过滤
if query.Pid > 0 && procData.PID != query.Pid {
return procData, false
}
if query.Name != "" && !strings.Contains(procData.Name, query.Name) {
return procData, false
}
if query.Username != "" && !strings.Contains(procData.Username, query.Username) {
return
return procData, false
}
procData.PPID, _ = proc.Ppid()
statusArray, _ := proc.Status()
if len(statusArray) > 0 {
if statusArray, err := proc.Status(); err == nil && len(statusArray) > 0 {
procData.Status = strings.Join(statusArray, ",")
}
createTime, procErr := proc.CreateTime()
if procErr == nil {
if createTime, err := proc.CreateTime(); err == nil {
procData.StartTime = date.ParseDateToStr(createTime, date.YYYY_MM_DD_HH_MM_SS)
}
procData.NumThreads, _ = proc.NumThreads()
if connections, err := proc.Connections(); err == nil {
procData.NumConnections = len(connections)
}
procData.CpuValue, _ = proc.CPUPercent()
procData.CpuPercent = fmt.Sprintf("%.2f", procData.CpuValue) + "%"
procData.CpuPercent = fmt.Sprintf("%.2f%%", procData.CpuValue)
menInfo, procErr := proc.MemoryInfo()
if procErr == nil {
procData.Rss = parse.Bit(float64(menInfo.RSS))
@@ -84,33 +78,24 @@ func GetProcessData(requestID string, data any) ([]byte, error) {
procData.Swap = parse.Bit(float64(menInfo.Swap))
procData.RssValue = menInfo.RSS
} else {
procData.Rss = "--"
procData.Data = "--"
procData.VMS = "--"
procData.HWM = "--"
procData.Stack = "--"
procData.Locked = "--"
procData.Swap = "--"
procData.RssValue = 0
}
ioStat, procErr := proc.IOCounters()
if procErr == nil {
if ioStat, err := proc.IOCounters(); err == nil {
procData.DiskWrite = parse.Bit(float64(ioStat.WriteBytes))
procData.DiskRead = parse.Bit(float64(ioStat.ReadBytes))
} else {
procData.DiskWrite = "--"
procData.DiskRead = "--"
}
procData.CmdLine, _ = proc.Cmdline()
procData.Envs, _ = proc.Environ()
resultMutex.Lock()
dataArr = append(dataArr, procData)
resultMutex.Unlock()
return procData, true
}
var (
dataArr = []model.PsProcessData{}
mu sync.Mutex
wg sync.WaitGroup
numWorkers = 4
)
chunkSize := (len(processes) + numWorkers - 1) / numWorkers
for i := 0; i < numWorkers; i++ {
wg.Add(1)
@@ -122,9 +107,15 @@ func GetProcessData(requestID string, data any) ([]byte, error) {
go func(start, end int) {
defer wg.Done()
localDataArr := make([]model.PsProcessData, 0, end-start) // 本地切片避免竞态
for j := start; j < end; j++ {
handleData(processes[j])
if data, ok := handleData(processes[j]); ok {
localDataArr = append(localDataArr, data)
}
}
mu.Lock()
dataArr = append(dataArr, localDataArr...)
mu.Unlock()
}(start, end)
}