暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

<Oracle优化新常态>第三章 三大配置

IT界数据库架构师的漂泊人生 2017-07-10
195

祖仙教

祖仙的神话

祖仙教


前期节要

<Oracle优化新常态>第一章

《Oracle优化新常态》第二章强拆(1)

《Oracle优化新常态》第二章强拆(2)



这张图是我们第二章进行的强拆三层空间的方法图。

本章不是再讲拆分,当为了加强大家的印象,每次都会贴本图。


今天我们将重要的三大配置,分别应用程序端,系统端,数据库端。

因为这三大配置,经常导致性能问题,而且很重要的问题!


第一大配置 应用程序连接池配置

因为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 =

    "server=.;uid=sa;pwd=tcaccp;database=pubs;pooling=true;min pool size=5;max pool size=10"

    其中 pooling 表示是否打开连接池,默认为打开,关掉时需要 pooling = false;

    min pool size 表示连接池最少保存几个连接对象;

    max pool size 表示连接池最多保存几个连接对象。(最大值不能为 0,也不能小于最小值)

    配置好以后,通过 SqlConnection con = new SqlConnection(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系列默认都是小页内存。

关于内存可以参考如下

Linux 64 页表,进程内存,大页

Linux_x86_64BIT内存管理与分布

部分SWAP 内存知识


因为系统存在着程序逻辑内存和真实的物理内存的映射关系,而这个关系需要用部分内存来保存起来。

而且是每个进程都需要一部分内存。内存的多少取决于程序使用的逻辑内存量。

虽然内存映射关系进行了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操作!



苹果手机用户打赏区

理科精华

RAC crs_stat 命令结果完整显示

归档日志比在线日志小

分区表

INDEX肥胖化

OracleDG 备库 STANDBY 日志传输小结

ORACLE索引名称矫情

ASM中的几个概念

抓取性能不错的脚本

RMAN duplicate 方式做个备库

direct path read

共享池内存三维

PGA内存

一个性能优化案例INSERT

SGA内存

Linux 64 页表,进程内存,大页

Linux_x86_64BIT内存管理与分布

部分SWAP 内存知识

理解队列锁

ORACLE闪回之闪回查询

ORACLE 闪回之闪回删除

ORACLE闪回之闪回表

ORACL 闪回功能之闪回数据库

ORACLE 索引全扫描逻辑读

解析过程中的软软解析

ORACLE索引范围扫描逻辑读ARRAY

UNDO

归档日志比在线日志小

RAC 修改 IP

RAC

ASM 再平衡

RAC安装

使用UDEV绑定ASM盘符

网络命名关系图


RAC 修改私有网卡IP

RAC私网修改错了咋办

只有数据文件情况下恢复数据库

 



      有想法请在这里留言-->

最后修改时间:2020-10-12 12:18:11
文章转载自IT界数据库架构师的漂泊人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论