Linux 内存监控

耗尽温柔 提交于 2019-12-09 15:40:59

Linux 内存监控

 

1、按照内存使用方式排序

  top 之后使用 shift + m 那么top按照内存使用从大到小进行排列,使用 shift + P 表示按照CPU进行排序。

复制代码
PID USER      PR     NI  VIRT RES  SHR S %CPU %MEM    TIME+  COMMAND      29498 bigfish   20   0 1118m 438m  30m S    1 11.3  81:59.96 eclipse                   27772 bigfish   20   0 1706m 216m  61m S    3  5.6  79:18.04 QQ.exe                    29369 bigfish   20   0  610m 138m  44m S    1  3.6  25:19.26 maxthon                      PR :进程优先级 NI :进程当前nice调整值 VIRT : 进程使用的虚拟内存数 RES : 进程使用的物理内存 SHR : 允许与其他进程共享的内存数(比如一些动态库) TIME+ : CPU时间
复制代码

2、top查看指定进程

  top -p pid -d 1 使用-p选项指定pid,使用-d表示刷新间隔

3、pamp查看指定进程

  pmap会将进程中使用到的每个动态库等内存依次显示,最有有一个total表示使用的虚拟内存总数。

  看不到物理内存使用数。  

pmap 7385 |grep total
total  1228664K

4、使用ps查看指定进程

  ps aux|grep java|grep UID

bigfish   7385  0.0  0.0 1228668 1164 ?        Sl   Nov07  11:23 java -jar rateHis.jar12286681164 分别表示虚拟内存与物理内存占用的KB数

5、查看/proc/pid/status查看指定进程

cat /proc/7385/status
VmSize:     1228668 kB   --使用的虚拟内存
VmRSS:        1164 kB   --使用的物理内存

6、查看系统内存使用

  1)cat /proc/meminfo

  2)使用top -d 1 每秒钟刷新一次

  3)sar -r 1 每秒钟刷新一次

  4)vmstat 1 每秒钟刷新一次

  5)free 命令

关于内存监控

7、内存使用 sar -r 1

复制代码
复制代码
16时20分55秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
16时20分56秒    245924   3731788     93.82    145188   1704968   5485052     68.77   2227000   1235488
16时20分57秒    244684   3733028     93.85    145192   1706004   5485948     68.78   2227236   1236156
16时20分58秒    244312   3733400     93.86    145196   1706344   5486204     68.78   2227420   1236404
16时20分59秒    241708   3736004     93.92    145196   1706528   5488516     68.81   2229992   1236508
复制代码
复制代码
kbmemfree    空闲内存
kbmemused    已使用内存(包括了buffer与cached的内存),因此该值并非真实用户进程使用的内存数,需要减去buffer和cached
%memused     内存使用率
kbbuffers    内核使用的buffer
kbcached     内核使用的cached

  1)已使用内存数:特别要注意的是这个值包括了内核cached的值,并非真实用户进程使用掉的。

  可以通过如下方式释放这部分内存:首先执行sync让系统将缓存数据同步到磁盘之中;然后 echo 3 > /proc/sys/vm/drop_caches 修改dropcaches的值。通过修改proc目录下的文件可以实现与系统进行通信,drop_caches文件取值,1-释放页面缓存;2-释放目录项和文件节点;3-释放前两项。pagecaches表示内核最近访问过的文件页面缓存。

  参考自:http://os.51cto.com/art/201003/186885.htm  

8、系统交换活动监控  sar -W 1  

  -W表示swaping活动统计

16时56分23秒  pswpin/s pswpout/s
16时56分26秒      0.00      0.00
16时56分27秒      0.00      0.00
16时56分28秒      0.00      0.00
16时56分29秒      0.00     39.00
16时56分30秒      0.00      0.00
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量

  说明:对swap分区的使用无疑是非常耗时的,预示着物理内存是不是不够用了。

9、内存分页监控 sar -B 1

  还可以使用命令:vmstat

16时49分21秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
16时49分22秒      0.00      0.00   1143.00      0.00    328.00      0.00      0.00      0.00      0.00
16时49分23秒      0.00     16.00   1201.00      0.00    440.00      0.00      0.00      0.00      0.00
16时49分24秒      0.00      0.00   1553.00      0.00    576.00      0.00      0.00      0.00      0.00
复制代码
复制代码
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB),vmstat中为si
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB), vmstat中为so
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
复制代码
复制代码

  说明:LInux的内存管理使用主要是通过“调页Paging”和“交换Swapping”来完成内存调度。分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。当发生频繁的内存页换入换出时性能会受到严重影响,此时成为thrashing(颠簸)。

  执行:vmstat 1 

复制代码
复制代码
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs    us   sy id wa
 2  0 213712 496692 100760 1539336  0    0     15    5    3    11    19   9  71  2
 2  1 213712 490608 100764 1545548  0    0     0     84   883  7062  8    5  87  0
 1  1 213712 488996 100772 1545872  0    0     0     52   1079 8181  9    7  83  1
复制代码
复制代码
复制代码
复制代码
si  每秒从交换区读入到内存的次数
so 每秒从内存写入到交换区的次数
bi  每秒读取的块数(块大小512字节)
bo 每秒写入的块数(块大小为512字节)
in   每秒中断数,包括时钟中断
cs   每秒上下文却换数
wa 表示cpu处于IOwait的时间 
复制代码

 

附注:

1、关于cached的解释

Mem:   7742060k total,  7597916k used,   144144k free,     3000k buffers
Swap:        0k total,        0k used,        0k free,  5924580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                     
 9025 root      20   0  137g 2.9g 2.5g S  4.0 39.6 288:40.70 mongod                     
 9037 root      20   0  129g 2.2g 1.8g S 10.0 29.2 242:45.04 mongod                     

  上面数据是一台运行mongodb的服务器,总共8GB内存,其中有6GB的cached,并且swap分区使用为0.

  但是从每个mongod占用的物理内存看,已经达到了5GB,那么6GB的cached哪里来呢?

  可能的解释:mongod申请的内存,还没有使用,依然以cached的形式存在着。

 

1、按照内存使用方式排序

  top 之后使用 shift + m 那么top按照内存使用从大到小进行排列,使用 shift + P 表示按照CPU进行排序。

复制代码
PID USER      PR     NI  VIRT RES  SHR S %CPU %MEM    TIME+  COMMAND      29498 bigfish   20   0 1118m 438m  30m S    1 11.3  81:59.96 eclipse                   27772 bigfish   20   0 1706m 216m  61m S    3  5.6  79:18.04 QQ.exe                    29369 bigfish   20   0  610m 138m  44m S    1  3.6  25:19.26 maxthon                      PR :进程优先级 NI :进程当前nice调整值 VIRT : 进程使用的虚拟内存数 RES : 进程使用的物理内存 SHR : 允许与其他进程共享的内存数(比如一些动态库) TIME+ : CPU时间
复制代码

2、top查看指定进程

  top -p pid -d 1 使用-p选项指定pid,使用-d表示刷新间隔

3、pamp查看指定进程

  pmap会将进程中使用到的每个动态库等内存依次显示,最有有一个total表示使用的虚拟内存总数。

  看不到物理内存使用数。  

pmap 7385 |grep total
total  1228664K

4、使用ps查看指定进程

  ps aux|grep java|grep UID

bigfish   7385  0.0  0.0 1228668 1164 ?        Sl   Nov07  11:23 java -jar rateHis.jar12286681164 分别表示虚拟内存与物理内存占用的KB数

5、查看/proc/pid/status查看指定进程

cat /proc/7385/status
VmSize:     1228668 kB   --使用的虚拟内存
VmRSS:        1164 kB   --使用的物理内存

6、查看系统内存使用

  1)cat /proc/meminfo

  2)使用top -d 1 每秒钟刷新一次

  3)sar -r 1 每秒钟刷新一次

  4)vmstat 1 每秒钟刷新一次

  5)free 命令

关于内存监控

7、内存使用 sar -r 1

复制代码
复制代码
16时20分55秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
16时20分56秒    245924   3731788     93.82    145188   1704968   5485052     68.77   2227000   1235488
16时20分57秒    244684   3733028     93.85    145192   1706004   5485948     68.78   2227236   1236156
16时20分58秒    244312   3733400     93.86    145196   1706344   5486204     68.78   2227420   1236404
16时20分59秒    241708   3736004     93.92    145196   1706528   5488516     68.81   2229992   1236508
复制代码
复制代码
kbmemfree    空闲内存
kbmemused    已使用内存(包括了buffer与cached的内存),因此该值并非真实用户进程使用的内存数,需要减去buffer和cached
%memused     内存使用率
kbbuffers    内核使用的buffer
kbcached     内核使用的cached

  1)已使用内存数:特别要注意的是这个值包括了内核cached的值,并非真实用户进程使用掉的。

  可以通过如下方式释放这部分内存:首先执行sync让系统将缓存数据同步到磁盘之中;然后 echo 3 > /proc/sys/vm/drop_caches 修改dropcaches的值。通过修改proc目录下的文件可以实现与系统进行通信,drop_caches文件取值,1-释放页面缓存;2-释放目录项和文件节点;3-释放前两项。pagecaches表示内核最近访问过的文件页面缓存。

  参考自:http://os.51cto.com/art/201003/186885.htm  

8、系统交换活动监控  sar -W 1  

  -W表示swaping活动统计

16时56分23秒  pswpin/s pswpout/s
16时56分26秒      0.00      0.00
16时56分27秒      0.00      0.00
16时56分28秒      0.00      0.00
16时56分29秒      0.00     39.00
16时56分30秒      0.00      0.00
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量

  说明:对swap分区的使用无疑是非常耗时的,预示着物理内存是不是不够用了。

9、内存分页监控 sar -B 1

  还可以使用命令:vmstat

16时49分21秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
16时49分22秒      0.00      0.00   1143.00      0.00    328.00      0.00      0.00      0.00      0.00
16时49分23秒      0.00     16.00   1201.00      0.00    440.00      0.00      0.00      0.00      0.00
16时49分24秒      0.00      0.00   1553.00      0.00    576.00      0.00      0.00      0.00      0.00
复制代码
复制代码
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB),vmstat中为si
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB), vmstat中为so
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
复制代码
复制代码

  说明:LInux的内存管理使用主要是通过“调页Paging”和“交换Swapping”来完成内存调度。分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。当发生频繁的内存页换入换出时性能会受到严重影响,此时成为thrashing(颠簸)。

  执行:vmstat 1 

复制代码
复制代码
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs    us   sy id wa
 2  0 213712 496692 100760 1539336  0    0     15    5    3    11    19   9  71  2
 2  1 213712 490608 100764 1545548  0    0     0     84   883  7062  8    5  87  0
 1  1 213712 488996 100772 1545872  0    0     0     52   1079 8181  9    7  83  1
复制代码
复制代码
复制代码
复制代码
si  每秒从交换区读入到内存的次数
so 每秒从内存写入到交换区的次数
bi  每秒读取的块数(块大小512字节)
bo 每秒写入的块数(块大小为512字节)
in   每秒中断数,包括时钟中断
cs   每秒上下文却换数
wa 表示cpu处于IOwait的时间 
复制代码

 

附注:

1、关于cached的解释

Mem:   7742060k total,  7597916k used,   144144k free,     3000k buffers
Swap:        0k total,        0k used,        0k free,  5924580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                     
 9025 root      20   0  137g 2.9g 2.5g S  4.0 39.6 288:40.70 mongod                     
 9037 root      20   0  129g 2.2g 1.8g S 10.0 29.2 242:45.04 mongod                     

  上面数据是一台运行mongodb的服务器,总共8GB内存,其中有6GB的cached,并且swap分区使用为0.

  但是从每个mongod占用的物理内存看,已经达到了5GB,那么6GB的cached哪里来呢?

  可能的解释:mongod申请的内存,还没有使用,依然以cached的形式存在着。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!