Python GVM API出现Broken Pipe及Bad File Descriptor错误原因排查
Broken Pipe错误的本质是:当你尝试向一个已经被对方关闭的网络连接写入数据时,操作系统返回的错误。结合你这个OpenVAS报告抓取+Prometheus指标暴露的场景,常见原因有这几个:
Prometheus主动终止了采集连接
Prometheus有scrape_timeout配置(默认10秒),如果你的API抓取OpenVAS报告、计算指标的耗时超过了这个超时时间,Prometheus会直接断开HTTP连接。但你的代码可能还在继续生成指标数据并往响应流里写,这时候就会触发Broken Pipe错误。OpenVAS服务器中途断开了连接
抓取OpenVAS报告的过程中,OpenVAS服务可能因为负载过高、会话超时或者内部错误提前关闭了和你的API之间的连接,但你的代码还在尝试读取报告数据或者发送请求,导致写入已断开的连接。网络链路异常中断
API和OpenVAS服务器、API和Prometheus之间的网络出现波动(比如防火墙重置连接、网络丢包、路由变更),导致连接被强制关闭,后续的读写操作就会触发Broken Pipe。代码层面的资源管理问题
比如你的HTTP响应对象没有正确处理异步/并发场景,或者在抓取OpenVAS数据时,连接资源没有及时释放,后续代码还在复用已失效的连接实例进行读写操作。
如果能提供具体的代码片段和完整报错栈,可以更精准定位到是哪一种情况(比如报错栈里如果是在往HTTP响应写数据时触发,大概率是Prometheus超时;如果是在调用OpenVAS API时触发,就是OpenVAS侧的连接问题)。
内容的提问来源于stack exchange,提问作者Christophe Dumont

