似乎没有什么可以解释 Linux 下缺少的 5GB 内存

Tor*_*rge 8 memory linux kubuntu zfs

我有 Kubuntu 16.04 并且正在将 ZFS 用于大数据分区 (RAIDZ1)

我缺少 5GB 的内存并且无法找到它去了哪里。不,它不是缓存

根据我能想到的所有工具,我目前有以下统计数据:

Actively used:  9458.3 MB
Inacively used: 2544.5 MB
Mapped for IO:  2433.0 MB
Buffers:         242.6 MB
Slab:           6669.2 MB
Page Tables:      91.0 MB
Cached:         3758.1 MB
Dirty:             0.1 MB
Writeback:         0.0 MB
Free:           1856.5 MB
------------------------------
Total:         27053.3 MB
Total Memory:  32133.5 MB
------------------------------
Missing ???:    5080.2 MB
Run Code Online (Sandbox Code Playgroud)

所以 5 GB!不考虑 RAM。他们去了哪里?

工具输出

纳米:

           RAM     High      Low     Swap    Page Size=4 KB                                                        ?
? Total MB     32133.5     -0.0     -0.0   8195.5                                                                        ?
? Free  MB      1856.5     -0.0     -0.0   8195.5                                                                        ?
? Free Percent     5.8%   100.0%   100.0%   100.0%                                                                       ?
?             MB                  MB                  MB                                                                 ?
?                      Cached=  3758.1     Active=  9458.3                                                               ?
? Buffers=   242.6 Swapcached=     0.0  Inactive =  2544.5                                                               ?
? Dirty  =     0.1 Writeback =     0.0  Mapped   =  2433.0                                                               ?
? Slab   =  6669.2 Commit_AS = 16647.1 PageTables=    91.3                                                               ?
? Large (Huge) Page Stats ????????????????????????????????????????????????????????????????????????????????????????????????
?  There are no Huge Pages                                                                                               ?
?  - see /proc/meminfo                                                                                                   ?
?                                                                                                                        ?
? Virtual-Memory ?????????????????????????????????????????????????????????????????????????????????????????????????????????
?nr_dirty    =       37 pgpgin      =       0                High Normal    DMA                                          ?
?nr_writeback=        0 pgpgout     =       0  alloc            0    343      0                                          ?
?nr_unstable =        0 pgpswpin    =       0  refill           0      0      0                                          ?
?nr_table_pgs=    23384 pgpswpout   =       0  steal            0      0      0                                          ?
?nr_mapped   =   622856 pgfree      =     305  scan_kswapd      0      0      0                                          ?
?nr_slab     =       -1 pgactivate  =       0  scan_direct      0      0      0                                          ?
?                       pgdeactivate=       0                                                                            ?
?allocstall  =        0 pgfault     =      74  kswapd_steal     =      0                                                 ?
?pageoutrun  =        0 pgmajfault  =       0  kswapd_inodesteal=      0                                                 ?
?slabs_scanned=       0 pgrotated   =       0  pginodesteal     =      0
Run Code Online (Sandbox Code Playgroud)

猫 /proc/memstat

MemTotal:       32904740 kB
MemFree:         1759548 kB
MemAvailable:    5372548 kB
Buffers:          249072 kB
Cached:          3852616 kB
SwapCached:            0 kB
Active:          9819328 kB
Inactive:        2609860 kB
Active(anon):    8334856 kB
Inactive(anon):   412176 kB
Active(file):    1484472 kB
Inactive(file):  2197684 kB
Unevictable:        7932 kB
Mlocked:            7932 kB
SwapTotal:       8392188 kB
SwapFree:        8392188 kB
Dirty:               224 kB
Writeback:             0 kB
AnonPages:       8335424 kB
Mapped:          2497092 kB
Shmem:            416004 kB
Slab:            6829716 kB
SReclaimable:     333652 kB
SUnreclaim:      6496064 kB
KernelStack:       26496 kB
PageTables:        95636 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    24844556 kB
Committed_AS:   17097748 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB                                                                                               
VmallocChunk:          0 kB                                                                                               
HardwareCorrupted:     0 kB                                                                                               
AnonHugePages:   4306944 kB                                                                                               
CmaTotal:              0 kB                                                                                               
CmaFree:               0 kB                                                                                               
HugePages_Total:       0                                                                                                  
HugePages_Free:        0                                                                                                  
HugePages_Rsvd:        0                                                                                                  
HugePages_Surp:        0                                                                                                  
Hugepagesize:       2048 kB                                                                                               
DirectMap4k:     9029708 kB                                                                                               
DirectMap2M:    22384640 kB                                                                                               
DirectMap1G:     2097152 kB 
Run Code Online (Sandbox Code Playgroud)

免费 -h

              total        used        free      shared  buff/cache   available                                           
Mem:            31G         19G        1.8G        406M         10G        5.2G                                           
Swap:          8.0G          0B        8.0G 
Run Code Online (Sandbox Code Playgroud)

在顶上

MEM | tot    31.4G  | free    1.8G |               | cache   3.7G |  dirty   0.1M | buff  243.5M  |              |  slab    6.5G |               |              |               |              |               |
SWP | tot     8.0G  | free    8.0G |               |              |               |               |              |               |               |              |               | vmcom  16.3G |  vmlim  23.7G |
Run Code Online (Sandbox Code Playgroud)

附加信息/故事

我只有 16GB 内存,看到系统开始轻微交换。虽然不是经常。似乎内存使用量一直在增长,直到它开始使用几兆字节的交换然后停止增长。这是我第一次了解“slab”并发现由于 ZFS,我的很多内存都去了那里。

很好,没问题,所以我又安装了 16GB 内存,这应该可以,对吧?但相反,我再次看到了同样的行为。内存增长,直到它开始稍微使用交换。然而这次我无法找到 5GB 的去向。在 Windows 下,我习惯于能够使用正确的工具(https://www.youtube.com/watch?v=AjTl53I_qzY)找到每页内存的用途,但在这里我有点迷茫。5Gb 刚刚消失。这是内核内存泄漏吗?

现在我将swappiness设置为 15,这似乎阻止了“暂时”使用交换,但 5 GB 仍然没有了。

更新 1: 现在运行 2 周后,这种效果几乎消失了。

? Memory Stats ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????                                                                                                                       ?
?                RAM     High      Low     Swap    Page Size=4 KB                                                                                                                                                                                                             ?
? Total MB     32133.5     -0.0     -0.0   8195.5                                                                                                                                                                                                                             ?
? Free  MB      1871.9     -0.0     -0.0   8186.4                                                                                                                                                                                                                             ?
? Free Percent     5.8%   100.0%   100.0%    99.9%                                                                                                                                                                                                                            ?
?             MB                  MB                  MB                                                                                                                                                                                                                      ?
?                      Cached=  6275.9     Active= 10217.1                                                                                                                                                                                                                    ?
? Buffers=   363.4 Swapcached=     1.3  Inactive =  3134.5                                                                                                                                                                                                                    ?
? Dirty  =     0.2 Writeback =     0.0  Mapped   =  3911.0                                                                                                                                                                                                                    ?
? Slab   =  6159.5 Commit_AS = 13696.9 PageTables=    95.0

Actively used: 10217.1 MB
Inacively used: 3134.5 MB
Mapped for IO:  3911.0 MB
Buffers:         363.4 MB
Slab:           6159.5 MB
Page Tables:      95.0 MB
Cached:         6275.9 MB
Dirty:             0.2 MB
Writeback:         0.0 MB
Free:           1871.9 MB
------------------------------
Total:         32028,3 MB
Total Memory:  32133.5 MB
------------------------------
Missing ???:     105.2 MB
Run Code Online (Sandbox Code Playgroud)

真正未使用(空闲)的内存保持相当稳定。但是缓存和映射上升了。这似乎真的有一些隐藏的缓存正在慢慢耗尽,但没有显示在统计数据中。

Silvio Massina 提到它可能是 ARC。这是输出

cat /proc/spl/kstat/zfs/arcstats

6 1 0x01 91 4368 56409879056 315868863969705
name                            type data
hits                            4    15276585
misses                          4    1100779
demand_data_hits                4    10451405
demand_data_misses              4    57248
demand_metadata_hits            4    3886139
demand_metadata_misses          4    876962
prefetch_data_hits              4    133147
prefetch_data_misses            4    71927
prefetch_metadata_hits          4    805894
prefetch_metadata_misses        4    94642
mru_hits                        4    2334376
mru_ghost_hits                  4    9870
mfu_hits                        4    12003233
mfu_ghost_hits                  4    34745
deleted                         4    89041
mutex_miss                      4    10
evict_skip                      4    239
evict_not_enough                4    2
evict_l2_cached                 4    0
evict_l2_eligible               4    14139960320
evict_l2_ineligible             4    3255242752
evict_l2_skip                   4    0
hash_elements                   4    554684
hash_elements_max               4    568778
hash_collisions                 4    424785
hash_chains                     4    33824
hash_chain_max                  4    5
p                               4    3482926902
c                               4    11779217520
c_min                           4    33554432
c_max                           4    16847226880
size                            4    11717468560
hdr_size                        4    226991968
data_size                       4    8517812736
metadata_size                   4    1503463424
other_size                      4    1469200432
anon_size                       4    11872256
anon_evictable_data             4    0
anon_evictable_metadata         4    0
mru_size                        4    2606045184
mru_evictable_data              4    1947246592
mru_evictable_metadata          4    39131136
mru_ghost_size                  4    7123638784
mru_ghost_evictable_data        4    6026175488
mru_ghost_evictable_metadata    4    1097463296
mfu_size                        4    7403358720
mfu_evictable_data              4    6570566144
mfu_evictable_metadata          4    378443776
mfu_ghost_size                  4    598224896
mfu_ghost_evictable_data        4    589954048
mfu_ghost_evictable_metadata    4    8270848
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_lock_retry            4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_evict_l1cached               4    0
l2_free_on_write                4    0
l2_cdata_free_on_write          4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    445
memory_indirect_count           4    3009
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    3199655824
arc_meta_limit                  4    12635420160
arc_meta_max                    4    4183324304
arc_meta_min                    4    16777216
arc_need_free                   4    0
arc_sys_free                    4    526475264
Run Code Online (Sandbox Code Playgroud)

我不能做太多。如果我理解正确的话size应该是ARC的大小。但它会是 11GB。这不适合我的记忆统计数据中的任何地方。

更新 2:

我刚刚结束了 Baloo(Kubuntu 下的搜索索引器),现在事情又变得极端了。

 Memory Stats ???????????????????????????????????????????????????????????????????????????????????????????????????????????
?                RAM     High      Low     Swap    Page Size=4 KB                                                        ?
? Total MB     32133.5     -0.0     -0.0   8195.5                                                                        ?
? Free  MB      1004.4     -0.0     -0.0   8132.1                                                                        ?
? Free Percent     3.1%   100.0%   100.0%    99.2%                                                                       ?
?             MB                  MB                  MB                                                                 ?
?                      Cached=  3458.4     Active=  7348.9                                                               ?
? Buffers=   177.5 Swapcached=     3.7  Inactive =  2662.9                                                               ?
? Dirty  =     2.9 Writeback =     0.0  Mapped   =   937.9                                                               ?
? Slab   =  5526.4 Commit_AS = 13320.6 PageTables=    89.2                                                               ?
????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

现在我缺少 6.5GB !!公羊。

在我结束之前,Baloo 进程使用了​​ 3.5Gb。

KDE 在这里使用了一些讨厌的技巧吗?

更新 3

它变得更糟。我在另一台 Linux PC 上进行了测试,很明显它Inactive used混入了缓存。所以我失去了更多的记忆。


解决方案和事后思考

正如 Silvio Massina 所接受的答案所指出的那样,它确实是 ZFS 的 ARC。

它现在声称已经分配了 14GB 的内存。

cat /proc/spl/kstat/zfs/arcstats | grep -E "^size"

size                            4    14953847480
Run Code Online (Sandbox Code Playgroud)

所以我曾经stress给我 10 GB 的内存:

stress --vm-bytes 10000000000 --vm-keep -m 1
Run Code Online (Sandbox Code Playgroud)

瞧,ARC 缓存值确实相应下降了

cat /proc/spl/kstat/zfs/arcstats | grep -E "^size"

size                            4    4147553616
Run Code Online (Sandbox Code Playgroud)

现在,在杀死stress我之后,我有 11GB 的可用内存,随着时间的推移,它再次被 ARC 慢慢吃掉。(这完全没问题)

所以 ARC 就像缓存,但显示在used内存下,也不与进程一起列出,只在它自己的信息文件中。这对我来说很奇怪,因为我认为操作系统应该始终是内存的主人,并且应该让人们知道谁在使用它。如果你们中的一个人感兴趣,我确实在AskUbuntu上提出了一个更精确的后续问题。

PS:如果这对你也有帮助,请不要忘记给我点赞。赏金不便宜G

Sil*_*ina 5

ZFS 使用 ARC(自适应替换缓存)。

来自 Gentoo 维基:

Linux 计算 ARC 使用的内存的方式与页面缓存使用的内存不同。具体来说,ARC 使用的内存包含在自由程序使用的输出中的“已使用”下,而不是“缓存”下。这绝不会阻止当系统内存不足时释放内存。但是,如果有机会,它会给人一种印象,即 ARC(以及扩展的 ZFS)将使用所有系统内存。

用于 ARC 的内存量取决于系统上可用的内存,并且可以通过设置 zfs_arc_min 和 zfs_arc_max 参数来控制。

您可以在运行时设置 zfs_arc_max 的值:

echo 2147483648 >> /sys/module/zfs/parameters/zfs_arc_max
Run Code Online (Sandbox Code Playgroud)

或者在启动时使用:

echo "options zfs zfs_arc_max=2147483648" >> /etc/modprobe.d/zfs.conf
Run Code Online (Sandbox Code Playgroud)

值以字节表示。

  • @Torge 实际上,混乱更像是 ZoL(Linux 上的 ZFS)使用的 Solaris 移植层或 SPL。Solaris 和 Linux 处理内存分配的方式不同,而 ZFS 是 Solaris 原生的,因此在 Linux 上可能会有些混乱。您可能对我发布的 [如何确定 ZFS 中 ARC 的当前大小,以及 ARC 与空闲或缓存内存有何关系?](https://superuser.com/q/1137416/53590) 感兴趣特别是要更详细地讨论其中的一些内容,而不是在评论空间中。 (2认同)