它在arm平台上的定义如下: void * high_memory; EXPORT_SYMBOL(high_memory); arm_lowmem_limit = lowmem_limit; high_memory...= __va(arm_lowmem_limit - 1) + 1; if (!...memblock_limit) memblock_limit = arm_lowmem_limit;
1. min_free_kbytes 先看官方解释: This is used to force the Linux VM to keep a minimum number of kilobytes free...* 16) = 4 * sqrt(lowmem_kbytes) (注:lowmem_kbytes即可认为是系统内存大小) 另外,计算出来的值有最小最大限制,最小为128K,最大为64M。...So the Linux page allocator has a mechanism which prevents allocations which _could_ use highmem from...using too much lowmem....在zone_watermark_ok()里会考虑z->lowmem_reserve[],导致在normal上的申请不会落到低端zone。
watermarks, access with *_wmark_pages(zone) macros */ unsigned long watermark[NR_WMARK]; } 源码路径 : linux...-4.12\include\linux\mmzone.h#255 其中涉及到的 NR_WMARK 值为 4 , 定义在如下枚举数据结构中 , enum zone_watermarks { WMARK_MIN...-4.12\include\linux\mmzone.h#255 其中 min_wmark_pages(z) 宏定义对应的 z->watermark[WMARK_MIN] 需要通过 min_free_kbytes...ifdef CONFIG_NUMA setup_min_unmapped_ratio(); setup_min_slab_ratio(); #endif return 0; } 源码路径 : linux...-4.12\mm\page_alloc.c#6976 三、最低水位计算过程 ---- 先调用 linux-4.12\mm\page_alloc.c#4331 位置的 nr_free_buffer_pages
1.概述 Android底层还是基于Linux,在Linux中低内存是会有oom killer去杀掉一些进程去释放内存,而Android中的lowmemorykiller就是在此基础上做了一些调整来的。...lowmemorykiller 代码位置:/kernel/msm-3.18/drivers/staging/android/lowmemorykiller.c lowmemorykiller中是通过linux...的shrinker实现的,这个是linux的内存回收机制的一种,由内核线程kswapd负责监控,在lowmemorykiller初始化的时候注册register_shrinker。...); // NR_FREE_PAGES 是在/kernel/msm-3.18/include/linux/mmzone.h中定义的zone_stat_item对应的第一个枚举,下面的枚举以此类推...同步机制 rcu_read_lock(); again: // for_each_process用来遍历所有的进程 // 定义在 /kernel/msm-3.18/include/linux
(2)调用 updateOomAdjLocked() 函数,若成功返回,说明 Linux 内核支持setOomAdj() 接口,updateOomAdjLocked 将修改 adj 的值并通知 linux...lowmemorykiller 定义了两个数组:lowmem_adj 和 lowmem_minfree。...,lowmem_shrinker 利用了标准 Linux 内核中的 Cache Shrinker 来实现,当空闲内存页面不足时,内核线程 kswapd 将用已注册的 lowmem_shrinker 来回收内存页面...的代码在函数 lowmem_shrink 中,下面给出该函数的主要结构。...由于 oom_killer 与标准 Linux 内核并无不同.
为了使系统能够继续运转不至于卡死,系统会尝试杀死一些不重要的进程来进行内存回收,这其中涉及的模块主要是:Linux OOM Killer和LowMemoryKiller。 ...Linux OOM Killer是Linux内核的一部分,其源码可以在这里查看:/mm/oom_kill.c。 ...Linux OOM Killer的基本想法是: 当系统已经没法再分配内存的时候,内核会遍历所有的进程,对每个进程计算badness值,得分(badness)最高的进程将会被杀死。...LowMemoryKiller通常会在Linux OOMKiller工作之前,就开始杀死进程。 ... • lowmem_autodetect_oom_adj_values • lowmem_adj_array_set • lowmem_adj_array_get • lowmem_adj_array_free
文章目录 一、内存区域 zone 简介 二、zone 结构体源码分析 1、watermark 成员 2、lowmem_reserve 成员 3、zone_pgdat 成员 4、pageset 成员 5...物理内存 " ; 一、内存区域 zone 简介 ---- " 内存节点 " 是内存管理的 最顶层结构 , " 内存节点 " 再向下划分 , 就是 " 内存区域 " zone , " 内存区域 " 在 Linux...内核中使用 struct zone 结构体类型进行描述 , zone 枚举定义在 Linux 内核源码的 linux-4.12\include\linux\mmzone.h#350 位置 ; 每个 "...成员 lowmem_reserve 表示 页分配器 使用的 区域 , 这些区域 必须 保留 , 不能借给高区域类型 ; /* * We don't know if the memory that...-4.12\include\linux\mmzone.h#350
当从Normal失败后,会尝试从DMA申请分配,通过lowmem_reserve[DMA],限制来自Normal的分配请求。...其值可以通过/proc/sys/vm/lowmem_reserve_ratio来修改。 ?...而linux中默认的low与min之间的值又比较小,所以就很容易造成direct reclaim的情况。...「extra_free_kbytes」: 源于此,安卓在linux水位的基础上增加了extra_free_kbytes的变量,这个extra时额外加在low和min之间的,它在min不变的情况下,让low...「watermark_scale_factor」: 内核总是在进步的,在linux内核4.6版本中,又诞生了一种新的调节水位的方式,即watermark_scale_factor系数,其默认值是10,对应内存占比
min_free_kbytes值的含义 kernel/msm-4.19/Documentation/sysctl/vm.txt min_free_kbytes: This is used to force the Linux...(); setup_per_zone_inactive_ratio(); return 0; } lowmem_kbytes: 代表的意思是lowmem中超过高水位的页的总和,这里的单位是...kbytes, 这就是lowmem中超过high水位的页乘以4这就是lowmem_kbytes new_min_free_kbytes = sqrt(lowmem_kbytes * 16) = √(lowmem_kbytes...这样看来linux原生的代码涉及MIN-LOW之间的间隙太小,很容易导致进入直接回收的情况的。...我们再来看下android版本下的水位计算 lowmem_pages += zone→managed_pages; //所有lowmem zone的managed_pages总和 min = (u64
原文:http://blog.csdn.net/guomsh/article/details/6536915 Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题...在32位CPU下寻址范围是有限的,Linux内核定义了下面三个区域: # DMA: 0x00000000 - 0x00999999 (0 - 16 MB) # LowMem: 0x01000000...ZONE)共880MB,并且是固定不能变的(除非使用hugemem内核),对于高负荷的系统,可能因为LowMem使用不好而触发了OOM Killer机制。...因为内存分配是一个连续的区域,在此时,如果LowMem里存在很多碎片或者LowFree太少,此时无法分配到一块连续的内存区域,就触发了OOM Killer。 ...p=430 http://www.dbanotes.net/database/linux_outofmemory_oom_killer.html http://www.sealinger.com/archives
最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂 1....我们了解一下32位Linux的内存管理结构 # DMA: 0x00000000 - 0x00999999 (0 - 16 MB) # LowMem: 0x01000000 - 0x037999999...如何查看lowMem 复制代码 -bash-3.00# free -lm total used free shared buffers cached Mem: 2026 1973 52 0 36 1303...所以我们需要保护LowMem,在2.6内核引入了lower_zone_protection,这将让内核愿意保护low memory,从而在分配内存时优先考虑从high memory分配。..._64 x86_64 x86_64 GNU/Linux 2.
在Android系统中,AmS需要和Linux操作系统有个约定,即将要谈到的Linux内核的内存管理控制系统是如何通知AMS内存不足的。...这个值的范围在-16到15,值越低,说明越重要,这个值类似于Linux系统中的进程nice值,只是在标准的Linux中,有其自己的一套Killer机制。...static int __init lowmem_init(void) { register_shrinker(&lowmem_shrinker); return 0; } LomemoryKiller...管家代码就在lowmem_shrink函数里面: static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask) { struct task_struct...other_file < lowmem_minfree[i]) { min_adj = lowmem_adj[i]; break
可以通过 /proc/sys/vm/watermark_scale_factor 设置 (4). setup_per_zone_lowmem_reserve 设置每个zone的lowmem_reserve...lowmem_reserve值可以通过 /proc/sys/vm/lowmem_reserve_ratio 来修改。...为什么需要设置每个zone的保留内存呢,lowmem_reserve的作用是什么?...因此针对这个场景,可以通过保留内存 lowmem_reserve[NORMAL] 给 NORMAL Zone 自己使用。...如下图所示,使用每个区域的 managed pages 和 lowmem_reserve_ratio 计算每个区域的lowmem_reserve值,可以看出结果和protection值一样。 ?
查找解决办法 类似问题:https://www.cyberciti.biz/tips/linux-oom-killer-out-of-memory-and-nfs-server-optimization.html...500M(该值根据自己具体使用环境设定) vm.lower_zone_protection = 500 # 生效最新配置 $ sysctl -p 补充 关于lower_zone_protection和lowmem_reserve_ratio...: http://blog.chinaunix.net/uid-286861-id-3503761.html lowmem_reserve_ratio详解:https://blog.csdn.net/joyeu
LowMemoryKiller(低内存杀手)是Andorid基于oomKiller原理所扩展的一个多层次oomKiller,OOMkiller(Out Of Memory Killer)是在Linux系统无法分配新内存的时候...内核,其进程管理都是基于Linux内核,LowMemoryKiller也相应的放在内核模块,这也意味着用户空间对于后台杀死不可见,就像AMS完全不知道一个APP是否被后台杀死,只有在AMS唤醒APP的时候...对于驱动程序,入口是__init函数,先看一下这个驱动模块的入口: static int __init lowmem_init(void) { register_shrinker(&lowmem_shrinker...other_file < lowmem_minfree[i]) { min_adj = lowmem_adj[i]; break...很直接,通过Linux的中的信号量,发送SIGKILL信号直接将进程杀死。到这就分析完了LomemoryKiller内核部分如何工作的。其实很简单,一句话:被动扫描,找到低优先级的进程,杀死。
虽然是英文的,但都比较好理解,如有问题,请留言,我们共同为Linux社区而努力。我们翻译效果还不一定好,因为这玩意毕竟是老外搞的吗!!!咯咯,翻译可能引起误解。...这玩意看懂需要tcp/ip方面的知识,学好proc对于linux性能优化是非常重要。这来自本人的整理。希望对大家有用。/proc/sys/vm主要是关于虚拟存储的相关信息。.../proc/sys/vm/block_dump) causes Linux to flush all dirty blocks....The VM uses this number to compute a pages_min value for each lowmem zone in the system....Each lowmem zone gets a number of reserved free pages based proportionally on its size.
, the pagetable will be approximately 800MB in size which is practically will not fit in 880MB size lowmem...(in 2.4 kernels - the page table is not necessarily in lowmem in 2.6 kernels) considering the other...uses of lowmem....e、reference: HugePages on Linux: What It Is... and What It Is Not......[ID 361323.1] To Bottom f、如何配置HugePage,请参考:Linux 下配置 HugePages
| 1031832 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes...Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移出查询缓存。... | 1031832 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes... | 1031832 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes... | 1030296 | | Qcache_hits | 1 | | Qcache_inserts | 1 | | Qcache_lowmem_prunes
对于Linux系统推荐设置为小于512的整数。 key_buffer_size = 256M #key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。...可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率...二、如果Qcache_lowmem_prunes很大,就要增加Query_cache_size的值。
领取专属 10元无门槛券
手把手带您无忧上云