malloc和free并非立即分配或释放物理内存。RSS(Resident Set Size)是衡量进程内存使用的误导性指标,因为它未能涵盖缓存和缓冲区等对应用性能至关重要的内存类型。memory.low和memory.high等文件提供了更全面、更细致的内存资源控制和保护,旨在维护核心服务的稳定性。senpai工具利用PSI(Pressure Stall Information)动态评估应用程序的真实内存工作集,帮助SREs准确识别内存需求、发现泄漏并优化资源配置。
malloc/free示例 [00:01:20]malloc并不立即分配物理内存 [00:01:51]malloc会立即分配物理内存。malloc与实际的内存分配没有任何直接关系,它只是提供了一个“选择”去使用内存。
free操作的“谎言”:内存回收的复杂性 [00:11:10]
free并不立即释放物理内存 [00:11:22]malloc类似,free也并非如程序员想象的那样立即将内存返回给操作系统。free结果 [00:11:41]
free只是给分配器的信号,不是给操作系统的信号 [00:13:33]free只是告诉内存分配器“我不再需要这块内存了”,而不是“请立即将其返回给操作系统”。free,内存也可能不被实际释放。RSS作为衡量指标,在现代系统中变得非常不可靠。
RSS是广泛使用的内存指标,但它过于关注匿名内存和映射文件内存,忽略了缓存和缓冲区等同样重要的内存类型。RSS的误导性,以及仅限制RSS会导致应用程序突破系统资源限制。
memory.max文件用于限制cgroup可以使用的最大内存量。memory.max文件限制所有内存类型(缓存、缓冲区、socket内存、内核内存等) [00:23:58]memory.max直接有效,但如何用它来构建可靠的系统是一个挑战。memory.low:内存保护 [00:26:50]memory.low是对Unix内存控制方式的根本性改变。memory.low,通常就不会被回收内存。memory.low不是内存预留。它不会预先从其他cgroup那里“拿走”内存。memory.low的内存。memory.low和memory.min进行内存保护,减少了对硬性memory.max的依赖。
make -j+1(编译时使用比CPU核心数多1的并行度),Swap通过维持轻微的内存正向压力,促使操作系统优化内存使用,确保所有内存资源都被充分利用。memory.current [00:33:48]
memory.high与性能的关系 [00:35:54]memory.high是Cgroup v2中的一个可调参数,它会在cgroup内存使用超过阈值时触发内存回收,直到使用量回到阈值之下。memory.high并观察应用程序性能(例如内核编译时间),可以找到一个性能开始显著下降的内存使用拐点。senpai工具与PSI (Pressure Stall Information) [00:36:45]senpai是一个利用Cgroup v2的PSI(Pressure Stall Information)系统来找出应用程序实际所需内存的工具。senpai通过memory.high结合PSI动态调整内存限制 [00:38:00]senpai利用PSI作为反馈机制,动态地对cgroup施加足够的内存压力(通过memory.high),以回收对工作负载性能非必需的“冷”页面。senpai通过不断调低应用程序的内存限制,直到检测到性能问题(PSI压力增加),然后适度回退,从而得到一个准确的内存工作集大小。senpai的价值 [00:38:40]