Linux_x86_64BIT内存管理与分布之数据库场景之一

从Linux系统看内存的使用情况和分布情况着实一片混乱. 为此我们接着上篇<<部分SWAP 内存知识>>
http://blog.csdn.net/zengmuansha/article/details/51776899
部分内容继续讲解
FREE -M 这个命令显示的结果 着实不太友好
这里写图片描述

要是变成下面这样子就好看多了,我把第二行-/+buffer/cache 变成了MEM
             total       used       free     shared    buffers     cached
alloc:        4092        3270       826        0          36        1482
Mem:          4092        1748      2344
Swap:         4096           0      4906

第一行表明是内存分配情况,这里指内存页分配
第二行就是内存使用情况,已使用和未使用.
OK 到这里我们的FREE,讲完了.没啥可以继续讲它的了.

接下来我们讲/PROC/MEMINFO 如果去百度查的话 可以查看大部分名词解释. 当这是CENTOS 6.这个可是真实业务库的内存信息.信息跟上面的数据是不一样的,大家不用去纠结它.里面有些字段跟FREE 命令我想大家都能看得懂.

系统内存信息
MemTotal:       32880396 kB
MemFree:          274580 kB
Buffers:          230840 kB
Cached:         27474348 kB
SwapCached:         6680 kB
Active:         20240448 kB
Inactive:        8930104 kB
Active(anon):    6440892 kB
Inactive(anon):   936684 kB
Active(file):   13799556 kB
Inactive(file):  7993420 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      20971516 kB
SwapFree:       20311876 kB
Dirty:               120 kB
Writeback:             0 kB
AnonPages:       1459948 kB
Mapped:          5433048 kB
Shmem:           5912212 kB
Slab:             772980 kB
SReclaimable:     679996 kB
SUnreclaim:        92984 kB
KernelStack:        5752 kB
PageTables:      2397380 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    37411712 kB
Committed_AS:   14264512 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      201448 kB
VmallocChunk:   34359526916 kB
HardwareCorrupted:     0 kB
AnonHugePages:    112640 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:    33544192 kB

重点关注信息如下:

MemTotal:       32880396 kB
MemFree:          274580 kB
Buffers:          230840 kB
Cached:         27474348 kB
SwapCached:         6680 kB
SwapTotal:      20971516 kB
SwapFree:       20311876 kB
Shmem:           5912212 kB
Slab:             772980 kB
SReclaimable:     679996 kB
SUnreclaim:        92984 kB
KernelStack:        5752 kB
PageTables:      2397380 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

MemTotal,Buffers,MemFree,SwapTotal,SwapFree,Cached 这些都跟FREE一样的
真实业务库的FREE

             total       used       free     shared    buffers     cached
Alloca:      32109       31891        218          0        225      26896
Mem:         32109        4769      27340
Swap:        20479         643      19836

我们画出按功能的内存分布图
这里写图片描述

再结合meminfo重点信息
Used 内存 4769MB 当中内核的PageTable,Kernel,Salb内存.
这里写图片描述

2397380 +772980 +5752 =3101MB

那么使用内存总量减去内核内存 :4769-3101=1668MB
应该是进程使用的内存了1668MB

业务系统进程情况如下:

All Process Number:                        634
System Process Number:                     198
Oracle User Procuess Number:               416
Oracle DB BackGround Process Number:        30
Oracle DB Client Process Link Number:      367
Oracle User NO DB Procuess Number:          17
Other User Process Number:                  26

使用TOP看内存 关注角度是进程使用的内存
这里写图片描述

VIRT 进程的虚拟内存大小; RES进程物理内存大小; SHR是进程的共享内存大小
基本上进程独占内存:RES-SHR.
如果按照TOP来进程累积的话 必然共享内存会重复计算 .
那么这共享内存是什么呢? 是ORACLE的SGA 吗? 是的 每个前台进程从TOP上看都包含SGA+PGA.
另外还有个进程共享库.
所以共享内存=SGA+LIB .
因此数据库进程就全包,普通进程就包含LIB.

Liunx 系统各个进程的信息在 /proc/$pid/

[root@localhost proc]# cat /proc/1/statm
487 185 133 31 0 67 0
很简单地返回7组数字,每一个的单位都是一页 (常见的是4KB)
分别是
size:任务虚拟地址空间大小
Resident:正在使用的物理内存大小
Shared:共享页数
Trs:程序所拥有的可执行虚拟内存大小
Lrs:被映像倒任务的虚拟内存空间的库的大小
Drs:程序数据段和用户态的栈的大小
dt:脏页数量CLE PGA内存:

使用SHELL脚本来计算进程使用内存:
$ cat RSS.sh
#/bin/bash                                                                                                              
for PROC in `ls  /proc/|grep "^[0-9]"`
do
  if [ -f /proc/$PROC/statm ]; then
      TEP=`cat /proc/$PROC/statm | awk '{print ($2)}'`
      RSS=`expr $RSS + $TEP`
  fi
done
RSS=`expr $RSS \* 4`
echo $RSS"KB"

计算所有进程使用内存减去共享内存:
TOTAL RAM USED:1425 MB

其中ORACLE进程当中的PGA内存:
POGRAM                        COUNT(PID) PGA_USE_MB PGA_ALLOC_MB PGA_FREE_MB PGA_MAX_MB
------------------------------ ---------- ---------- ------------ ----------- ----------
oracle@oraclemain              367           376.298      739.694     162.438   1734.073
oracle@oraclemain (ARC3)       1              52.399      131.117      77.875    131.117
oracle@oraclemain (ARC2)       1              43.035        87.43      35.688      87.43
oracle@oraclemain (ARC0)       1              53.997       75.992      21.188     75.992
oracle@oraclemain (NSS2)       1              24.262       56.742      32.375      65.68
oracle@oraclemain (DBW0)       1               7.026       33.328          26     33.328
oracle@oraclemain (ARC1)       1              10.944       12.742       1.063     12.742
oracle@oraclemain (TNS V1-V3)  1               3.718         4.25           0     12.125
oracle@oraclemain (LGWR)       1              10.905       11.492           0     11.492
oracle@oraclemain (SMON)       1               1.227        6.414       4.063      6.414
oracle@oraclemain (CJQ0)       1               1.243         5.75       4.188       5.75
oracle@oraclemain (Q001)       1               3.299        5.414        .813      5.414
oracle@oraclemain (SMCO)       1               4.858        5.351           0      5.351
oracle@oraclemain (MMON)       1               1.905        4.734       2.375      4.734
oracle@oraclemain (Q002)       1               2.942         3.68        .375       3.68
oracle@oraclemain (DIA0)       1                2.35        3.351         .75      3.351
oracle@oraclemain (J000)       1               0.677        1.867           0      1.867
oracle@oraclemain (RECO)       1               0.768         1.68        .188       1.68
oracle@oraclemain (DBRM)       1               0.734        1.367        .188      1.367
oracle@oraclemain (CKPT)       1               0.785        1.013           0      1.013
oracle@oraclemain (MMNL)       1                0.75         .992           0       .992
oracle@oraclemain (W000)       1               0.768         .867           0       .867
oracle@oraclemain (J001)       1               0.658         .805           0       .805
oracle@oraclemain (VKTM)       1               0.658         .742           0       .742
oracle@oraclemain (DIAG)       1               0.658         .742           0       .742
oracle@oraclemain (MMAN)       1               0.661         .742           0       .742
oracle@oraclemain (PSP0)       1               0.661         .742           0       .742
oracle@oraclemain (GEN0)       1               0.665         .742           0       .742
oracle@oraclemain (PMON)       1                0.67         .742           0       .742
oracle@oraclemain (QMNC)       1               0.662         .742           0       .742

PGA 总分配内存 :1201.266MB

从数据库里查的PGA情况: PGA ALLOCATED:1.174GB 1020MB

NAME                                                       VALUE UNIT          UNIT_GB
---------------------------------------- ----------------------- ---------- ----------
aggregate PGA target parameter                   69,1221,2992.00 bytes           6.437
aggregate PGA auto target                        56,5880,8320.00 bytes            5.27
global memory bound                               6,9122,0480.00 bytes            .643
total PGA inuse                                   6,3918,1824.00 bytes            .595
total PGA allocated                              12,6059,3152.00 bytes           1.174
maximum PGA allocated                            38,8144,1280.00 bytes           3.614
total freeable PGA memory                         3,8856,2944.00 bytes            .361
process count                                             399.00

使用下面的脚本可显示出每个进程的独占内存. 然后导到文本文件中 再GREP…过滤再统计便的ORACLE 前后台进程.

echo -e
echo "进程实际独占物理内存大小:"
#!/bin/bash
# Get current swap usage for all running processes
# writted by zengfankun
function GetProcRam {
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
if [  -d $DIR ]; then
PROGNAME=`ps -p $PID -o cmd --no-headers`
RAM_PAGES=`cat $DIR/statm | awk '{print $2}'`
SHARD_PAGES=`cat $DIR/statm | awk '{print $3}'`
let REAL_PAGES=$RAM_PAGES-$SHARD_PAGES
REAL_RAM=$(expr $REAL_PAGES \* 4 )
if [ $REAL_RAM -gt 0 ] ; then
echo -e "$PID\0011$REAL_RAM\0011$PROGNAME"
fi
let SUM=$SUM+$REAL_RAM
fi
done
echo "TOTAL RAM USED:$(expr $SUM / 1024) MB"
}
echo -e "PID\0011REAL_RAM_USED(KB)\0011PROGNAME"
GetProcRam |sort -rn -k2

ORACLE 前台进程 1159.558594 MB 后台进程 182.9765625 MB =>1342.5351565 mb
那么新的内存分布就出来了

这里写图片描述

这个业务库是大家都通用的数据库ORACLE 11.2.0.1.0 版本 而且都是默认安装的.
这SGA 在….
/proc/meminfo
Shmem: 5912212 kB

文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda2 20G 9.4G 9.2G 51% /
tmpfs 16G 6.2G 9.6G 40% /dev/shm

“内存动态组件分配情况:”

COMPONENT                 CURRENT_GB      MINGB      MAXGB
------------------------- ---------- ---------- ----------
shared pool                   3.3125      3.125     3.3125
large pool                     .0625      .0625      .0625
java pool                       .125       .125       .125
streams pool                    .125       .125       .125
SGA Target                    6.1875     4.4375     6.1875

从数据库来说我们使用了6.1875GB SGA
SGA在/dev/shm 里分配. shm 已用了9.6GB
而meminfo当中的shmem 为5773MB 三者之间有误差哦!!
呵呵 要继续研究研究下!!

不过SGA 可包含在CACHED里面哦
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值