内存

内存性能评估
Linux系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用硬盘空间补充物理内存,将暂时不使用的内存页写到硬盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从硬盘(虚拟内存)中读回内存。这一切对于用户来说是透明的。通常对Linux系统来说,虚拟内存就是swap分区

内存不足的表现:

  • free  memory急剧减少,回收buffer和cacher也无济于事
  • 大量使用交换分区(swpd)
  • 页面交换(swap)频繁
  • 读写磁盘数量(io)增多
  • 缺页中断(in)增多
  • 上下文切换(cs)次数增多
  • 等待IO的进程数(b)增多
  • 大量CPU时间用于等待IO(wa)

1.利用free指令监控内存

实际上来说,程序占用的真正内存就是:- buffers/cached 的数值。
程序角度上看未使用、可用的内存数:+ buffers/cached
所以看系统,真正已经用的内存数:used-(buffers+cached)的值。
真正未用到的内存数:free+buffers+cached  的值
经验公式:
应用程序可用内存/系统物理内存>70%,表示系统内存资源非常充足,不影响系统性能;
应用程序可用内存/系统物理内存<20%,表示系统内存资源紧缺,需要增加系统内存;20%<应用程序可用内存/系统物理内存<70%,表示系统内存资源基本能满足应用需求,暂时不影响系统性能
分析思路:
当 –/+ buffers/cache中的free长时间接近0,且 swap used长时间比较大时,说明物理内存已经不够用了,需要升级内存或降低内存的使用量。

2.利用vmstat命令监控内存

swpd--切换到内存交换区的内存数量(k为单位)。如swpd值偶尔非0,不影响系统性能

free--当前空闲的物理内存数量(k为单位)

buff--buffers cache的内存数量,一般对块设备的读写才需要缓冲
cache--page cached的内存数量
一般作为文件系统cached,频繁访问的文件都会被cached,如cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
si--由磁盘调入内存,也就是内存进入内存交换区的数量。
so--由内存调入磁盘,也就是内存交换区进入内存的数量。
si、so 两列,表示磁盘和内存之间交换的频繁程度。
分析思路:
1)si、so的值长期不为0,表示系统内存不足。需增加系统内存。
2)如果 si、so 数值长期很大并且free长期很小,表示物理内存不能满足需要,也就是内存不足。由于磁盘的性能比内存是慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。
-swap:切换到交换内存上的内存(默认以KB为单位)
3)如果SWAP的值不为0,或者还比较大,比如超过100M了,但是SI,SO的值长期为0,这种情况我们可以不用担心,不会影响系统性能。
3.利用sar监控内存
sar -r 1
显示内存情况,其中commit显示的是内存使用率

 

一、cat /proc/meminfo  查看内存分配情况,这个文件记录着比较详细的内存配置信息

我们比较关心的是下面几个字段:
MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入。
MemFree:系统空闲内存。
MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
Buffers:缓冲区内存
Cached:缓存
1. cat /proc/meminfo
2.MemTotal:        1019644 kB    所有可用RAM大小 (即物理内存减去一些预留位和内核的二进
3.制代码大小)
4.MemFree:          119464 kB    LowFree与HighFree的总和,被系统留着未使用的内存
5.Buffers:          110680 kB    用来给文件做缓冲大小
6.Cached:           256796 kB    被高速缓冲存储器(cache memory)用的内存的大小(等于
7.diskcache + SwapCache )
8.SwapCached:            0 kB   
9.Active:           680560 kB  在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非
10.非常必要否则不会被移作他用
11.Inactive:         145228 kB    在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可
12.能被用于其他途径
13.Active(anon):     458208 kB
14.Inactive(anon):      280 kB
15.Active(file):     222352 kB
16.Inactive(file):   144948 kB
17.Unevictable:           0 kB
18.Mlocked:               0 kB
19.SwapTotal:             0 kB
20.SwapFree:              0 kB
21.Dirty:                92 kB   等待被写回到磁盘的内存大小
22.Writeback:             0 kB   正在被写回到磁盘的内存大小
23.AnonPages:        458328 kB   未映射页的内存大小
24.Mapped:            27072 kB   设备和文件等映射的大小
25.Shmem:               176 kB
26.Slab:              53564 kB   内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗
27.SReclaimable:      32404 kB   可收回Slab的大小
28.SUnreclaim:        21160 kB   不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
29.KernelStack:        1136 kB   内核栈大小占用的内存
30.PageTables:         5856 kB   管理内存分页页面的索引表的大小
31.NFS_Unstable:          0 kB   不稳定页表的大小
32.Bounce:                0 kB
33.WritebackTmp:          0 kB
34.CommitLimit:      509820 kB
35.Committed_AS:    1483868 kB
36.VmallocTotal:   34359738367 kB  可以vmalloc虚拟内存大小
37.VmallocUsed:        7472 kB     已经被使用的虚拟内存大小
38.VmallocChunk:   34359728764 kB
39.HardwareCorrupted:     0 kB
40.AnonHugePages:    198656 kB
41.HugePages_Total:       0
42.HugePages_Free:        0
43.HugePages_Rsvd:        0
44.HugePages_Surp:        0
45.Hugepagesize:       2048 kB
46.DirectMap4k:        7168 kB
47.DirectMap2M:     1044480 kB

二、free -m   查看内存使用情况(-m:以M显示;-g:以G显示;-h:以比较直观的值
单位显示)

MemTotal = used + free + buff/cache
shared 字段,这个是多进程的共享内存空间
三、查看进程占用的内存情况:ps aux|awk '{sum+=$6} END {print sum/1024}'
四、top

top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认即可。
可以看到,我按照 “%MEM” 排序的结果。这个结果对于查看系统占用内存较多的哪些进程是比较有用的。
然后这里我们会重点关注几个地方,上面横排区,和前面几个命令一样可以查看系统内存信息,中间标注的横条部分,和内存相关的有三个字段:VIRT、RES、SHR。
VIRT:virtual memory usage,进程占用的虚拟内存大小。
RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
SHR:shared memory,共享内存大小,不常用。
五、ps


ps 同样可以查看进程占用内存情况,一般常用来查看 Top n 进程占用内存情况,如:
ps aux --sort=rss | head -n,表示按 rss 排序,取 Top n。

这里也关注三个字段:
%MEM:进程使用物理内存所占百分比。
VSZ:进程使用虚拟内存大小。
RSS:进程使用物理内存大小,我们会重点关注这个值。
查看更详细的内存占比:cat /proc/pid/status(VmRSS为内存)


五、vmstat 1

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free   空闲的物理内存的大小。
buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存
cache cache直接用来记忆我们打开的文件,给文件做缓冲,(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
六:pmap -x pid查看进程的内存映像信息,能够看进程在哪些地方用了多少内存

可以看到该进程内存被哪些库、哪些文件所占用,据此我们定位程序对内存的使用。
几个字段介绍一下:
Address:占用内存的文件的内存起始地址。
Kbytes:占用内存的字节数。
RSS:实际占用内存大小。
Dirty:脏页大小。
Mapping:占用内存的文件,[anon] 为已分配的内存,[stack] 为程序堆栈
最后的 total 为统计的总值
只显示最后一行total的值:pmap -x pid | tail -1
循环显示最后一行total的值:while true; do pmap -x pid | tail -1; sleep 1; done
pmap -d 14596根据进程查看进程相关信息占用的内存情况
mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private  表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小      
shared 表示进程和其他进程共享的内存大小


七、dmidecode -t memory内存设置情况


八、nmon


/proc/meminfo显示的结果非常详细也非常直观,不过我们平时关心的主要就那几个,而且显示如此多,很多一些重要的东西就忽略掉了,这里可以借助IBM出的工具nmon来查看内存分配情况。如下图:

从上面这个输出,也可以看到主要内存还是被active占用的。其次是cached和buffers 。其他几块并没有占用多少内存。
注意:SecureCRT下nmon会有乱码出现,通过将终端类型修改为vt100并重连就OK了。


九、slabtop

objs是指对象的个数,obj_size为对象的大小,use是使用的百分比,这个百分比是针对后面的cache_size来说的。cache_size是给kmem_cache所有对象分配的总大小。我们可以将slabtop查看到的结果与/proc/slabinfo的结果做一个对比,如下,其中/proc/slabinfo中的第三列与第四列的值为num_objs和objsize。这里通过slabtop取得的cache_size乘百分比得到的结果和/proc/slabinfo 3、4列乘积求和得到的结果基本相同


JDK本身提供了很多方便的JVM性能调优监控工具,除了jps、jstat、jinfo、jmap、jhat、jstack等小巧的工具,还有集成式的jvisualvm和jconsole
jps    #JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
jstat  #JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jmap   #JVM Memory Map命令用于生成heap dump文件。
jhat   #JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。
jstack #用于生成java虚拟机当前时刻的线程快照。
jinfo  #JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。
javap  #查看经javac之后产生的JVM字节码代码,自动解析.class文件, 避免了去理解class文件格式以及手动解析class文件内容。
jcmd   #几乎集合了jps、jstat、jinfo、jmap、jstack所有功能,一个多功能工具, 可以用来导出堆, 查看Java进程、导出线程信息、 执行GC、查看性能相关数据等。

jps
jps(JVM Process Status Tool,虚拟机进程监控工具),这个命令可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及这些进程的本地虚拟机唯一ID。这个ID被称为本地虚拟机唯一ID(local virtual Machine Identifier,简写为LVMID)。如果你在linux的一台服务器上使用jps得到的LVMID其实就是和ps 命令得到的PID是一样的。


jstat -gcutil pid 1000   #显示输出垃圾收集统计信息

S0:幸存者0空间利用率占空间当前容量的百分比。
S1:幸存者1空间利用率占空间当前容量的百分比。
E: Eden空间利用率占空间当前容量的百分比。
O:旧空间利用率占空间当前容量的百分比。
M:Metaspace利用率占空间当前容量的百分比。
CCS:压缩类空间利用率,以百分比表示。
YGC:年轻一代GC事件的数量。
YGCT:年轻一代的垃圾收集时间(S)。
FGC:完整的GC事件的数量。
FGCT:完整的垃圾收集时间(S)。
GCT:垃圾收集总时间(S)。
jstat -gcnew -h3 pid 1000  #显示pid 的1000毫秒为时间间隔,每三行输出标题的统计新生代的行为

S0C:当前幸存者空间0容量(kB)。
S1C:当前幸存者空间1容量(kB)。
S0U:幸存者空间0利用率(kB)。
S1U:幸存者空间1利用率(kB)。
TT:任期阀值
MTT:最大任期阀值
DSS:所需的幸存者大小(kB)。
EC:当前eden空间容量(kB)。
EU:Eden空间利用率(kB)。
YGC:年轻一代GC事件的数量。
YGCT:年轻一代的垃圾收集时间(S)。

 

 

 

 

 

 

 

 

posted @ 2020-10-10 10:35  那个谁呢  阅读(237)  评论(0编辑  收藏  举报