《5-刘智龙-PostgreSQL与Linux内存管理.pdf》由会员分享,可在线阅读,更多相关《5-刘智龙-PostgreSQL与Linux内存管理.pdf(52页珍藏版)》请在三个皮匠报告上搜索。
1、题目:PostgreSQL与Linux内存管理刘智龙VM内存管理01.pages计算02.CGROUP内存管理(v1)03.CONTENTSwhats new in CG V204.VM内存管理/01VM4linux内核virtual memory子系统,虚拟内存的全局策略和行为控制ll/proc/sys/vm/*vm管理什么?-虚拟内存管理,比如地址映射,内存保护(只读、可执行权限等),共享内存管理等-物理内存管理,负责物理内存的分配,通过虚拟内存地址映射分配给进程使用(不负责直接管理物理内存)-内存回收和交换,比如内存回收机制、oom、swap等-页缓存PageCache管理,利用合并IO
2、以减少IO操作,也包含写脏页机制。PG的double buffer第二层就是这个,所以pg是依赖VM的pagecache管理的VM-内存压缩5内存压缩(Compaction)是Linux内核用于解决内存碎片化问题的机制,通过合并空闲物理页,提升大块内存页的分配。参数名功能定位默认值/范围compact_memory手动触发全局内存压缩操作写入1触发compaction_proactiveness控制主动压缩的触发频率4.x才有的参数。0-100(默认20)compact_unevictable_allowed是否允许压缩不可回收页(如mlock锁定的内存)4.x才有的参数。0(禁止)或1(允许
3、)defrag_mode控制内存碎片整理的触发策略4.x才有的参数。0-3,0表示关闭自动compaction特性,只能手动压缩;1表示defer开启被动压缩。3.10默认1extfrag_threshold大块内存不足时,触发压缩的阈值0-1000(默认500)VM-内存压缩6压缩有3种模式(跟内核版本是否支持相关):被动压缩:extfrag_threshold是进程申请大块内存发现已经不足是否压缩,解决“已发生”的碎片问题。主动压缩:compaction_proactiveness是主动控制压缩的积极性,优化“未发生”但可能出现的碎片风险。手动压缩:compact_memory。VM-内存
4、压缩7extfrag_threshold是Linux内核中控制被动压缩的参数。当内核尝试分配高阶连续物理内存(如大页)失败时,会通过碎片化指数判断失败原因:-1:分配成功(满足水位线)0:因内存不足失败0-1:因碎片化失败cat/sys/kernel/debug/extfrag/extfrag_index|grep NormalNode 0,zone Normal-1.000-1.000-1.000-1.000-1.000-1.000-1.000-1.000-1.000 0.995 0.998 比如extfrag_threshold=600,则当碎片化指数600时触发压缩。extfrag_in
5、dex还是挺有用的,可以协助buddy观察碎片问题。VM-刷脏8刷脏跟内存回收有点类似,也分异步和同步:异步刷脏:由pdflush/flush/kdmflush等后台线程执行,应用写入不受影响同步刷脏:直接阻塞应用进程,由发起写操作的进程自己刷脏参数名称作用描述默认值dirty_background_bytes后台异步刷脏阈值,字节0(未启用)dirty_background_ratio后台异步刷脏阈值,百分比10%dirty_bytes同步刷脏阈值,字节0(未启用)dirty_ratio同步刷脏阈值,百分比20-40%dirty_expire_centisecs脏页在内存中的最长存活时间30
6、00(30秒)dirty_writeback_centisecs内核周期性检查脏页状态的频率500(5秒)xxx_bytes和xxx_ratio参数互斥。VM-刷脏9dirty_background_bytes 0dirty_background_ratio 10dirty_bytes 0dirty_ratio 40dirty_expire_centisecs 3000dirty_writeback_centisecs 500应用程序写入生成脏页周期检查dirty_writeback_centisec 每5秒阈值检查超时脏页dirty_expire_centisecs3秒dirty_backg