Golang Go语言中爬虫CPU占用99%内存占用还好要怎么改?

发布于 1周前 作者 gougou168 来自 Go语言

用的是 surfer 下载正则循环匹配关键词等规则匹配连接,抓取文章。 一百多个网站,词有几千个。


Golang Go语言中爬虫CPU占用99%内存占用还好要怎么改?
11 回复

几个 cpu,什么型号。

更多关于Golang Go语言中爬虫CPU占用99%内存占用还好要怎么改?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不先看看哪些函数占用 cpu 高?
google go pprof

大量关键字匹配
google 大量 关键字 匹配 算法

同怀疑正则的问题

ac 自动机?

谢谢我看下

golang 的正则实现是线性时间复杂度的

参见文档 https://golang.org/pkg/regexp/
> The regexp implementation provided by this package is guaranteed to run in time linear in the size of the input.


pprof 这个生成的文件是空的呀,没有错误提示,咋整?

main{
。。。。
f, err := os.Create(“mains”)
if err != nil {
log.Fatal(err)
}
fmt.Println(f)
// 开启 CPU profiling
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()

#9

我平常是这么做的,代码里面加上下面的内容:

import _ "net/http/pprof"

go func() {
log.Println( http.ListenAndServe(“localhost:6060”, nil))
}()

然后需要分析性能时直接运行下面的命令:

分析 cpu 占用:go tool pprof --web 编译出来的文件.exe http://127.0.0.1:6060/debug/pprof/profile
分析内存占用:go tool pprof -inuse_space --web 编译出来的文件.exe http://127.0.0.1:6060/debug/pprof/heap

可以直接生成 SVG 调用图,很清晰。图是使用 graphviz 生成的,需要在本机安装 graphviz。
如果没有 graphviz,可以去掉 --web 参数,是 cmd 版本。

线上环境推荐这种方式,另外可以浏览器访问 http://127.0.0.1:6060/debug/pprof,里面有不少有用的内容。

如果本身有 http 服务,可以看下 net/http/pprof init() 函数代码,可以照着合并到已有的 http 服务内。

在Go语言中,爬虫程序如果导致CPU占用达到99%,通常意味着存在性能瓶颈,可能是由于并发控制不当、大量计算密集型任务未优化、或是网络I/O处理不当等原因。以下是一些优化建议:

  1. 限制并发数:使用sync.WaitGroupgolang.org/x/sync/semaphore等工具控制goroutine的数量,避免创建过多的并发任务,导致CPU过载。

  2. 优化数据处理:检查爬虫中的数据处理逻辑,尤其是字符串操作和复杂的计算,考虑使用更高效的算法或数据结构。

  3. 使用缓存:对于重复请求的数据,可以使用内存缓存(如github.com/patrickmn/go-cache)减少网络请求和数据处理次数。

  4. 异步I/O:确保网络请求是异步进行的,使用net/http包的客户端功能,结合goroutine和channel,避免阻塞等待。

  5. 调整调度:在Linux系统上,可以使用GOMAXPROCS环境变量调整Go运行时使用的CPU核心数,或考虑使用CPU亲和性技术优化性能。

  6. 性能分析:使用Go的pprof工具进行性能分析,找出CPU和内存使用的热点,针对性地进行优化。

  7. 升级硬件:如果软件层面的优化已无法显著提升性能,考虑增加CPU核心数或提升主频,以支持更高的并发量和数据处理能力。

通过上述方法,可以有效降低CPU占用率,提高爬虫程序的运行效率。

回到顶部