# proc\_sys\_vm

legacy\_va\_layout

```
设置是否使用 legacy 32-bit mmap 布局

* 1 代表使用 legacy 32-bit mmap 布局
* 0 代表使用 new 32-bit mmap 布局（默认）
```

page\_lock\_unfairness

```
设置 page lock 最大容忍被偷锁的次数，默认 5。
```

percpu\_pagelist\_high\_fraction

```
设置每一个 zone 存储在 per-cpu page list 的比例。
最小值 8，代表最多存储 1/8 zone 内存到 per-cpu page list 中。
默认值 0，代表基于 zone low 水位和在线 CPU 个数决定 per-cpu page list 的比例。
```

unprivileged\_userfaultfd

```
设置普通用户是否能够使用 userfaultfd 系统调用。

* 0 代表只有 root 用户才能够使用 userfaultfd（默认）
* 1 代表普通用户也能够使用 userfaultfd
```

stat\_interval

```
设置内存统计信息的更新时间间隔。默认是 1 秒
```

stat\_refresh

```
任何读/写此节点都将更新 per-cpu 内存统计数据到全局内存统计数据中。
```

max\_map\_count

```
设置每一个进程最多能够创建的 VMA 个数，默认值 65530
```

mmap\_min\_addr

```
设置进程最低能够使用的虚拟地址，主要用于安全模块限制 null derefence bug 作用。
默认值 0，代表安全模块不进行任何强制保护。
```

mmap\_rnd\_bits

```
设置进程 VMA 基地址的随机化偏移位数。值越大，随机化就越大，从而提高了安全性，
因为攻击者更难预测到正确的内存地址。
```

mmap\_rnd\_compat\_bits

```
设置（运行在兼容模式的）进程 VMA 基地址的随机化偏移位数。
```

compact\_memory

```
写 1，对所有 zones 进行内存规整，减少内存碎片化
```

compact\_unevictable\_allowed

```
设置是否允许对 unevictable lru (mlocked pages) 进行规整

* 1 代表允许对 unevictable lru (mlocked pages) 进行规整（默认）
* 0 代表禁止对 unevictable lru (mlocked pages) 进行规整
```

compaction\_proactiveness

```
设置内存规整的活跃程度，范围为 [0, 100]，默认值 20

* 写非 0，同时触发主动内存规整
* 写 0，disable 主动内存规整
```

dirty\_background\_bytes

```
设置脏页总数达到多少时，后台内核 flusher 线程开始回写脏页到磁盘。单位是 Bytes。
需要注意，dirty_background_bytes 与 dirty_background_ratio 二选一
```

dirty\_background\_ratio

```
设置脏页总数达到多少时，后台内核 flusher 线程开始回写脏页到磁盘。
单位是目前系统可用内存的比例。
```

dirty\_bytes

```
设置脏页总数达到多少时，所有进程的写操作将被阻塞，开始回写脏页到磁盘。
单位是 Bytes。最小值是 two pages。
需要注意，dirty_bytes与 dirty_ratio 二选一
```

dirty\_ratio

```
设置脏页总数达到多少时，所有进程的写操作将被阻塞，开始回写脏页到磁盘。
单位是目前系统可用内存的比例。
```

dirty\_expire\_centisecs

```
设置脏页在内存中停留的最长时间。
当脏页的存在时间超过这个值时，后台内核 flusher 线程将强制回写这些脏页到磁盘。
单位是 1/100 秒，默认 3000（即 30 秒）。
```

dirty\_writeback\_centisecs

```
设置回写脏页到磁盘的频率。
每隔这个时间间隔，后台内核 flusher 线程就会被唤醒，开始检查是否有需要回写的脏页。
单位是 1/100 秒，默认 500（即 5 秒）。
如果设置 0 代表 disable 周期性回写脏页。
```

dirtytime\_expire\_seconds

```
设置文件系统元数据脏页在内存中停留的最长时间。
当元数据脏页的存在时间超过这个值时，后台内核 flusher 线程将强制回写这些脏页到磁盘。
同时，此值也用作唤醒 dirtytime_writeback 线程的间隔。
单位是 秒，默认值 43200（即 12 小时）。
```

panic\_on\_oom

```
在触发 OOM 时，是否同时触发 panic？

* 0 表示 Kill 某些进程，系统继续运行（默认）
* 1 表示系统直接 panic
```

oom\_dump\_tasks

```
当触发 OOM 时，显示进程相关信息（pid, uid, tgid, vm size, rss,
pgtables_bytes, swapents, oom_score_adj, score, and name.）
默认值 1，代表 enable.
```

oom\_kill\_allocating\_task

```
在触发 OOM 时，是否直接 kill 触发 OOM 的进程。

* 1 表示直接 kill 触发 OOM 的进程
* 0 表示 kill 内存占用最大的进程（默认）
```

overcommit\_memory

```
设置虚拟内存过度申请（overcommit）的策略。

* 0 如果`系统申请虚拟内存总大小 < 系统总内存+swap`，代表有足够的可用内存，成功，
  否则 失败。（默认）
* 1 代表总是允许虚拟内存过度申请，直到真正运行时分配不到物理内存才失败。
* 2 代表不允许虚拟内存过度申请（受 overcommit_ratio/overcommit_kbytes 影响）
```

overcommit\_ratio

```
当 overcommit_memory 设置为 2 ，overcommit_ratio 才有效。

`系统申请虚拟内存总大小 < (swap  + (系统总内存 - hugetlb 总大小) * overcommit_ratio)`，
单位 %。
```

overcommit\_kbytes

```
当 overcommit_memory 设置为 2 ，overcommit_kbytes 才有效。
需要注意，overcommit_ratio 与 overcommit_kbytes 二选一

`系统申请虚拟内存总大小 < (swap  + overcommit_kbytes)`，单位 KB。
```

user\_reserve\_kbytes

```
当 overcommit_memory 设置为 2，user_reserve_kbytes 才有效。

overcommit 预留空闲虚拟内存为 `min(当前进程虚拟内存总大小 / 32, user_reserve_kbytes)`。
单位 KB，默认值 131072（即 128MB）
```

admin\_reserve\_kbytes

```
设置预留多少内存来管理系统。如果 MemFree 高于 266MB 时，默认预留 8MB 内存来
管理系统，用于 login + shell + top/ps/kill etc；否则，预留 MemFree 3% 的内存。
```

lowmem\_reserve\_ratio

```
设置每一个 zone 预留内存比例，主要是防止在高端 zone 没有内存的情况下，
过度使用低端 zone 的内存资源。
默认 256 32，代表预留 DMA/DMA32 区域的 1/256 内存，预留 Noraml 区域的 1/32 内存
```

min\_free\_kbytes

```
设置内存回收的 min 水位值，单位是 KB。
相当于在每个 zone 上预留一部分内存供 kswapd 使用。
当空闲内存低于 min 水位时，执行直接内存回收流程。

`zone->min` 水位 等于 `min_free_kbytes * zone_managed_pages / (total zone_managed_pages)`

* 默认 `zone->low` 水位 等于 `zone->min + zone->min / 4`
* 默认 `zone->high` 水位 等于 `zone->min + 2 * zone->min / 4`
```

watermark\_scale\_factor

```
调整内存回收的 low, high 水位线，控制 kswapd 的激进程度。此值越大，
low/high 水位线就越高，即越早唤醒 kswapd 进行内存回收。
单位 1/10000，默认值 10（0.1%），最大值 3000（30%）。

当 `zone_managed_pages * watermark_scale_factor / 10000` 大于 `zone->min / 4`，

* 将 `zone->min + zone_managed_pages * watermark_scale_factor / 10000` 设置为新 `zone->low` 水位,
* 将 `zone->min + 2 * zone_managed_pages * watermark_scale_factor / 10000` 设置为新 `zone->high` 水位
```

watermark\_boost\_factor

```
由于内存碎片化导致在 pageblock 中混合不同移动属性的 page 时，将提高 high
watermark 的百分比，从而减少未来内存规整的难度，提高未来 high-order 分配的成功率。
单位是 1/10000，默认值 15000 代表把高于 high watermark 150% 的内存进行回收。
当设置为 0 时，代表禁用此功能。
```

extfrag\_threshold

```
当内存碎片化程度超过此值时，系统将开始进行内存规整。
范围为 [0, 1000]，默认值 500。

从 /sys/kernel/debug/extfrag/extfrag_index 查看每一个 zone 的不同 order 的
碎片化程度。

* 越接近 0 代表空闲内存越少，分配内存可能失败。
* 越接近  1000 代表内存碎片化越严重，分配内存可能失败
* -1 代表分配内存将会成功
```

swappiness

```
设置回收匿名页的积极程度，越大代表越积极回收匿名页。范围是 [0, 200]，默认值 60
```

page-cluster

```
设置匿名页 swapin readahead 的大小，默认 3（单位 order）
```

drop\_caches

```
对此文件执行写操作，将释放 clean cache 内存（pagecache, dcache, icache），
从不释放 dirty cache 内存。

* 1 代表释放 pagecache 内存
* 2 代表释放 slab objects，包括 dcache, icahche
* 3 代表释放 pagecache + slab objects 内存

在对此文件执行写操作之前，执行 sync 同步更多脏页到磁盘中，这样能够释放更多干净
内存。
```

vfs\_cache\_pressure

```
设置内核回收 dcache, icache 的趋势。默认值 100 代表公平回收 pagecache,
swapcache, dcache, icache。

* `<100` 代表内存尽量不回收 dcache, icache，甚至可以设置成 0，内核就从不回收
  dcache, icache，但是在内存压力大时容易导致 OOM。
* `>100` 代表内核回收更多 dcahce, icache。
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://vernon2gb.gitbook.io/notes/linuxsystem/common/proc_sys_vm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
