Linux 中已提交的内存少于预期

Linux 中已提交的内存少于预期

我的一台 Linux 服务器的内存使用率很奇怪。据我所知,已提交内存(/proc/meminfo 中的 Committed_AS 或 sar -r 中的 kbcommit)大于应用程序已使用内存是正常的。但我的服务器的已提交内存明显很小。

# cat /proc/meminfo
MemTotal:       32877480 kB
MemFree:         3511812 kB
Buffers:           19364 kB
Cached:         12080112 kB
SwapCached:            0 kB
Active:         22658640 kB
Inactive:        5906936 kB
Active(anon):   16460116 kB
Inactive(anon):     6652 kB
Active(file):    6198524 kB
Inactive(file):  5900284 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               544 kB
Writeback:             4 kB
AnonPages:      16482208 kB
Mapped:            17228 kB
Shmem:               672 kB
Slab:             529344 kB
SReclaimable:     460220 kB
SUnreclaim:        69124 kB
KernelStack:       12304 kB
PageTables:        51412 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16438740 kB
Committed_AS:    4484680 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       66424 kB
VmallocChunk:   34359651996 kB
HardwareCorrupted:     0 kB
AnonHugePages:  15376384 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        4096 kB
DirectMap2M:     2093056 kB
DirectMap1G:    31457280 kB

如您所见,Committed_AS 约为 4.4GB。但其中一个进程使用了​​超过 14GB。此进程没有任何 mmaped 文件或任何共享内存。

# pidstat -r 1 1
Linux 2.6.32-696.16.1.el6.x86_64 (appintprdsearch01)    08/23/21    _x86_64_    (8 CPU)

16:56:34          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
16:56:35          414  19476.24      0.00 17260248 14356476  43.67  isc_mc
# pmap -x 414 | egrep '^Address|^total'
Address           Kbytes     RSS   Dirty Mode   Mapping
total kB        17268588 14363848 14360208
# pmap -x 414 | grep anon | awk '{s+=$3} END {print s}'
14326736

我想知道为什么这个进程使用的内存不会影响已提交的内存。我是不是丢失了什么?

# cat /etc/system-release
Red Hat Enterprise Linux Server release 6.8 (Santiago)
# uname -r
2.6.32-696.16.1.el6.x86_64

提前致谢!!

编辑:我尝试显示今天获取的完整 pmap -x 输出。但它长达 758 行,超出了帖子限制。所以这是摘要。我发现它的匿名页面越来越大了。

# pmap -x 414 | grep -vw anon
414:   /usr/local/search/sf-1v530/bin/isc_mc -license /usr/local/search/sf-1v530/license/license.xml -conf ../config/config_mc.xml -pid /usr/local/search/sf-1v530/pid/isc_mc.pid -log /usr/local/search/sf-1v530/log/isc_mc
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000    4616    1720       0 r-x--  isc_mc
0000000000a81000    1304     716      20 rw---  isc_mc
0000003c54200000     128     108       0 r-x--  ld-2.12.so
0000003c54420000       4       4       4 r----  ld-2.12.so
0000003c54421000       4       4       4 rw---  ld-2.12.so
0000003c54600000    1576     584       0 r-x--  libc-2.12.so
0000003c5478a000    2048       0       0 -----  libc-2.12.so
0000003c5498a000      16      16       8 r----  libc-2.12.so
0000003c5498e000       8       8       8 rw---  libc-2.12.so
0000003c54a00000      92      72       0 r-x--  libpthread-2.12.so
0000003c54a17000    2048       0       0 -----  libpthread-2.12.so
0000003c54c17000       4       4       4 r----  libpthread-2.12.so
0000003c54c18000       4       4       4 rw---  libpthread-2.12.so
0000003c55600000     524      80       0 r-x--  libm-2.12.so
0000003c55683000    2044       0       0 -----  libm-2.12.so
0000003c55882000       4       4       4 r----  libm-2.12.so
0000003c55883000       4       4       4 rw---  libm-2.12.so
0000003c55a00000      84      16       0 r-x--  libz.so.1.2.3
0000003c55a15000    2044       0       0 -----  libz.so.1.2.3
0000003c55c14000       4       4       4 r----  libz.so.1.2.3
0000003c55c15000       4       4       4 rw---  libz.so.1.2.3
0000003c56600000      88      16       0 r-x--  libgcc_s-4.4.7-20120601.so.1
0000003c56616000    2044       0       0 -----  libgcc_s-4.4.7-20120601.so.1
0000003c56815000       4       4       4 rw---  libgcc_s-4.4.7-20120601.so.1
0000003c57200000     928     488       0 r-x--  libstdc++.so.6.0.13
0000003c572e8000    2048       0       0 -----  libstdc++.so.6.0.13
0000003c574e8000      28      28      28 r----  libstdc++.so.6.0.13
0000003c574ef000       8       8       8 rw---  libstdc++.so.6.0.13
00007ffdcbf56000      84      48      48 rw---    [ stack ]
----------------  ------  ------  ------
total kB        18462068 15806748 15802956

这是匿名地图的排序大小及其计数。

# pmap -x 414 | grep -w anon | awk '{s[$2]++} END {for (x in s) {print x,s[x]}}' | sort
-rnk 1
254728 1
225520 1
197220 1
196608 1
131480 2
131072 2
124008 1
65740 3
65536 142
65532 5
65528 3
65524 2
65520 1
65512 2
65508 2
65504 3
65500 3
65488 2
65484 5
65480 2
65476 1
65464 2
65456 1
65452 1
65448 2
65440 4
65436 3
65432 3
65428 2
65424 1
65420 28
65412 1
65404 1
65400 1
65372 1
65192 1
65188 1
64804 1
64636 1
63940 1
63912 1
63792 1
63584 1
63408 1
63400 2
63244 1
63008 2
63004 1
61996 1
61848 1
61792 1
61624 1
60976 1
59940 1
58276 1
57736 1
55992 1
52348 1
51212 1
50084 1
40840 1
24696 1
15452 1
14324 1
13188 1
10396 1
10240 1
9544 1
7800 1
7260 1
7064 1
5596 1
4560 1
3912 1
3744 1
3688 1
3540 1
3216 1
2532 1
2528 2
2292 1
2136 2
2128 1
1952 1
1744 1
1624 1
1596 1
1024 169
900 1
732 1
348 1
344 1
164 1
136 1
132 1
124 1
116 28
112 1
108 2
104 3
100 3
96 4
88 2
84 2
80 1
72 2
60 1
56 2
52 5
48 2
36 3
32 3
28 2
24 2
16 3
12 2
8 4
4 179

编辑:我已向 Redhat 请求客户支持。由于 RHEL6 已 EOSed,恐怕我无法收到任何答复。无论如何,我会在这里发布结果。

答案1

此主机的内存有一半在匿名私人页面中。其中大部分是您识别的进程。Committed_AS相对较低(14%)MemTotal意味着实际数据尚未使用太多。

操作系统很懒。Linux 不会动用该程序要求的所有 14 GB。相反,由于此 x86 CPU 支持 2 MB 和 1 GB 页面,Linux 会将其中几个页面分配给此进程并假装它们完全为零。请注意DirectMap显示许多 1 GB 的硬件页面。管理员可以明确配置 HugePages,但该 meminfo 显示配置的页面为零。

只是这种分配占用很少的物理内存,所以Committed_AS起始值很低。如果应用程序用实际数据填充这些内存,它就会增加。

关于容量规划,目前这台主机内存充足。匿名和共享内存被限制为一半,36% 缓存用于快速文件访问,还有几 GB 空闲且未使用以满足即时内存分配需求。当然,Committed_AS远远低于MemTotal

即使应用程序的内存分配适合主机的大小,也要找出为什么会这样分配。如果这是一个为未来增长而定大小的内存数据库,那么这可能是有意义的。或者也许 32 GB 是您的中型 VM/小型物理服务器,那么从操作上来说,过大的大小可能更容易。

相关内容