5.1 Linux内存子系统
在诊断内存性能问题的时候,也许有必要观察应用程序在内存子系统的不同层次上是怎样执行的。在顶层,操作系统决定如何利用交换内存和物理内存。它决定应用程序的哪一块地址空间将被放到物理内存中,即所谓的驻留集。不属于驻留集却又被应用程序使用的其他内存将被交换到磁盘。由应用程序决定向操作系统请求多少内存,即所谓的虚拟集。
当应用程序使用物理内存时,它首先与CPU的高速缓存子系统交换。现代CPU有多级高速缓存。最快的高速缓存离CPU最近(L1),其容量也是最小的。举个例子,假设CPU只有两级高速缓存:L1和L2.当CPU请求一块内存时,处理器会检查看该内存是否已经存在于L1高速缓存中。如果处于,CPU就可以直接使用。如果不在L1高速缓存中,处理器产生一个L1高速缓存不命中。然后它会检查L2高级缓存,如果数据在L2缓存中,那么它可以直接使用;否则处理同上,然后去物理内存中取回信息。明智使用高速缓存,减少高速缓存不命中的次数,可以提高性能。
5.2 内存性能工具
5.2.1 ps
ps内存参数说明
参数 | 说明 |
---|---|
vsz | 虚拟集大小是指应用程序使用的虚拟内存的容量。由于Linux只在应用程序试图使用物理内存时才分配它,因此,该项数值可能会比应用程序使用的物理内存量大很多。 |
rss | 驻留集大小是指应用程序当前使用的物理内存量 |
tsiz | 文本大小是指程序代码的虚拟大小 |
dsiz | 数据大小是指程序使用率的虚拟大小 |
majflt | 主故障是指使得Linux代表进程从磁盘读取页面的缺页故障的数量。 |
5.2.2 /proc/<PID>
Linux内核提供一个虚拟文件系统,使你能提取在系统上运行的进程信息。/proc的接口非常简单,里面的虚拟文件可以用cat来读取。系统上的每个PID在/proc目录下都有一个文件夹,包含一系列的文件。其中status是进程的PID的进程信息,其检索命令为:
cat /proc/<PID> status
status文件显示的内存统计信息部分解析如下
输出 | 说明 |
---|---|
VmSize | 仅存的虚拟集大小,是应用程序使用的虚拟内存量,同ps的vsz |
VmLck | 被进程锁定的内存量,被锁定的内存不能交换到磁盘 |
VmRSS | 驻留集大小或者应用程序当前使用的物理内存量。 |
VmData | 数据大小或程序使用数据量的虚拟大小,不包含堆栈信息 |
VmStk | 进程的堆栈大小 |
VmExe | 程序的可执行内存的虚拟大小。它不包含进程使用的库 |
VmLib | 进程使用的库的大小 |
例子:查看weblogic进程的情况
可以看出这个java进程的程序代码只有36K,堆栈96K,数据很大(2712776K),库不大不小(92608)。说明进程没有多少的可执行代码,使用了90多M的库来支持其执行,小的堆栈意味着该进程没有调用深度嵌套的函数,或者没有调用使用了大型或多个临时变量的函数。VmLck说明没有内存被锁定,使得没法交换内存。VmRSS大小为1.1G意味着当前进程使用了1.1G的物理内存,不过它分配或映射的大小为2.8G。如果应用程序开始使用之前已分配但并非正在使用的内存,那么VmRSS会增加,而VmSize会保持不变。
如上所述,应用程序的Vmlib的大小不为零,因此使用了库,可以查看maps文件来了解它使用了哪些库。
网友评论