fix: 获取进程数据处理信息优化
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user