From 83cd5fbd58678a90cf1d57c5679f9b3f0bbeef1f Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 6 Sep 2024 14:21:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=8E=B7=E5=8F=96=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E4=BF=A1=E6=81=AF=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/ws/processor/ps_process.go | 77 ++++++++++++-------------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/src/modules/ws/processor/ps_process.go b/src/modules/ws/processor/ps_process.go index 660cc765..ff5d8fa2 100644 --- a/src/modules/ws/processor/ps_process.go +++ b/src/modules/ws/processor/ps_process.go @@ -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) }