psutil升级至5.9.0后调用mem.dirty报AttributeError如何解决
问题根因
psutil 5.7.0及以上版本调整了跨平台API的字段返回规则:
psutil.virtual_memory()返回结果中的dirty(脏页内存)字段是Linux、macOS、BSD等类Unix系统的专属字段,Windows平台原生不提供该统计值- 5.6.6及更早版本会对当前平台不支持的统计字段返回0作为占位值,因此直接访问
mem.dirty不会触发属性错误 - 5.7.0之后的版本移除了非支持平台的无效占位字段,升级到5.9.0版本后,在不支持该字段的平台下直接访问
mem.dirty就会抛出*AttributeError: psutil has no attribute 'dirty'*异常。
修复方案
可根据项目实际部署场景选择以下任意一种方案修复:
- 跨平台兼容适配(推荐):通过属性兜底读取的方式对齐旧版本逻辑,在不支持
dirty字段的平台下默认返回0,无需判断平台、无需锁定依赖版本,兼容全平台、全psutil版本,修改后代码如下:
import psutil mem = psutil.virtual_memory() # 优先读取真实dirty字段值,属性不存在时兜底返回0 mem_dirty = getattr(mem, "dirty", 0) x.add_metric(schema.yy_MEMORY_DIRTY, mem_dirty)
- 锁定依赖版本:如果项目仅在支持
dirty字段的类Unix系统部署,且暂时不想修改业务代码,可以在依赖配置文件中锁定psutil版本为兼容的旧版本,例如在requirements.txt中声明psutil==5.6.6即可恢复原有运行逻辑。 - 平台专属采集:如果需要在Windows平台获取准确的脏页内存指标,不要依赖psutil的通用接口,可通过调用Windows原生
GlobalMemoryStatusEx系统API单独采集对应数值后,再传入指标上报方法。
内容的提问来源于stack exchange,提问作者Amit Kumar Manjhi
相关产品推荐
相关产品推荐

