祖仙教
前期节要
这张图是我们第二章进行的强拆三层空间的方法图。
本章不是再讲拆分,当为了加强大家的印象,每次都会贴本图。
今天我们将重要的三大配置,分别应用程序端,系统端,数据库端。
因为这三大配置,经常导致性能问题,而且很重要的问题!
第一大配置 应用程序连接池配置
因为ORACLE链接是进程,每来个链接进来的话,ORACLE后台要生成一个服务进程SERVER PROCESS 提供服务,而系统也要有个客户端进程。
而在WEB应用的今天,大量的,而且是频繁的短链接。就是发生一个WEB请求后,需要操作后台数据库,则需要链接一次数据库。查询完了,立马翻脸不认人。下次要的时候,在狗脸乞讨。
这个时候LINUX 系统需要FORK()函数生成一个进程出来,用完后就销毁!
在以前工厂中这种情况也有,只是比较少,无所谓而已。毕竟一个工厂顶多255台链接,大部分都是长链接,而且就是在早上上班的时候发生登录风暴!
可如今WEB天下,动不动就云ERP,从工厂内部,扩展到全球其他工厂,或者支持异地上班,比如说销售人员,在家工作比如说老板。这样的话需要1千个链接。而且每次都是短时间连一下,连完后就丢丢掉!
这样的情况很显然对数据库所在的LINUX服务器来说,鸭梨山大!AIX 和SORILAS,都跑不掉! 你说升级小型机,还是大型机也是给不了多少力的。
不用说云ERP了,就是工行的WEB网银都很累!工行的客户远远多于全球化的工厂用户。
所以就要配置应用链接池!
JAVA 应用有好多链接池可以玩! TOMCAT也有,。。。。
Proxool是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
DBCP (Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。
(主页:http://commons.apache.org/dbcp/)
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
(主页:http://sourceforge.net/projects/c3p0/)
商业中间件连接池 weblogic的连接池 websphere的连接池
NET IIS 容器也有, 小仙就配过。
string cs =
在做 ASP.Net 程序时,我们会发现,如果网站20分钟不访问,再次访问就会比较慢,这是因为IIS默认的 idle timeout 是20分钟,如果在20分钟内没有一个访问,IIS 将回收应用程序池,回收应用程序池的结果就相当于应用程序被重启,所有原来的全局变量,session, 物理连接都将清空。回收应用程序池后首次访问,相当于前面我们看到的程序启动后第一次访问数据库,连接的建立时间将比较长。所以如果网站在某些时段访问量很少的话,需要考虑 idle timeout 是否设置合理。
PHP 好像没有现成的连接池可以使用,不过PHP经常和MYSQL搭伙过日子,利用MYSQL的内置连接池功能。
链接池注意要点就是 最大链接数和最小链接数,不要太大的差距。而且不要很频繁地释放链接回操作系统!
目前来说链接池对ORACLE来说,有一项功能没有实现,就是尽可能地把同一条相似的语句,分配在同一个链接上。这样就重复利用了SESSION_CURSOR_CACHE的参数。
第二大配置 系统大页内存。
目前的PC服务器基本上都是4GB以上的64系统。AIX和SUNSOARLAS 基本上配置好了大页内存,而LINUX6系列默认都是小页内存。
关于内存可以参考如下
因为系统存在着程序逻辑内存和真实的物理内存的映射关系,而这个关系需要用部分内存来保存起来。
而且是每个进程都需要一部分内存。内存的多少取决于程序使用的逻辑内存量。
虽然内存映射关系进行了4层以上的映射。不过也抵不住程序使用内存的野心。
最终导致内存表的变态的肥肥!
比如说 你有张100MB的数据库表,经过一年的运行和积累达到了1GB。每个回话,也就是每个链接,有个语句,自然是SQL全表扫描该表的语句,扫描1GB。那么该进程需要1GB逻辑内存地址和物理内存地址映射。
假设下,原来100MB需要1MB内存地址来保存映射关系,现在需要10MB了。
比如说我们现在有1500个数据库连接,加上连接池不重用连接线路的话,1500*10MB=14GB内存保存映射关系表!
有点夸张了! 不过我现在有个11.2.0.1 JAVA开发高级人员,觉得自己很牛鸡巴,自己搭建了ORACLE数据库。
结果连接池也没配,大页内存也没有配。 大约230个应用程序连接数,占了3.2GB的映射表(内存表) 系统总共才32GB 。
默认情况下LINUX是4K内存页大小的。 也就是说3.2GB除以4KB,大约有多少个页。我就不算,你可以算算看! 这么多页,CPU需要把它掉入到CPU寄存器中。所以CPU处理这活的话,累死了!
而LINUX 可以开启2MB的大页内存。这样的话CPU也轻松了,页表大小也少了。
第三大配置 数据库内存自动分配!
只从ORACLE开始人性化来,从ORACLE 9I开始,到目前的ORACLE 12C。基本上免除了大家辛苦,而有细致调整各个功能池的大小。现在12C自动完成。
最小分配单位是64MB。
这样的人性化工作,非常适合JAVA开发人员了使用,以前需要专职DBA来完成的工作,现在要么JAVA开发人员搞,要么运维工程师来搞。基本上连上网,照着网络配置下,启动了图形界面后就一路向西去了!
终于不需要DBA了,老子天下第一! 十八武艺样样精通!
很显然做为专业DBA来说,这话就咽不下去了! 那也没办法,咽下去,等你的数据库慢了后,再高价请我吧!! 哈哈。
专业DBA 一来 就PASS掉自动内存调整参数。
设置PGA多少,SGA多少。
SGA 中 DB_CACHE多少, SHARD_POOL多少,LARGE_pool多少,JAVA_POOL,STREAM_POOL多少。剩下的就交给SGA自动调整吧!
具体调多少,要参考上图 OLTP,OLQP,OLAP类型! 单机还是RAC
一般来说OLAP 需要大大的DB_CACHE。 而OLTP SHARD_POOL 就要很多,起码要跟DB_CACHE平分秋色。RAC当中的SHARD_POOL要超过DB_CACHE。
至于PGA+SGA 在整个内存的分配,一般参考80%系统内存! OLTP SGA>PGA 而OLAP PGA=SGA。
另外 数据库系统内存除了装监控代理比如说ZABBIX AGENT 外,禁止装其他应用程序!
比如说OEM或者说EM!
第四配置! 超线程
一般我是禁用掉超线程的。 超线程在PC BIOS 里面禁止。
为什么呢?
因为超线程,不是真的CPU内核,是利用CPU暂时空闲时间,虚拟的内核。
也就是在CPU空闲当中。利用它的空闲做其他的事情。而且当主活回来后,再还给它! 这里面涉及到了上下文切换。切换就需要时间,内存调度嘛!本来主活的数据保留在寄存器,一级缓存,二级缓存,乃至内存中。这下好了,被超线程给赶跑了,再把数据调回来就麻烦了。
所以超线程适合计算类型的应用。至于数据库嘛!大家都懂的,密集型IO操作!
苹果手机用户打赏区
理科精华
有想法请在这里留言-->