gpt4 book ai didi

golang CPU使用率

转载 作者:行者123 更新时间:2023-12-04 12:03:42 36 4
gpt4 key购买 nike

我知道 [1] .通过几行代码,我只想从 CPU 使用率最高的前 n 个进程中提取当前的 CPU 使用率。或多或少是 top 的前 5 行.使用 github.com/shirou/gopsutil/process 这很简单:

// file: gotop.go
package main

import (
"log"
"time"
"sort"

"github.com/shirou/gopsutil/process"
)


type ProcInfo struct{
Name string
Usage float64
}

type ByUsage []ProcInfo

func (a ByUsage) Len() int { return len(a) }
func (a ByUsage) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByUsage) Less(i, j int) bool {
return a[i].Usage > a[j].Usage
}


func main() {

for {
processes, _ := process.Processes()

var procinfos []ProcInfo
for _, p := range processes{
a, _ := p.CPUPercent()
n, _ := p.Name()
procinfos = append(procinfos, ProcInfo{n, a})
}
sort.Sort(ByUsage(procinfos))

for _, p := range procinfos[:5]{
log.Printf(" %s -> %f", p.Name, p.Usage)
}
time.Sleep(3 * time.Second)
}
}

虽然这个实现 gotop 的刷新率和 top 一样是 3 秒,但 gotop 大约有 3 秒。对 CPU 使用率的需求要高 5 倍才能像 top 一样获得这些值。有没有什么技巧可以更有效地读取 5 个最耗电的进程?我还试图找到 top 的实现,看看它是如何在那里实现的。

psutils 是造成这种放缓的原因吗?我发现为 cpustat在 GO 中也实现了。但即使 sudo ./cpustat -i 3000 -s 1好像效率不如 top .

主要动机是通过相当少量的计算工作来监控当前机器的使用情况,以便它可以在后台作为服务运行。

看来,即使是 htop 也是 only reading/过程/统计。

编辑
正如这里的评论中所提议的,这是分析时的结果
Showing top 10 nodes out of 46 (cum >= 70ms)
flat flat% sum% cum cum%
40ms 40.00% 40.00% 40ms 40.00% syscall.Syscall
10ms 10.00% 50.00% 30ms 30.00% github.com/shirou/gopsutil/process.(*Process).fillFromStatusWithContext
10ms 10.00% 60.00% 30ms 30.00% io/ioutil.ReadFile
10ms 10.00% 70.00% 10ms 10.00% runtime.slicebytetostring
10ms 10.00% 80.00% 20ms 20.00% strings.FieldsFunc
10ms 10.00% 90.00% 10ms 10.00% syscall.Syscall6
10ms 10.00% 100% 10ms 10.00% unicode.IsSpace
0 0% 100% 10ms 10.00% bytes.(*Buffer).ReadFrom
0 0% 100% 70ms 70.00% github.com/shirou/gopsutil/process.(*Process).CPUPercent
0 0% 100% 70ms 70.00% github.com/shirou/gopsutil/process.(*Process).CPUPercentWithContext

似乎系统调用需要永远。树转储在这里:
https://gist.github.com/PatWie/4fa528b7d7b1d0b5c1b665c056671477

这将问题更改为:
- 是系统调用的问题吗?
- 是否有 top 的 c 源程序?刚刚找到htop的实现
- 有简单的解决方法吗?我考虑用 c 编写它,然后将其包装起来。

最佳答案

github.com/shirou/gopsutil/process用途 ioutil.ReadFile访问文件系统的效率低于top。特别是ReadFile :

  • 电话Stat这增加了一个额外的不必要的系统调用。
  • 用途 os.Open而不是 unix.Openat + os.NewFile这会导致额外的内核时间遍历 /proc解析路径时。 os.NewFile仍然有点低效,因为它总是检查文件描述符是否是非阻塞的。这可以通过使用 golang.org/x/sys/unix 来避免。或 syscall直接打包。

  • 在 Linux 下检索进程详细信息通常效率很低(大量文件系统扫描、编码文本数据)。但是,您可以获得与 top 类似的性能。使用 Go 通过修复文件系统访问(如上所述)。

    关于golang CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48175264/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com