Golang Go语言中爬虫CPU占用99%内存占用还好要怎么改?
用的是 surfer 下载正则循环匹配关键词等规则匹配连接,抓取文章。 一百多个网站,词有几千个。
Golang Go语言中爬虫CPU占用99%内存占用还好要怎么改?
几个 cpu,什么型号。
更多关于Golang Go语言中爬虫CPU占用99%内存占用还好要怎么改?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这种情况 99%是正则写的有问题
参考 https://blog.csdn.net/ityouknow/article/details/80851338
不先看看哪些函数占用 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处理不当等原因。以下是一些优化建议:
-
限制并发数:使用
sync.WaitGroup
或golang.org/x/sync/semaphore
等工具控制goroutine的数量,避免创建过多的并发任务,导致CPU过载。 -
优化数据处理:检查爬虫中的数据处理逻辑,尤其是字符串操作和复杂的计算,考虑使用更高效的算法或数据结构。
-
使用缓存:对于重复请求的数据,可以使用内存缓存(如
github.com/patrickmn/go-cache
)减少网络请求和数据处理次数。 -
异步I/O:确保网络请求是异步进行的,使用
net/http
包的客户端功能,结合goroutine和channel,避免阻塞等待。 -
调整调度:在Linux系统上,可以使用
GOMAXPROCS
环境变量调整Go运行时使用的CPU核心数,或考虑使用CPU亲和性技术优化性能。 -
性能分析:使用Go的
pprof
工具进行性能分析,找出CPU和内存使用的热点,针对性地进行优化。 -
升级硬件:如果软件层面的优化已无法显著提升性能,考虑增加CPU核心数或提升主频,以支持更高的并发量和数据处理能力。
通过上述方法,可以有效降低CPU占用率,提高爬虫程序的运行效率。