Linux下如何获取系统总固定内存?PyTorch pin_memory异常排查
问题解答
1. 如何获取系统总固定内存大小?
Linux系统中,被固定(页锁定,无法交换到磁盘)的总内存可通过查看/proc/meminfo文件的Locked字段直接获取:
cat /proc/meminfo | grep Locked
输出示例:Locked: 81920 kB,其中的数值就是当前系统所有被锁定的内存总量。
另外,free命令也能展示该数据,加上-h参数可输出人类可读的格式:
free -h
在输出的Mem行里,locked列对应的就是总固定内存大小。
2. 为什么用torch.tensor(xxx, pin_memory=True)分配固定内存后,进程的VmPin和VmLck仍为0?
这是因为PyTorch的pin_memory=True是通过CUDA的cudaHostAlloc系列API分配页锁定内存的,而Linux进程/proc/<PID>/status里的VmPin和VmLck仅统计通过mlock()/mlockall()系统调用直接锁定的用户态内存,CUDA分配的页锁定内存属于内核层面管理的资源,不会被计入进程的这两个字段。
如果要验证PyTorch是否成功分配了页锁定内存,可以通过以下方式:
- 使用PyTorch内置统计函数:比如
torch.cuda.memory_stats(),其中reserved_bytes.all.host字段包含页锁定内存的占用量;或者调用torch.cuda.memory_reserved(device='cpu')(此处指定CPU是因为pin_memory分配的是主机内存)。 - 查看
nvidia-smi输出,找到对应进程的Memory-Usage区域,Reserved列的数值包含了CUDA分配的页锁定内存。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

