我们正在使用非常强大的Oracle 11G机器。 有冗余存储等,这是从我所告诉的一个野兽。
我们刚刚拿到这个数据库作为一个工具,当我第一次作为一个合作社有20人使用,现在超过150人。 我是唯一一个工作在:(
我们目前有一个系统,可以在整个数据中心分配PERL脚本,从而为我们提供了一种“网格”计算能力。
Perl脚本运行一种模拟并将结果报告给数据库。 他们做select/插入。 每个脚本的负载不是很高,但可能同时发生在20-50个系统中。
然后,我们有多个数据中心和用户都使用同样的方法来访问同一个数据库。
我们的主要问题是,我们的数据库连接超载,不得不放弃一些。 我们有时有500个以上的连接。 这些是perl脚本,它们不能很好地处理这个问题。 基本上他们失败了,结果就失去了。 我宁愿避免重写很多这些,因为它们写得不好,而且甚至是头疼的。
数据库本身没有被重载,只是连接开销太高。 我们打开一个连接,快速查询,然后删除连接。 很短的连接,但其中很多。 数据库团队基本上说我们需要降低连接数量,否则他们会忽略我们。
因为这是分布在我们的农场,我们不能实现持久连接。 我用我们的networking服务器来做这件事。 但是它在一个固定的系统上。 其他的是由分发工具打开和closures的perl脚本,因此并不总是运行。
我最好的办法解决这个问题? 脚本本身可以等待连接打开。 他们不需要立即采取行动。 某种排队系统?
我被build议设置一个名为“SQL Relay”的工具的一些实例。 也许每个数据中心都有一个。 这个工具有多可靠? 这种方法有多好? 它会为我们所需要的工作吗?
我们可以为每个数据中心提供一个数据中心,并通过数据中心将请求转发到我们的主数据库,保持一个开放的持久连接pipe道 这有道理吗?
还有其他的build议吗? 有任何想法吗? 任何帮助将不胜感激。
可悲的是,我只是一个在一个非常大的公司工作的合作社的学生,不知何故,所有这一切都落在了我的肩膀上(没有人可以要求帮忙;它是一家硬件公司,每个人都是硬件工程师,数据库团队是无用的在印度),而我最好的方法是什么?
我极度劳累过度,这个问题干扰着进步,基本上需要尽快解决; 最好不用改写整个系统,购买硬件(不会发生),或者在脚下自我射击。
帮助哈哈!
“我们打开一个连接,快速查询,然后断开连接,很短的连接,但很多。
我想尝试与共享服务器连接。 运行在unix机器上的Oracle需要一个unix进程来完成会话请求的“工作”。 通常,在专用连接的情况下,当会话连接时会分叉新的unix进程,并在会话断开连接时将其终止。
在共享服务器下,DBA定义了最小和最大连接数,例如100和250.在启动时,数据库分出100个进程,并且他们坐在那里等待连接。 如果获得150个请求,则会激发所需的额外50个进程。 如果有300个请求,则其中有50个将挂起,直到250个(最大)进程中的一个可用。
重要的是,这些过程并不是绑定到会话生命周期的特定会话,而是仅限于特定的调用(例如单个插入或更新)。 这确实对内存使用有一些影响。 调用之间保留的任何东西必须在共享内存(SGA)而不是进程内存(PGA)中。 然而,在11g以下,数据库可以将内存移到SGA和PGA,这样就不会像以前那么大了。
在这里阅读更多
如果增加连接数量,您是否已经加载了testing系统? 如果你有一个单独的环境来testing这将是一件好事。
在短期内,如果您能够控制执行脚本的时间,则可以对其进行pipe理,以便您无需在任何给定时间固定连接。 相反,您可能会随着时间的推移将其拖出。 你说脚本可以等待连接,我想说这似乎是最好的开始。
我想也可以通过查找最长执行的查询来查找性能改进。 通过向可能不被索引的表添加索引来find改进是可能的。
你需要一些数据来解决这个问题。 你有Oracle企业pipe理器吗? 它会经常告诉你你需要做什么。 没有这个,你需要包含脚本获得的错误信息,以及同时显示在警报日志中的任何信息。 在Oracle世界中,500个连接并不是很多,但是可能需要增加configuration参数。
从Oracle连接/断开连接非常昂贵,并且在正常的Oracle统计视图中不会跟踪资源使用情况。 你可以在v $ system_time模型的连接时间内在一定程度上看到它,但是我已经看到了这种情况,这是closures的四倍。 只是通过一个球场的数字 – 有几个连接一秒钟可以很容易地烧完整的核心100%。
如果你有CPU烧,一般情况下,除了你正在引入延迟。 解决scheme是使用会话池,即创build一组到数据库的连接,并有一层代码pipe理谁使用这些连接。
Oraclemultithreading服务器不过是甲骨文公司的黑客解决scheme,而且交付的数据less于人们对名称和市场营销的期望。