我们正在使用功能非常强大的 Oracle 11G 机器;具有冗余存储等。据我所知,它是一头野兽。
我们刚刚为一个工具获得了这个数据库,当我第一次加入合作社时,大约有 20 人使用它,现在有 150 多人使用它。我是唯一一个使用它的人 :(
我们目前已建立了一个系统,可将 PERL 脚本分发到整个数据中心,从本质上为我们提供一种“网格”计算能力。
Perl 脚本运行某种模拟并将结果报告回数据库。它们执行选择/插入。每个脚本的负载不是很高,但可能同时在 20-50 个系统中发生。
然后,我们有多个数据中心和用户都使用相同的方法访问同一个数据库。
我们面临的主要问题是我们的数据库连接数过多,不得不删除一些连接。有时我们的连接数多达 500 个。这些是旧的 perl 脚本,处理起来不太好。它们基本上会失败,结果也会丢失。我宁愿避免重写很多这样的脚本,因为它们写得不好,甚至看一眼就让人头疼。
数据库本身并没有超载,只是连接开销太高了。我们打开一个连接,进行快速查询,然后断开连接。连接非常短,但数量很多。数据库团队基本上说我们需要降低连接数量,否则他们会忽略我们。
由于这是分布在我们的农场中的,因此我们无法实现持久连接。我使用我们的网络服务器来实现这一点;但它位于固定系统上。其他的是 perl 脚本,它们由分发工具打开和关闭,因此并非始终在运行。
解决这个问题的最佳方法是什么?脚本本身可以等待连接打开。它们不需要立即采取行动。某种排队系统?
有人建议我设置几个名为“SQL Relay”的工具实例。也许每个数据中心一个。这个工具有多可靠?这种方法有多好?它能满足我们的需要吗?
我们可以为每个数据中心设置一个,并通过它将请求转发到我们的主要数据库,从而保持开放的持久连接管道?这有意义吗?
您还有其他建议吗?有什么想法吗?任何帮助都将不胜感激。
可悲的是,我只是一个在一家非常大的公司工作的实习生,不知何故,所有这一切都落在了我的肩上(实际上没有人可以寻求帮助;这是一家硬件公司,每个人都是硬件工程师,数据库团队毫无用处,而且在印度)我很迷茫,最好的方法是什么?
我工作极其繁重,这个问题妨碍了正在进行的进展,基本上需要尽快解决;最好不要重写整个系统,购买硬件(不会发生),或者搬起石头砸自己的脚。
救命啊哈哈!
答案1
“我们打开一个连接,进行快速查询,然后断开连接。连接很短,但数量很多。”
我会尝试使用共享服务器连接。在 unix 机器上运行的 Oracle 需要一个 unix 进程来执行会话请求的“工作”。通常,在专用连接下,它会在会话连接时分叉一个新的 unix 进程,并在会话断开连接时终止该进程。
在共享服务器下,DBA 定义最小和最大连接数,例如 100 和 250。启动时,数据库会派生出 100 个进程,它们会在那里等待连接。如果它收到 150 个请求,它将启动所需的额外 50 个进程。如果它收到 300 个请求,其中 50 个将一直等待,直到 250 个(最大)进程中的一个可用。
重要的是,进程不会在会话的整个生命周期内与特定会话绑定,而只会与特定调用(例如单个插入或更新)绑定。这确实会对内存使用产生一定影响。调用之间保留的任何内容都必须位于共享内存 (SGA) 中,而不是进程内存 (PGA) 中。然而,在 11g 下,数据库可以在 SGA 和 PGA 之间移动内存,因此这不再像以前那么重要了。
阅读更多这里
答案2
如果增加连接数,您是否对系统进行了负载测试?如果您有一个单独的环境来测试这一点,那将是一件好事。
短期内,如果您能够控制脚本的执行时间,那么您可能能够管理它,这样您就不需要在任何给定时间固定连接。相反,您可能能够将其拖延一段时间。您说脚本可以等待连接,我认为这似乎是最好的起点。
我认为,通过找出执行时间最长的查询,也可以找到性能改进方法。也许可以通过向可能未建立索引的表添加索引来找到改进方法。
答案3
您需要一些数据来弄清楚这一点。您有 Oracle 企业管理器吗?它通常会告诉您需要做什么。如果没有它,您需要同时包括脚本收到的错误消息以及警报日志中显示的任何内容。在 Oracle 世界中,500 个连接并不多,但可能需要增加配置参数。
答案4
连接/断开 Oracle 连接的成本非常高,而且资源使用情况无法在普通 Oracle 统计视图中跟踪。您可以在连接时间下的 v$system_time 模型中看到某种程度的这种情况,但我见过这种情况偏离了四倍的情况。举个大概的数字——每秒进行几次连接很容易将整个核心消耗到 100%。
如果您有足够的 CPU,一般来说没问题,但会引入延迟。解决方案是使用会话池,即创建一组到数据库的连接,并有一层代码来管理谁使用这些连接。
Oracle 多线程服务器只是 Oracle 提供的一种黑客解决方案,其功能不如人们从名称和营销中期待的那样。