swappiness
是 Linux 内核中的一个参数,用于控制内核在回收内存页面时,将匿名页面(即进程直接分配的内存页面,不属于任何文件)写入交换分区(swap space)的积极程度。该参数的取值范围通常是 0 到 100。
swappiness
的默认值是 60,这意味着内核在回收内存时,会相对积极地考虑将匿名页面写入交换分区。
内存水位是内核用来控制内存分配和回收的一组阈值。这些阈值定义了内核在不同内存压力下应该采取的行动。Linux内核中有三个主要的水位:
min_free_kbytes是一个内核参数,用于指定系统应保留的最低空闲内存量(以KB为单位)。这个参数用于保护系统免受恶意进程或过度使用内存的合法进程的侵害。当系统空闲内存低于这个阈值时,内核会开始积极地回收内存,以确保系统稳定性和性能。
你提到的公式min_free_kbytes = 4 * lowmem_kbytes是一个用于计算min_free_kbytes的简化公式。这里的lowmem_kbytes是系统中除去高水位页面之后的剩余可管理页面数量。这个公式确保了系统始终保留足够的空闲内存来应对潜在的内存压力。
min_free_kbytes的值可以在系统运行时通过/proc/sys/vm/min_free_kbytes进行调整,也可以在系统启动时通过内核参数进行设置。这个值有一个范围限制,最小值为128KB,最大值为64MB,这是为了确保系统不会因为设置过低的值而变得不稳定,也不会因为设置过高的值而浪费过多的内存。
进程在申请内存时,根据其优先级和当前的内存状况,可能会有不同的结果。普通优先级的进程在内存紧张时可能无法分配到所需的内存,而高优先级的进程(如内核线程或某些关键的用户空间进程)则可以通过设置特定的标志(如GFP_HIGH、GFP_ATOMIC或GFP_MEMALLOC)来尝试访问预留内存。
SwapTotal
减去 SwapFree
得到的 S_swap
确实表示系统中已经使用的交换内存大小。而累加所有进程的 /proc/[PID]/status
中的 VmSwap
得到的 P_swap
应该是所有进程当前使用的交换内存量。
读者对MemTotal与QEMU虚拟机中分配的内存大小不一致的问题感到疑惑是很正常的。这个问题涉及到Linux内核的内存管理机制以及QEMU虚拟机的内存分配方式。
meminfo节点是Linux内核中用来显示系统内存使用状况的一个接口。meminfo节点通过/proc/meminfo文件向用户空间提供信息,而这些信息是由内核中的meminfo.c文件负责收集和展示的。
在meminfo.c中,meminfo_proc_show函数负责构建并输出/proc/meminfo文件的内容。该函数通过读取内核中的一系列全局变量和统计数据来生成各个内存统计项的值。
meminfo节点是Linux内核中用于展示系统内存使用情况的接口,通过/proc/meminfo文件向用户空间提供详细的内存统计信息。这些信息由内核中的meminfo.c文件负责收集和展示,其中meminfo_proc_show函数负责构建并输出这些内容。
meminfo节点包含多个统计项,每个统计项都有其特定的计算方式和意义。这些统计项涵盖了系统物理内存总量、空闲内存、缓存、交换空间使用情况、脏页等各个方面,为用户提供了全面的系统内存使用情况的视图。
这些统计信息对于系统管理员和开发者来说至关重要,它们有助于了解系统的内存状态,进而进行性能调优、故障排查和资源管理。通过分析和监控这些统计项,可以及时发现并解决潜在的内存问题,确保系统的稳定性和高效性。