/proc/sys/vm
该目录下的文件用来优化虚拟内存
比较重要的参数如下
justin_$ uname -a
Linux justin 2.6.32-100.26.2.el5 #1 SMP Tue Jan 18 20:11:49 EST 2011 x86_64 x86_64 x86_64 GNU/Linux
Swappiness
justin_$ more swappiness
60
--范围从0—100,因为即便有足够空余物理内存,linux也会将部分长期没有用到的页swap,该值越高则linux越倾向于此;
vfs_cache_pressure
默认值100,用于控制回收cache频率,值越小则越倾向于保留cache,0表示从不回收cache容易导致out-of-memory
注:cache用于缓存inode/dentry,而buffer用于缓存data
justin_$ more vfs_cache_pressure
100
stat_interval
VM信息更新频率,默认每1秒更新一次
justin_$ more stat_interval
1
hugetlb_shm_group指定group id,拥有该gid的用户可以使用huge page创建SysV共享内存段;
注:用户可通过2种方式使用huge page
Mmap:使用此API时,如果没有指定MAP_HUGETLB选项,系统必须加载hugetlbfs文件系统到/mnt/huge
SYSV共享内存system call(shmget/shmat):调用此API则需要配置hugetlb_shm_group
如果oracle使用了huge page且通过shm*调用,则将该值设为oracle用户的gid,否则可能会遭遇ORA-27125
ORA-27125: unable to create shared memory segment
Cause: shmget() call failed
Action: contact Oracle support
justin_$ more hugetlb_shm_group
0
nr_hugepages
huge页的最小数目,需要连续的物理内存;oracle使用hugepage可以降低TLB的开销,节约内存和CPU资源,但要同时设置memlock且保证其大于hugepage;其与11gAMM不兼容;
# - memlock - max locked-in-memory address space (KB)
显然此系统分配了hugepage但没有程序使用
justin_$ more nr_hugepages
5120
justin_$ more /proc/meminfo | grep -i huge
HugePages_Total: 5120
HugePages_Free: 5120
HugePages_Rsvd: 0
HugePages_Surp: 0–当请求的页数超过nr_hugepages时可额外申请的页数,最大值由nv_overcommit_hugepages参数控制
Hugepagesize: 2048
nr_overcommit_hugepages
系统可分配最大huge page数= nr_hugepages + nr_overcommit_hugepages
justin_$ more nr_overcommit_hugepages
0
mmap_min_addr
指定用户进程通过mmap可使用的最小虚拟内存地址,以避免其在低地址空间产生映射导致安全问题;如果非0,则不允许mmap到NULL页,而此功能可在出现NULL指针时调试Kernel;mmap用于将文件映射至内存;
该设置意味着禁止用户进程访问low 4k地址空间
justin_$ more mmap_min_addr
4096
panic_on_oom
用于控制如何处理out-of-memory,可选值包括0/1/2,默认为0
0:当内存不足时内核调用OOM killer杀死一些rogue进程,每个进程描述符都有一个oom_score标示,oom killer会选择oom_score较大的进程
1/2:内存不足时不杀死进程,但具体策略有所差异
justin_$ more panic_on_oom
0
oom_kill_allocating_task
控制如何kill触发OOM的进程,可选值包括0/non-0,受panic_on_oom值影响
0:OOM killer扫描所有的进程寻找oom_score最高的,可通过将其kill释放大量内存
Non-0:kill出发out-of-memory的那个进程,避免进程队列扫描
justin_$ more oom_kill_allocating_task
0
lowmem_reserve_ratio
保留的lowmem,3列分别为DMA/normal/HighMem
justin_$ more lowmem_reserve_ratio
256 256 32
dirty_background_bytes/ dirty_background_ratio
当内存中脏页达到一定数量或比例时,启用pdflush将其刷新至磁盘,两者只能取其一;
[oracle@usuwsoadb05 vm]$ more dirty_background_bytes
0
[oracle@usuwsoadb05 vm]$ more dirty_background_ratio
10
dirty_bytes/ dirty_ratio
当进程的脏数据达到某个临界点则该进程自动将其刷新至磁盘,dirty_ratio是与整个系统内存相除
justin_$ more dirty_bytes
0
justin_$ more dirty_ratio
20
drop_caches
默认为0,可选值包括1/2/3
1:释放页缓存,即buffer
2:是否inode和dentries缓存,即cache
3:包含1和2
注:由于buffer/cache里的值
justin_$ more drop_caches
0
max_map_count
一个进程最多可用于的内存映射区(memory map areas),在调用malloc会用到,由mmap/mprotect生成
Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries.
大部分程序使用数量不会超过1000,默认值65536
注:该值若太小某些情况下会导致ora-4030,详情参照ID 1325100.1,
当4030跟踪文件的process map dump记录如下,此时max_map_cout设置为65536导致资源不足,可适当调大
----- Process Map Dump -----
00400000-0954f000 r-xp 00000000 fd:09 3131376 /e00/oracle/prod/v11.2.0/bin/oracle <<
0974e000-0a2be000 rwxp 0914e000 fd:09 3131376 /e00/oracle/prod/v11.2.0/bin/oracle
0a2be000-0a304000 rwxp 0a2be000 00:00 0
0c8c9000-0c950000 rwxp 0c8c9000 00:00 0 [heap]
60000000-60001000 r-xs 00000000 00:13 9374560 /dev/shm/ora_DSSP_11698195_0
60001000-70000000 rwxs 00001000 00:13 9374560 /dev/shm/ora_DSSP_11698195_0
70000000-80000000 rwxs 00000000 00:13 9374561 /dev/shm/ora_DSSP_11698195_1
80000000-90000000 rwxs 00000000 00:13 9374565 /dev/shm/ora_DSSP_11730964_0
90000000-a0000000 rwxs 00000000 00:13 9374566 /dev/shm/ora_DSSP_11730964_1
a0000000-b0000000 rwxs 00000000 00:13 9374569 /dev/shm/ora_DSSP_11763733_0
b00
2aed84a4f000-2aed86e5f000 rwxp febe2000 00:11 29160 /dev/zero
7fffea3ca000-7fffea418000 rwxp 7ffffffb1000 00:00 0 [stack]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 [vdso] <
******************* End of process map dump ***********
justin_$ more max_map_count
65530
nr_pdflush_threads
当前pdfflush线程数量&#xff0c;为read-only&#xff0c;系统会根据脏页数自动调整&#xff0c;1秒增加1个直至nr_pdflush_threads_max&#xff1b;
justin_$ more nr_pdflush_threads
0
overcommit_memory
为一个flag&#xff0c;可选值包括0/1/2&#xff0c;用于控制内存过度分配
0&#xff1a;当用户空间请求更多内存时&#xff0c;内核则评估当前空闲内存量&#xff0c;如果足够则分配
1&#xff1a;内核假定系统中始终有足够的内存直至耗尽为止
2&#xff1a;内核采用”never overcommit”策略&#xff0c;以避免内存被耗尽
有很多程序调用malloc()请求大量内存却很少使用&#xff0c;该参数则十分有用
justin_$ more overcommit_memory
0
overcommit_ratio
该值为物理内存比率&#xff0c;当overcommit_memory&#61;2时&#xff0c;进程可使用的swap空间不可超过PM * overcommit_ratio/100
justin_$ more overcommit_ratio
50
page-cluster
一次写入swap的内存页数&#61;2的page-cluster次方&#xff0c;若该值为0则一次写入1个页&#xff0c;为1
justin_$ more page-cluster
3