某省的数据库监控经常告警,(1)报数据库buffer命中率为70%,(2)报内存使用率高达95%,剩余内存不足。
经检查,该数据库主机的内存为8G,其中划分了4.5G给了sga+pga。那为什么8G的内存剩余不到1G了呢,除了分配给oracle的,还有谁用掉了近4G的内存?另外,要加大buffer的命中率,就要继续增加db_cache_size,就要继续消耗内存,怎么办?
经过检查发现:
hl_db03#[/]cd /usr/contrib/Q4/bin
hl_db03#[/usr/contrib/Q4/bin]./kmeminfo
kmeminfo (3.11)
libp4 (5.17): Opening /stand/vmunix /dev/kmem
Loading symbols from /stand/vmunix
======================================================================
Date: Wed Jul 11 18:02:02 2007
Processing pfdat table (2043764 entries)…
———————————————————————-
Physical memory usage summary (in pages):
Physmem = 2096640 Available physical memory:
Freemem = 28115 Free physical memory
Used = 2068525 Used physical memory:
System = 712589 by kernel:
Static = 52876 for text and static data
Dynamic = 0 for dynamic data
Bufcache = 659667 for file-system buffer cache<--------和dbc_max_pct/dbc_min_pct有关
Eqmem = 46 for equiv. mapped page pool
SCmem = 0 for system critical page pool
User = 1070721 by user processes
Uarea = 3884 for thread uareas
Disowned = 52203 disowned pages
----------------------------------------------------------------------
Dynamic memory usage summary (in pages):
……(以下省略)
我们可以看到 Bufcache = 659667 ,659667×4k=2638668k=2G。
通过kmtune |grep dbc_
dbc_max_pct 50 - 50
dbc_min_pct 10 - 10
发现以上两个值设置的过大,通过sam将其调整为
dbc_max_pct 5 - 5
dbc_min_pct 2 - 2
并且在数据库中加大db_cache_size到3G。
调整后,buffer的命中率为99%,内存使用率为70%。
一条评论
呵呵!文件系统的缓冲区太大了,默认情况下应该没有这么大的,感觉是有人修改过了。