1 共享内存段配置
1.1 使用sysctl命令查看当前内存共享段配置
[root@my_ob ~]# sysctl -p|grep kernel sysctl: cannot stat /proc/sys/vm_nrhugepages: No such file or directory kernel.shmall =2097152 kernel.shmmax =536870912 kernel.shmmni =4096 kernel.sem =25032000100128
1.2 使用ipcs命令查看当前内存共享段配置
[oracle@my_ob ~]$ ipcs-ml------ Shared Memory Limits -------- max number of segments =4096 max seg size (kbytes) =524288 max total shared memory (kbytes) =8388608 min seg size (bytes) =1
1.3 比较和分析
sysctl 命令可以显示当前内核的内存共享段配置,ipcs显示的当前用户的共享段限制,这两个命令的显示结果是相同的,但是显示的名称和单位不同,sysctl命令中shmall显示的共享内存总大小,同ipcs命令中max total shared memory相同,但是显示的单位是页,Centos中内存页的大小是4K,2097152X4=8388608,与ipcs中的值相同。shmmax是最大共享段的大小,单位是字节,536870912/1024=524288,也与ipcs中的值相同。这两个参数之所以重要是因为它们和Oracle数据库的内存参数设置有关,shmall的值小于Oracle的SGA_MAX,在数据库启动时会报“out of memory”错误,shmmax的值小于Oracle 的SGA_TARGET,数据库的SGA会被分为多个共享内存段,可能会影响性能。
Oracle数据库报“out of memory”,也可能/dev/shm小于SGA_MAX所致,/dev/shm的大小默认时内存的一半,如下图:
[root@my_ob ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 6.1G 06.1G 0% /dev tmpfs 6.1G 06.1G 0% /dev/shm
1.4 查看已分配共享内存段信息
[oracle@my_ob ~]$ ipcs-m------ Shared Memory Segments --------key shmid owner perms bytes nattch status 0x00000000 1 oracle 64012582912270x00000000 2 oracle 640524288000270x5d3c8684 3 oracle 640209715227
shmid为2的是oracle的SGA最大的一个段,值非常接近段最大大小值。
2 内存信息查看
2.1 内存汇总信息
[root@iZ2ze0t8khaprrpfvmevjiZ ~]# vmstat -s1881892 K total memory 99084 K used memory 753964 K active memory 374664 K inactive memory 633768 K free memory 154952 K buffer memory 994088 K swap cache 0 K total swap 0 K used swap 0 K free swap 743859 non-nice user cpu ticks 216 nice user cpu ticks 1017159 system cpu ticks 126196509 idle cpu ticks 12813 IO-wait cpu ticks 0 IRQ cpu ticks 321 softirq cpu ticks 0 stolen cpu ticks 280188 pages paged in3055140 pages paged out 0 pages swapped in0 pages swapped out 1755214231 interrupts 3848532284 CPU context switches 1666665031 boot time 37239 forks
vmstat查询的是系统启动以来的汇总信息,也可以使用下面命令查看系统当前内存使用情况。
[root@iZ2ze0t8khaprrpfvmevjiZ ~]# cat /proc/meminfo MemTotal: 1881892 kB MemFree: 633560 kB MemAvailable: 1619912 kB ##不用换页新应用可以使用的内存空间 Buffers: 154952 kB Cached: 932172 kB SwapCached: 0 kB Active: 753576 kB Inactive: 374544 kB Active(file): 712344 kB Inactive(file): 374332 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 520 kB Writeback: 0 kB AnonPages: 41012 kB Mapped: 53488 kB Shmem: 452 kB Slab: 72632 kB
2.2 如何分析
MemFree是系统当前空闲的物理内存,MemTotal是系统总的物理内存,MemAvailable是系统当前可用内存,是指不用进行换页就可以分配给应用的物理内存。这个值有可能小于空闲物理内存,主要是受wmark_low的影响,wmark有三个值high,low,min。
high当剩余内存在high以上时,系统认为当前内存使用压力不大,kswapd内核线程进入睡眠状态。
low当剩余内存降低到low时,系统就认为内存已经不足了,会触发kswapd内核线程进行内存回收处理
min当剩余内存在min以下时,则系统内存压力非常大。一般情况下min以下的内存是不会被分配的,min以下的内存默认是保留给特殊用途使用,属于保留的页框,用于原子的内存请求操作。
这三个值会对页面回收的产生影响,从上面对三种水位的介绍,high水位时内存很充足,内核不用特意做回收的动作,实际上,当内存降低到low watermark时,内核线程kswapd开始进行回收页面,这个回收是异步的,不会阻塞应用程序,但回收页面要回收到什么程度为止呢?这时high watermark存在的意义就体现出来了,当kswapd回收页面
发现此时内存终于达到了high水位,那么系统认为内存已经不再紧张了,所以将会停止进一步的操作。
如果内存达到或者低于min watermark时,会触发内核直接回收操作(direct reclaim),这时会阻塞应用程序。
这三个值的设置可以用下面的命令查看
[root@iZ2ze0t8khaprrpfvmevjiZ ~]# cat /proc/zoneinfo Node 0, zone DMA pages free 1939 min 95 low 118 high 142 scanned 0 spanned 4095 present 3998 managed 3977 Node 0, zone DMA32 pages free 156505 min 11168 low 13960 high 16752 scanned 0 spanned 520160 present 520160 managed 466496
3 linux操作系统内存管理
linux操作系统使用伙伴系统(buddy allocator)来管理内存,伙伴系统对内存的管理是基于系统内存页的(页大小为4k),同时使用slab系统来管理内核小对象使用的内存,这些小对象使用几个至几十个字节的内存,如果使用页来管理会导致大量内存浪费,效率页也低。
查看系统 buddy使用情况
[root@iZ2ze0t8khaprrpfvmevjiZ ~]# cat /proc/buddyinfo Node 0, zone DMA 68343102220 Node 0, zone DMA32 1072271844112630317842200
查看slab使用情况
[root@iZ2ze0t8khaprrpfvmevjiZ ~]# cat /proc/slabinfo slabinfo - version: 2.1 # name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail> ext4_groupinfo_4k 330330136301 : tunables 000 : slabdata 11110
这里以名字为ext4_groupinfo_4k的slab进行说明,共有对象330个,活跃对象330个,对象大小136字节,每个slab有30个对象,每个slab个内存页。