记录学习笔记、分享资源工具、交流技术思想、提升工作效率

linux内存无故丢失的问题

运维 xiaomudk 5年前 (2016-01-13) 91次浏览 0个评论
文章目录[隐藏]

今天一台业务机器出现内存占用过高,趁这个机会了解了一下linux内存的东西,作下简单的记录:

1.服务器信息收集

(1).使用free查看内存情况

# free -m
             total       used       free     shared    buffers     cached
Mem:         15953      13809       2143          0        330       1351
-/+ buffers/cache:      12127       3825
Swap:        31999          0      31999

可以看出来内存实际使用率为12127M (-/+ buffers/cache这一行的used为真实内存使用率)

(2).使用top查看内存使用高的进程

输入’M’,按内存使用率排序

top - 17:03:09 up 20 days,  7:05,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 262 total,   1 running, 261 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.8%us,  1.0%sy,  0.0%ni, 98.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16336056k total, 14141300k used,  2194756k free,   338428k buffers
Swap: 32767992k total,        0k used, 32767992k free,  1383468k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3937 game      20   0 7644m 1.3g  15m S 24.5  8.3   4434:58 java -Xmn256m -Xms1024m -Xmx3072m 
 2248 root      20   0  197m  11m 2652 S  0.0  0.1  92:32.06 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid 
 1798 root      20   0  245m  10m 1104 S  0.0  0.1   0:09.86 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
 2009 root      20   0 88272 5948 4104 S  0.0  0.0   0:01.80 NetworkManager --pid-file=/var/run/NetworkManager/NetworkManager.pid
 1470 root      20   0  170m 4340 3492 S  0.0  0.0  17:51.94 /usr/sbin/vmtoolsd
 7974 root      20   0 96388 4012 2944 S  0.0  0.0   0:01.59 sshd: root@pts/0

可以看出来使用率最高的java进程,RES使用率为1.3G(RES为物理内存使用量),和free -m查出来的偏差有点大。

(3).查看/proc/meminfo

# cat /proc/meminfo
MemTotal:       16336056 kB
MemFree:         2193028 kB
Buffers:          338428 kB
Cached:          1383516 kB
SwapCached:            0 kB
Active:          2607944 kB
Inactive:         522088 kB
Active(anon):    1408256 kB
Inactive(anon):      520 kB
Active(file):    1199688 kB
Inactive(file):   521568 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      32767992 kB
SwapFree:       32767992 kB
Dirty:                56 kB
Writeback:             0 kB
AnonPages:       1407864 kB
Mapped:            42616 kB
Shmem:               696 kB
Slab:             152024 kB
SReclaimable:     109768 kB
SUnreclaim:        42256 kB
KernelStack:        3424 kB
PageTables:        10508 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    40936020 kB
Committed_AS:    2081104 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      310932 kB
VmallocChunk:   34359412840 kB
HardwareCorrupted:     0 kB
AnonHugePages:   1341440 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:    16766976 kB

计算公式:

MemTotal = MemFree + (Buffers + Cached + SwapCached) + AnonPages + (Slab + PageTables + KernelStack)
MemTotal = MemFree + (Active + Inactive) + (Slab + PageTables + KernelStack)

从这里还是没有查到那10G多内存是怎么没的,但是free怎么就认为这么多内存使用了呢?

参考资料:
Know your Linux memory usage

2.带着疑问查资料

(1) free命令的内存使用量到底是怎么算的

free肯定是根据/proc/meminfo这个文件计算得到的内存使用情况,但是meminfo这个文件里并没有used这一行信息,
freeused是怎么来的呢?

通过google找到了这篇文档:
Interpreting /proc/meminfo and free output for Red Hat Enterprise Linux 5 and 6

free中的used是计算meminfo中的MemTotal – MemFree得到的

比如内存总量为16G,但是空闲内存现在有2G,那free就认为linux已经使用了14G内存。而不是系统各方面使用的内存相加的!

(2) meminfo中的MemFree是怎么来的

我在这里找到了答案How is the Linux calculating MemFree:

MemFree in /proc/meminfo is a count of how many pages are free in the buddy allocator.

至于buddy allocator是内存管理算法,中文名叫伙伴分配器。

3.最后的解决方案

我又去查看了系统日志,也没有发现问题。
但是确实找不到那部分内存哪里去了,因为这台机器是云主机,我们怀疑是和宿主机有问题,把这台机器飘移到其它宿主机上去, 又正常了!


发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址