1.在linux下,查看一个运行中的程序,占用了多少显存,通常的命令有
(1).psaux:
其中VSZ(或VSS)列表示,程序占用了多少虚拟显存。
RSS列表示,程序占用了多少化学显存。
虚拟显存可以不用考虑,它并不占用实际化学显存。
(2).top命令也可以
其中VIRT(或VSS)列表示,程序占用了多少虚拟显存。同psaux中的VSZ列
RES列表示,程序占用了多少化学显存。同psaux中的RSS列
2.在linux下,查看当前系统占用了多少显存,通常的命令是free
其中,free就是系统还有多少显存可以使用。
但因为linux系统对显存使用有一个原则,就是,显存是宝贵的,能使用多少就使用多少。所以,linux会把早已调用过的包缓存上去,置于显存里。
这样linux查看程序占用内存,实际上,可以使用的显存,就可以理解为,free+buffers+cached
3.当你了解完这种命令之后,再去使用psaux命令去查看的时侯,会发觉一个奇怪的现象。
所有的RSS列的数据,加上去,比化学显存的数要大好多。
例如linux查看程序占用内存,化学显存为2G,而RSS列的数据加上去,可能有5个G之多,这是如何回事了?
这是由于RSS列的值骗了我们。
linux的显存机制是这样的:
在运行一个程序时,linux会调用该程序依赖的链接库,如lib.xx.so。首先看该链接库是否被映射进显存中,假如没有被映射,则将代码段与数据段映射到显存中,否则只是将其加入进程的地址空间。
这样,当N个程序,依赖到lib.xx.so的时侯,实际上,显存中只有一个lib.xx.sored hat linux,而不是N个。
而RSS在显示一个程序占用的实际化学显存时,将lib.xx.so也算了进来。
例如,X程序,本身占用显存为5M,lib.xx.so占用显存2M,lib.xx.so被N个程序共享依赖。则RSS显示为,X程序运行,占用显存为7M。实际上,X程序占用了5M空间。多余的2m被讨入到RSS中了。
当你在用psaux显示显存占用情况时,N个共享依赖lib.xx.so的N个程序,都把这2m空间linux中文乱码,算在自己的RSS中了,这样RSS的sum值,就比实际化学显存多了。
其实,linux的显存使用机制很复杂,不是一句两句能说清楚的。这儿只是简单的说明了一下,psaux中的RSS值,并不能真实反映化学显存的使用情况。
4.假如查看更详尽的显存使用情况,可用以下几种方式,或则几种方式结合使用:
这几种方式,都须要root帐户的权限
(1).pmap-d$pid
$pid是正在运行的程序的pid
(2).cat/proc/$pid/smaps
smaps的数据比较详尽,可简单的归纳一下,归纳的命令如下:
cat/proc/$pid/smaps|awk'/Size|Rss|Pss|Shared|Private|Referenced|Swap/{val_name=gensub(/([a-zA-Z_]*).*/,"\1",1,$1);list[val_name]+=$2;}END{for(valinlist)printval,list[val];}'
(3).cat/proc/$pid/maps
(4).cat/proc/$pid/statm
输出解释
第一列size:任务虚拟地址空间大小
第二列Resident:正在使用的数学显存大小
第三列Shared:共享页数
第四列Trs:程序所拥有的可执行虚拟显存大小
第五列Lrs:被映像倒任务的虚拟显存空间的库的大小
第六列Drs:程序数据段和用户态的栈的大小
第七列dt:脏页数目