Linux内核内存管理相关的配置参数

发布于:2025-07-18 ⋅ 阅读:(24) ⋅ 点赞:(0)

Linux内核内存管理相关的配置参数(主要位于/proc/sys/vm/目录下),用于调整内存分配、缓存管理、交换机制、OOM(内存溢出)策略等核心内存行为。以下是对每个参数的详细解释:

admin_reserve_kbytes
block_dump
compaction_proactiveness
compact_memory
compact_unevictable_allowed
dirty_background_bytes
dirty_background_ratio
dirty_bytes
dirty_expire_centisecs
dirty_ratio
dirtytime_expire_seconds
dirty_writeback_centisecs
drop_caches
extfrag_threshold
hugetlb_shm_group
laptop_mode
legacy_va_layout
lowmem_reserve_ratio
max_map_count
memory_failure_early_kill
memory_failure_recovery
min_free_kbytes
mmap_min_addr
mmap_rnd_bits
mmap_rnd_compat_bits
nr_hugepages
nr_overcommit_hugepages
oom_dump_tasks
oom_kill_allocating_task
overcommit_kbytes
overcommit_memory
overcommit_ratio
page-cluster
page_lock_unfairness
panic_on_oom
percpu_pagelist_fraction
stat_interval
stat_refresh
swappiness
user_reserve_kbytes
vfs_cache_pressure
watermark_boost_factor
watermark_scale_factor

1. 内存预留与保护相关

  • admin_reserve_kbytes
    为系统管理员(root用户)预留的内存大小(单位:KB)。当系统内存紧张时,普通用户可能无法分配内存,但root仍可使用预留内存进行紧急操作(如杀进程)。

  • user_reserve_kbytes
    为每个非root用户预留的内存大小(单位:KB)。防止单个用户耗尽内存导致其他用户无法操作。

2. 脏页(Dirty Page)管理

脏页指内存中已修改但尚未写入磁盘的文件数据,内核需定期将其同步到磁盘以保证数据一致性。

  • dirty_background_bytes / dirty_background_ratio
    触发后台同步(pdflush/flush线程)的脏页阈值。

    • dirty_background_bytes:以字节为单位(绝对数值)。
    • dirty_background_ratio:以总内存的百分比为单位(相对比例)。
      两者同时存在时,bytes优先级更高(非0时生效)。当脏页达到此值,内核会在后台异步同步脏页,不阻塞用户进程。
  • dirty_bytes / dirty_ratio
    触发强制同步的脏页阈值。

    • dirty_bytes:以字节为单位。
    • dirty_ratio:以总内存的百分比为单位。
      当脏页达到此值,用户进程的写操作会被阻塞,直到脏页同步到磁盘(避免脏页过多导致数据丢失风险)。
  • dirty_expire_centisecs
    脏页在内存中停留的最长时间(单位:厘秒,1厘秒=0.01秒)。超过此时间的脏页会被标记为“过期”,下次后台同步时优先写入磁盘。

  • dirtytime_expire_seconds
    针对“仅修改时间”的脏页(如仅更新文件atime/mtime,未修改内容)的过期时间(单位:秒)。用于优化仅元数据修改的场景。

  • dirty_writeback_centisecs
    后台同步线程(flush)的唤醒间隔(单位:厘秒)。即使脏页未达阈值,线程也会定期唤醒检查并同步过期脏页。

3. 内存压缩与碎片管理

  • compaction_proactiveness
    内存碎片整理的“主动程度”(取值0-100)。值越高,内核越倾向于提前整理内存碎片,减少分配连续大页时的失败概率(适用于需要大页的场景,如数据库)。

  • compact_memory
    手动触发内存碎片整理的开关。写入1到该文件(echo 1 > /proc/sys/vm/compact_memory),内核会立即尝试合并零散内存页为连续页。

  • compact_unevictable_allowed
    是否允许整理“不可驱逐”内存页(如被锁定的内存mlock())。1表示允许,可提高碎片整理效果,但可能短暂影响锁定内存的进程。

  • extfrag_threshold
    内存外部碎片的阈值(0-1000)。外部碎片指内存中有足够总空间,但无连续大页可供分配的情况。值越低,内核越容易触发碎片整理(如超过阈值则尝试压缩内存)。

4. 缓存与交换(Swap)管理

  • drop_caches
    手动释放页缓存、目录项缓存(dentry)和索引节点缓存(inode)的开关。

    • 写入1:释放页缓存(文件数据缓存)。
    • 写入2:释放dentry和inode缓存。
    • 写入3:释放所有缓存。
      注意:释放缓存不会影响脏页,需先同步脏页(sync命令)再执行,避免数据丢失。
  • swappiness
    内核使用交换分区(Swap)的倾向程度(取值0-100)。

    • 值越高:越倾向于将内存中的不常用数据换出到Swap,为缓存腾出空间(如100时优先用Swap)。
    • 值越低:越倾向于保留内存数据,仅在内存紧张时使用Swap(如0时尽量不换出,适用于内存充足的服务器)。
  • vfs_cache_pressure
    内核回收目录项(dentry)和索引节点(inode)缓存的倾向(取值0-200)。

    • 100:默认值,按正常比例回收缓存。
    • <100:减少回收缓存的频率(更倾向保留缓存,适合文件操作频繁的场景)。
    • 100:增加回收频率(适合内存紧张,需释放缓存给应用的场景)。

5. 大页(HugePage)管理

大页用于减少TLB(内存地址转换缓存)的开销,提升需要大量连续内存的应用(如数据库、虚拟化)性能。

  • nr_hugepages
    预分配的静态大页数量。大页大小由系统架构决定(如x86_64默认2MB),分配后会长期占用内存,不被内核自动回收。

  • nr_overcommit_hugepages
    动态分配的大页数量(“超额提交”的大页)。当静态大页不足时,内核可临时分配此参数指定的大页,用完后可回收。

  • hugetlb_shm_group
    允许使用大页共享内存(SHM_HUGETLB)的用户组ID(GID)。非该组用户无法分配大页共享内存,用于权限控制。

6. OOM(内存溢出)策略

当内存耗尽且无法回收时,内核会触发OOM killer杀死进程释放内存。

  • oom_dump_tasks
    OOM发生时是否打印所有进程的内存使用信息(1=打印,0=不打印)。帮助分析哪些进程消耗内存过多。

  • oom_kill_allocating_task
    OOM时是否优先杀死“触发内存分配的进程”(1=优先杀死,0=按评分选择)。减少误杀关键进程的概率(如果分配进程是“罪魁祸首”)。

  • panic_on_oom
    OOM时是否触发系统panic(0=不panic,仅杀进程;1=直接panic重启;2=仅当无法杀死进程时panic)。生产环境通常设为0,避免系统直接崩溃。

  • memory_failure_early_kill
    当检测到内存硬件错误(如坏页)时,是否立即杀死访问该坏页的进程(1=立即杀死,0=尝试恢复)。减少错误扩散风险。

  • memory_failure_recovery
    是否开启内存硬件错误恢复机制(1=开启,尝试隔离坏页并继续运行;0=关闭,直接panic)。依赖硬件支持(如ECC内存)。

7. 内存过量使用(Overcommit)管理

Linux默认允许进程“过量申请内存”(实际使用时才分配物理内存),通过以下参数控制策略。

  • overcommit_memory
    内存过量使用的策略(取值0/1/2):

    • 0(默认):智能判断,拒绝明显不可能的申请(如申请超过总内存+Swap的内存)。
    • 1:允许所有过量申请(适合数据库等需要预分配大量内存但实际使用少的场景)。
    • 2:严格限制,申请内存不得超过(总内存 - 已使用) + Swap * overcommit_ratio%,避免过量使用导致OOM。
  • overcommit_kbytes / overcommit_ratio
    配合overcommit_memory=2使用:

    • overcommit_kbytes:允许过量申请的内存上限(字节)。
    • overcommit_ratio:允许过量申请的比例(相对于Swap大小),默认50(即允许申请Swap的50%)。

8. 其他核心参数

  • min_free_kbytes
    系统始终保留的最小空闲内存(KB)。确保内核和关键进程有足够内存运行,避免内存完全耗尽。值过小可能导致系统卡顿,过大会浪费内存。

  • lowmem_reserve_ratio
    针对不同内存区域(如DMA、Normal)的预留内存比例,防止某一区域内存耗尽影响其他区域(多适用于32位系统,64位系统较少调整)。

  • max_map_count
    单个进程可创建的内存映射(mmap)数量上限。防止进程创建过多映射耗尽系统资源(如恶意程序)。

  • mmap_min_addr
    进程通过mmap分配内存的最低地址(单位:字节)。默认非0,用于防止用户进程映射低地址内存(如NULL指针附近),避免某些漏洞攻击(如缓冲区溢出)。

  • page-cluster
    交换内存时一次读取/写入的连续页数量(2^n,n为参数值)。值越高,交换效率越高(连续IO更快),但内存紧张时延迟可能增加。

  • watermark_boost_factor / watermark_scale_factor
    内存水位线(Watermark)调整参数。用于动态调整内存空闲阈值,在内存紧张时提高回收力度,避免频繁触发OOM。

这些参数的默认值已适配多数场景,但可根据实际需求(如服务器、嵌入式、桌面)调整。修改时需谨慎(通过echo 值 > /proc/sys/vm/参数名临时生效),长期生效需写入/etc/sysctl.conf


网站公告

今日签到

点亮在社区的每一天
去签到