虚拟机实际使用内存和FC界面显示内存占用率不同

发布时间:  2015-03-25 浏览次数:  377 下载次数:  0
问题描述
在虚拟机里面内存使用used 除以total,算出的值和FC界面显示的值相差很大。

FC平台计算虚拟机内部内存占用率的公式:(used -cached)/total;

客户没有根据公式计算,看到的只是计算之后的值。
告警信息
无。
处理过程

# top

top - 17:08:55 up 32 days, 21:14,  1 user,  load average: 0.10, 0.10, 0.09

Tasks: 148 total,   1 running, 147 sleeping,   0 stopped,   0 zombie

Cpu(s):  8.1%us,  7.9%sy,  0.0%ni, 83.8%id,  0.0%wa,  0.2%hi,  0.1%si,  0.0%st

Mem:     15930M total,    10030M used,     5899M free,      458M buffers

Swap:     8189M total,        0M used,     8189M free,     5862M cached

 

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                         

  2263 root      20   0 1608m 587m  12m S    8  3.7 215:05.96 java                             

 77559 root      20   0  849m 351m 4904 S    6  2.2 940:40.44 slbserver                        

  4284 hacluste  RT   0 75224 7564 4068 S    4  0.0 234:03.14 cib                              

  4277 root      RT   0  198m  10m 8148 S    0  0.1  34:25.23 corosync                         

  5203 csb       20   0 1841m 869m   9m S    0  5.5 141:07.89 java                             

  5505 root      20   0  8768 1204  856 R    0  0.0   0:00.11 top                              

 54427 csb       20   0  179m  31m  19m S    0  0.2   0:03.40 httpd                            

     1 root      20   0 10376  824  696 S    0  0.0   0:18.72 init                             

     2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd                         

     3 root      RT   0     0    0    0 S    0  0.0   1:40.76 migration/0                      

     4 root      20   0     0    0    0 S    0  0.0   1:11.98 ksoftirqd/0                      

     5 root      RT   0     0    0    0 S    0  0.0   1:40.82 migration/1                      

     6 root      20   0     0    0    0 S    0  0.0   1:44.28 ksoftirqd/1                      

     7 root      RT   0     0    0    0 S    0  0.0   1:41.21 migration/2     

代入上面的公式:(10030-5862)/15930=26%      


根因

   Linux系统中,当新程序申请内存时,会默认从free区中申请,当内存使用完毕,不会直接释放到free中,会优先放到cached或者buffers中(可以理解为一级、二级缓存),当这个程序再次想申请内存时,就会优先从cached中申请。

       因此平台在计算内存占用率时,需要减掉cached的数值(cached本身就是可以用的)。极端情况下,有可能free区的内存剩余为0,但是bufferscached都很大,这种情况也是可以正常运行的。

工程师直接使用used/total算出的值,和FC平台计算虚拟机内部内存占用率的公式不一样,因此相差很大。

解决方案
使用公式(used -cached)/total 计算,得到界面显示的内存占用率。
建议与总结

END