介绍
在这个实验中,你将学习如何检查 Linux 中特定的内核 slab 设置是否处于激活状态。你将探索不同的方法来检查内核的内存管理,特别关注 slab 分配器。
本实验将指导你通过 /proc/slabinfo 检查 slab 统计信息,使用 sysctl vm 验证相关设置,并在 dmesg 中检查相关日志。这些步骤将为你提供理解和解决内核 slab 行为问题所需的技能。
使用 cat /proc/slabinfo 检查 slab 统计信息
在这一步中,你将学习如何使用 /proc/slabinfo 文件检查内核的 slab 分配器统计信息。slab 分配器是 Linux 内核用于高效管理小对象的一种内存管理机制。了解 slab 的使用情况有助于诊断与内存相关的问题。
/proc 文件系统是一个虚拟文件系统,它提供有关进程和其他系统信息。/proc/slabinfo 专门包含内核 slab 缓存的详细信息。
要查看 /proc/slabinfo 的内容,你将使用 cat 命令。cat 是一个标准的 Unix 实用工具,它按顺序读取文件并将其写入标准输出。
如果终端尚未打开,请打开它。你可以通过点击桌面左侧的 Xfce Terminal 图标来完成此操作。
现在,输入以下命令并按回车键:
cat /proc/slabinfo
你将看到类似以下的输出(确切内容会根据系统的活动情况而有所不同):
slabinfo - version: 2.1
## name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_expect 0 0 128 63 1 : tunables 0 0 0 : slabdata 0 0 0
nf_conntrack 10 10 320 25 2 : tunables 0 0 0 : slabdata 1 1 0
request_sock_TCP 0 0 192 42 1 : tunables 0 0 0 : slabdata 0 0 0
... (many more lines)
让我们来详细分析一下输出内容:
- name:slab 缓存的名称(例如,
nf_conntrack、request_sock_TCP)。 - ****:此缓存中当前正在使用的对象数量。
- ****:此缓存中已分配的对象总数。
- ****:每个对象的大小(以字节为单位)。
- ****:单个 slab 中可容纳的对象数量。
- ****:单个 slab 使用的内存页面数量。
- tunables:可针对此缓存进行调整的参数。
- slabdata:有关 slab 本身的信息。
此输出提供了内核如何为各种内部数据结构使用内存的快照。虽然原始输出可能很多,但它是高级 Linux 故障排除的基本信息来源。
你已成功查看了 slab 分配器统计信息。点击 Continue 进入下一步。
使用 sysctl vm 验证 slab 设置
在这一步中,你将使用 sysctl 命令探索与虚拟内存和 slab 分配器相关的内核参数。sysctl 是一个实用工具,允许你在运行时查看和修改内核参数。
内核参数是影响 Linux 内核行为的配置选项。其中许多参数位于 /proc/sys 文件系统中。sysctl 提供了一种便捷的方式来访问和管理这些参数,而无需直接与 /proc/sys 中的文件进行交互。
我们关注的是与虚拟内存相关的参数,这些参数通常包含影响内存管理的设置,包括 slab 分配器的相关方面。这些参数通常归属于 vm 子树。
要查看所有与虚拟内存相关的内核参数,请使用带有 vm 参数的 sysctl 命令:
sysctl vm
在终端中输入该命令并按回车键。你将看到一个参数列表及其当前值,类似于以下内容:
vm.admin_reserve_kbytes = 8192
vm.block_dump = 0
vm.compact_memory = 0
vm.compact_unevictable_percentage = 1
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirtytime_expire_seconds = 43200
vm.drop_caches = 0
vm.extfrag_threshold = 500
vm.highmem_is_dirtyable = 0
vm.laptop_mode = 0
vm.lowmem_reserve_ratio = 256 256 32 0 0
vm.max_map_count = 65530
vm.min_free_kbytes = 67584
vm.min_slab_ratio = 5
vm.min_unmapped_ratio = 1
vm.mmap_min_addr = 65536
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.nr_overcommit_hugepages = 0
vm.numa_balancing = 1
vm.numa_balancing_scan_delay_ms = 1000
vm.numa_balancing_scan_period_min_ms = 20
vm.numa_balancing_scan_period_max_ms = 10000
vm.numa_balancing_scan_size_mb = 32
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.panic_on_oom = 0
vm.percpu_pagelist_fraction = 0
vm.stat_interval = 1
vm.swappiness = 60
vm.user_reserve_kbytes = 131072
vm.vfs_cache_pressure = 100
查找可能与缓存或内存压力相关的参数,例如 vm.vfs_cache_pressure 或 vm.min_slab_ratio。这些参数会影响内核如何管理不同类型的缓存,包括 slab 缓存。
你也可以通过提供参数的全名来查看特定参数。例如,要查看 vm.vfs_cache_pressure 的值:
sysctl vm.vfs_cache_pressure
该命令将输出:
vm.vfs_cache_pressure = 100
vm.vfs_cache_pressure 参数控制内核回收用于缓存目录和索引节点对象的内存的倾向。值越高,意味着内核在回收此内存时越积极。
理解这些参数有助于你调整系统的内存行为。
点击 Continue 进入下一步。
在 dmesg 中检查 slab 日志
在这最后一步中,你将学习如何使用 dmesg 命令检查内核消息缓冲区中与 slab 分配器相关的消息。内核消息缓冲区会存储内核在启动和运行期间生成的消息。这些消息可能包含有关硬件、设备驱动程序以及像 slab 分配器这样的内核子系统的信息。
dmesg 命令用于打印或控制内核环形缓冲区。这个缓冲区包含来自内核的消息,这些消息通常对调试和故障排除很有用。
要查看整个内核消息缓冲区,你只需运行 dmesg:
dmesg
然而,输出可能会很长。为了找到专门与 slab 分配器相关的消息,你可以将 dmesg 的输出通过管道传递给 grep 命令,并搜索像 "slab" 或 "SLUB"(SLUB 是一种现代的 slab 分配器实现)这样的关键字。
在终端中输入以下命令并按回车键:
dmesg | grep -i "slab\|slub"
让我们来分解一下这个命令:
dmesg:打印内核消息缓冲区。|:这是一个管道符号,它将左边命令的输出作为输入传递给右边的命令。grep:一个命令行实用工具,用于在纯文本数据集中搜索与正则表达式匹配的行。-i:此选项使搜索不区分大小写,因此它将匹配 "slab"、"SLAB"、"slub"、"SLUB" 等。"slab\|slub":这是搜索模式。slab用于搜索 "slab" 这个词,\|作为逻辑或运算符,slub用于搜索 "slub" 这个词。
输出将显示内核消息缓冲区中包含 "slab" 或 "slub"(不区分大小写)的任何行。你可能会看到与启动期间 slab 分配器初始化相关的消息,或者如果存在问题,可能会看到潜在的警告或错误信息。
[ 0.000000] kmem_cache_init
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] SLUB: TotalObjects=0, ObjectsPerSpan=0, SpansPerChunk=0
[ 0.000000] SLUB: min_objects.limit=0, min_objects.batchcount=0
[ 0.000000] SLUB: tunables.limit=0, tunables.batchcount=0, tunables.sharedfactor=0
[ 0.000000] SLUB: Not setting slab_nomerge.
[ 0.000000] SLUB: Not setting slab_debug.
[ 0.000000] SLUB: Not setting slab_max_order.
[ 0.000000] SLUB: Not setting slab_alias_debug.
[ 0.000000] SLUB: Not setting slab_pad.
[ 0.000000] SLUB: Not setting slab_red_zone.
[ 0.000000] SLUB: Not setting slab_poison.
[ 0.000000] SLUB: Not setting slab_freelist_debug.
[ 0.000000] SLUB: Not setting slab_freelist_random.
[ 0.000000] SLUB: Not setting slab_freelist_hardened.
[ 0.000000] SLUB: Not setting slab_trace.
[ 0.000000] SLUB: Not setting slab_reclaim_account.
[ 0.000000] SLUB: Not setting slab_way.
[ 0.000000] SLUB: Not setting slab_sizes.
[ 0.000000] SLUB: Not setting slab_caches.
[ 0.000000] SLUB: Not setting slab_test.
[ 0.000000] SLUB: Not setting slab_order.
[ 0.000000] SLUB: Not setting slab_debug_objects.
[ 0.000000] SLUB: Not setting slab_debug_memcg.
[ 0.000000] SLUB: Not setting slab_debug_check_objects.
[ 0.000000] SLUB: Not setting slab_debug_check_freelist.
[ 0.000000] SLUB: Not setting slab_debug_check_alloc.
[ 0.000000] SLUB: Not setting slab_debug_check_free.
[ 0.000000] SLUB: Not setting slab_debug_check_redzone.
[ 0.000000] SLUB: Not setting slab_debug_check_poison.
[ 0.000000] SLUB: Not setting slab_debug_check_trace.
[ 0.000000] SLUB: Not setting slab_debug_check_reclaim_account.
[ 0.000000] SLUB: Not setting slab_debug_check_way.
[ 0.000000] SLUB: Not setting slab_debug_check_sizes.
[ 0.000000] SLUB: Not setting slab_debug_check_caches.
[ 0.000000] SLUB: Not setting slab_debug_check_test.
[ 0.000000] SLUB: Not setting slab_debug_check_order.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_objects.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_memcg.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_objects.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_freelist.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_alloc.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_free.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_redzone.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_poison.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_trace.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_reclaim_account.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_way.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_sizes.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_caches.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_test.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_order.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_debug_objects.
[ 0.000000] SLUB: Not setting slab_debug_check_debug_check_debug_memcg.
这个命令是过滤内核消息并查找特定内核子系统故障排除相关信息的强大方法。
你现在已经学习了如何检查 slab 统计信息、验证相关的内核参数以及检查内核日志中与 slab 相关的消息。这些是理解和诊断 Linux 内存使用情况的基本技能。
点击 Continue 完成此实验。
总结
在本次实验中,你学习了如何检查 Linux 中的内核 slab 设置。你首先使用 /proc/slabinfo 文件检查了内核的 slab 分配器统计信息,该文件提供了有关各种 slab 缓存的活动对象、总对象、对象大小及其他相关信息的详细内容。这一步展示了如何使用 cat 命令查看这些关键的内存管理数据。
接下来,你使用 sysctl vm 命令验证了 slab 设置,该命令允许你检查和修改与虚拟内存相关的内核参数,包括特定于 slab 的可调参数。最后,你学习了如何在 dmesg(内核消息缓冲区)中检查与 slab 相关的日志,以识别任何与 slab 分配器相关的错误或警告。这些步骤共同为理解和排查内核 slab 行为提供了全面的方法。



