zoukankan      html  css  js  c++  java
  • Linux性能优化 第五章 性能工具:特定进程内存

    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代表进程从磁盘读取页面的缺页故障的数量。

    image.png

    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进程的情况

    image.png

    可以看出这个java进程的程序代码只有36K,堆栈96K,数据很大(2712776K),库不大不小(92608)。说明进程没有多少的可执行代码,使用了90多M的库来支持其执行,小的堆栈意味着该进程没有调用深度嵌套的函数,或者没有调用使用了大型或多个临时变量的函数。VmLck说明没有内存被锁定,使得没法交换内存。VmRSS大小为1.1G意味着当前进程使用了1.1G的物理内存,不过它分配或映射的大小为2.8G。如果应用程序开始使用之前已分配但并非正在使用的内存,那么VmRSS会增加,而VmSize会保持不变。

    如上所述,应用程序的Vmlib的大小不为零,因此使用了库,可以查看maps文件来了解它使用了哪些库。

    image.png

  • 相关阅读:
    Keepalived 无法自动转换主备角色,请关注 iptables 防火墙配置
    Linux 下使用网易的SMTP服务器 发送邮件
    Spring-boot 最小demo
    go build 时报错 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
    spark-shell 执行脚本并传入参数
    JVM
    spark
    spark
    linux
    linux
  • 原文地址:https://www.cnblogs.com/tcicy/p/10080412.html
Copyright © 2011-2022 走看看