Linux的VIRT,RES,SWAP
top命令的结果显示了系统的实时性能状态,其中关于memory的相关项,默认有 VIRT, RES, SHARE 等,那么这些项的结果到底怎么理解呢?
最好的解释还是看man 帮助文档:
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes all code, data and shared
libraries plus pages that have been swapped out.
VIRT = SWAP + RES.
p: SWAP -- Swapped size (kb)
The swapped out portion of a task's total virtual memory image.
q: RES -- Resident size (kb)
The non-swapped physical memory a task has used.
RES = CODE + DATA.
这里分享下个人对其中几个概念的理解
-
程序地址空间:
当程序在磁盘上存储的时候,我们可以用相应的工具来分析文件结构,这个时候显示的地址是 程序文件中描述 的地址空间, 比如用 readelf 命令来查看一个elf文件的信息,其中的地址都属于 程序地址空间; -
内存虚拟地址空间(VIRT):
磁盘上的程序要运行,都需要载入内存,这时候就出现了内存虚拟地址空间,一般内存虚拟地址空间和 程序地址空间是不同的,一条申请内存空间的语句,在程序地址空间中可能仅仅占用 几个字节的 code而已 , 但是 在虚拟内存地址空间中则可能对应了很多MB的内存访问地址;
对于一个进程(运行状态的程序)而言,其可以访问的内存虚拟地址空间的大小一般都是随着代码的运行而发生变化的(进程可以根据需要申请更大的空间,也可以根据情况释放掉不需要的空间),而这个变化的内存虚拟地址空间 就是上述的VIRT。 也就是说,VIRT代表了进程当前可以访问的地址空间的范围, 而 可以作为内存地址访问的空间有两类:物理内存 和 虚拟内存。 所以上述公式中: VIRT= SWAP+RES, VIRT 和程序地址空间没有关系,更和程序文件的大小没有关系;
而从内存空间的属性上来说,有进程自己的私有访问空间,也有共享的内存空间,所以VIRT也是 进程私有内存访问空间 和 进程占用的共享内存空间的总和. -
SWAP 和 RES:
理解了上面的VIRT, 那么SWAP就表示 那部分存储在swap分区上的大小.
而RES 就表示 使用的物理内存的大小.
这里需要注意的是:
一个进程占用的RES的大小包含了改进程单独使用的RES, 同时也包含了系统共享的内存空间,所以要判断一个进程独自占用的物理内存的大小,需要用RES 减去 其占用的共享内存的RES部分
4. 查看进程更详细的内存使用情况:
A. 用top 命令可以调出 data, code... 等使用情况,也可以查看major page fault, min page fault 等
B. 通过ps 命令的rsz option 来输出内存的使用情况;
C. cat /proc/[PID]/status 来查看 内存的相关情况, 其实该命令的结果不止是显示内存,内存信息是其内容的一小部分;
D. 如果要查看内存的mapping 关系,可以通过 : cat /proc/[PID]/maps 来获得;
同时也可以用命令 pmap -x PID 来查看;
E. 如果需要查看每一个mapping的更详细的memory 分配信息,用 cat /proc/[PID]/smaps