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