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