从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里面哦