python - 在 Python 中检测内存交换
问题描述
如何检测操作系统何时开始将正在运行的进程的某些资源交换到磁盘?
我从基本相同的问题来到这里。该psutil
库显然很棒并且提供了很多信息,但是我不知道如何使用它来解决问题。
我创建了一个简单的测试脚本。
import psutil
import os
import numpy as np
MAX = 45000
ar = []
pr_mem = []
swap_mem = []
virt_mem = []
process = psutil.Process()
for i in range(MAX):
ar.append(np.zeros(100_000))
pr_mem.append(process.memory_info())
swap_mem.append(psutil.swap_memory())
virt_mem.append(psutil.virtual_memory())
然后,我绘制了这些统计数据的过程。
import matplotlib.pyplot as plt
plt.figure(figsize=(16,12))
plt.plot([x.rss for x in pr_mem], label='Resident Set Size')
plt.plot([x.vms for x in pr_mem], label='Virtual Memory Size')
plt.plot([x.available for x in virt_mem], label='Available Memory')
plt.plot([x.total for x in swap_mem], label='Total Swap Memory')
plt.plot([x.used for x in swap_mem], label='Used Swap Memory')
plt.plot([x.free for x in swap_mem], label='Free Swap Memory')
plt.legend(loc='best')
plt.show()
我看不到如何使用有关交换内存的信息来检测进程的交换。
'Used Swap Memory' 信息有点毫无意义,因为它从一开始就很高(它计算全局消耗),而进程的数据显然没有被交换。
最好看一下进程的“虚拟内存大小”和“驻留集大小”之间的区别。如果 VMS 大大超过 RSS,则表明数据不在 RAM 上,而是在磁盘上。
- 但是,这里描述了一个 VMS 突然爆炸的问题,如果我理解正确的话,这在某些情况下是无关紧要的。
其他方法是查看“可用内存”并确保它不会低于某个阈值,如
psutil
文档所示。但对我来说,正确设置阈值似乎很复杂。他们建议(在小片段中)100 MB,但在我的机器上它大约是 500 MB。
所以问题是成立的。如何检测操作系统何时开始将正在运行的进程的某些资源交换到磁盘?
我在 Windows 上工作,但解决方案需要跨平台(或至少尽可能跨平台)。
欢迎任何建议、建议或有用的链接。谢谢!
对于上下文,我编写了一个需要管理其内存消耗的库。我相信,通过了解程序逻辑,我的手动交换(将数据序列化到磁盘)可以比操作系统交换更好(更快)。更重要的是,它限制了操作系统交换空间,因此,有时需要进行不使用操作系统交换空间的手动交换。
为了在正确的时间开始手动交换,了解操作系统交换何时开始至关重要。
解决方案
推荐阅读
- mapbox - Mapbox GL-JS 确定一个点是否在路线上
- python - 如何从角度向量向量化 N 旋转矩阵的创建?
- c# - 如何使用创建数据的外部 C# 类(例如来自 JS/TS 中的 Cypress)?
- limit - 将 null/invalid/space 等效存储为
INT_MIN 或 LONG_MIN - powershell - Shell NameSpace 更改每个映射网络驱动器的标签
- gradle - gradle插件中的强制依赖版本
- matplotlib - 在同一页面上绘制多个图,每个图中重复一组数据
- python - 为什么 s3.to_parquet 在发布到 AWS Glue 时切换数据类型?
- image - startActivityForResult 已弃用
- go - 为什么这个函数在 golang 中不是线程安全的?