问题描述
- 机器配置:2核2G
- 环境配置:python3.7 asyncio爬虫使用morto读取写入数据库
- 问题字段:
account_id
在数据库中设置为唯一索引键
。当清洗数据后,通过字段account_id
检测重复,cpu就会占用极高,而且占用cpu的程序不是mongod服务,是我自己的爬虫程序
解决过程
- 初步判断是因为程序在空转for循环。导致cpu持续不下来
- 问题已经明确定位在自己的爬虫程序上
- 每次只运行一条操作数据库sql,确认问题sql
- 最后经过排查,
是因为async并发量太高,数据回来之后,都在此处等待着检测重复逻辑,因为任务都等待在这,async内部会不断的轮询检测already的task,但是任务又一直在等待!
- 对于我的程序来说,降低并发量并不太现实,只能在mongo的collection设计上做出改变,因为我检测逻辑是唯一索引,每次查询或者写入,都是需要锁表的,导致这些任务都在这阻塞,通过新建一个collection,不做任何索引,数据来了就异步写入,这样就不会导致ascync内部的检测循环一直空转,导致cpu过高