剩余内存较少导致malloc page fail问题当样机系统 Free Memory较少Cache还有一定数量的情况下当有系统进程需要一次性申请较大块memory的时候有可能导致malloc page fail的问题kernel具体waring信息如下rmm: page allocation failure: order:4, mode:0x104020CPU: 0 PID: 784Comm: rmm Tainted: G O 3.10.27#6Stack : 0000000000000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 82fd1560…CallTrace:[80018a1c] 0x80018a1c[80018a1c]0x80018a1c[8006ec9c]0x8006ec9c[800713b4]0x800713b4[80071664]0x80071664[801f5108]0x801f5108[801e0fd4]0x801e0fd4[8016a89c]0x8016a89c[]0xc0261ec4[80045cc4]0x80045cc4[8016a89c]0x8016a89c上述问题可以通过调整/proc/sys/vm/min_free_kbyte参数来缓解关于min_free_kbytes有 high low min 三条 watermarkwatermark[min] min_free_kbyteswatermark[low] watermark[min] * 5 / 4 min_free_kbytes * 5 / 4watermark[high] watermark[min] * 3 / 2 min_free_kbytes * 3 / 2watermark[high] - watermark[low] watermark[low] - watermark[min] min_free_kbytes / 4min_free_kbytes如果太小[min,low]之间水位的buffer就会很小在kswapd回收的过程中一旦上层申请内存的速度太快(典型应用数据库)就会导致空闲内存极易降至watermark[min]以下此时内核就会进行direct reclaim(直接回收)直接在应用程序的进程上下文中进行回收再用回收上来的空闲页满足内存申请因此实际会阻塞应用程序带来一定的响应延迟。当然min_free_kbytes也不宜太大太大一方面会导致应用程序进程内存减少浪费系统内存资源另一方面还会导致kswapd进程花费大量时间进行内存回收。min_free_kbyte在SDK中default配置是736K即watermark[high] 736K3/2 1104K watermark[low] 736K5/4 920K[highlow]之间的水位buffer为184K,当上层申请内存速度较快的时候很容易导致空闲内存降至watermark[min]针对客户系统剩余memory大于4M的样机一般建议min_free_kbyte配置为2048K修改方法echo 2048 /proc/sys/vm/min_free_kbyte另外客户样机在系统启动完成以后建议做一次drop cache的动作来释放系统开机带来的cache开销。相关JIra链接 IPCSDK-5917 - [YI]cpu loading 升高page allocation failure Closed