作者:叶葳蕤1095190287 | 来源:互联网 | 2023-05-17 18:46
基本已经确定生产环境至多是PC服务器,不会超过几十万吧,IO性能是相当有限的,加上数据表少,就两张,已经用顺序结构全预读了(直接用用户ID索引,不会比这个更快了,ID上限是百万级的,至多消耗几百MB内
基本已经确定生产环境至多是PC服务器,不会超过几十万吧,IO性能是相当有限的,加上数据表少,就两张,已经用顺序结构全预读了(直接用用户ID索引,不会比这个更快了,ID上限是百万级的,至多消耗几百MB内存),同步回写机制方面也已经考虑周全,数据读取这块应该不是瓶颈了。
还采用了“预计算”机制,通过设计交互协议,让本地的计算基本能够不依赖请求的数据,服务器空闲的时候就用“预计算”生成了多条候补数据,请求过来直接回复。
通过这样的设计让服务器的处理请求能力最大化了,目前测试只要“预计算表”还有数据候补,速度瓶颈就是千兆网卡(用WSAEventSelect模式的UDP,这一块暂时不想用更高级的,性能提高不了太多的),可以说处理性能已经优化到极限了。
问题主要是同步回写这块,数据库回写速度有限,
“预计算表”定的很大的话,我有意制造持续的峰值请求会造成数据回写队列严重积压,内存占用升高。odbc驱动的性能相对来说比oracle原厂提供的连接方式是要慢的,数据库方面我不太熟悉,没用过oracle原厂的,odbc相对能慢多少呢?
如果说不是慢一个数量级或许多倍,而仅仅是慢几成,就算了,现在效率是够的,而且我开发机器还懒得装笨重的oracle呢,现在一直利用着odbc的通用性,装轻量级的MySQL在开发……只是觉得我为了oracle的回写慢去刻意限制精心设计的数据预读和处理流程的速度防止爆内存,有点不爽,比如我会限制较小的预计算条数,预计算候补用完了,处理速度自然降下来(因为有硬件加密卡,即便用多块也是明显瓶颈),也给了oracle喘气的时间。
如果确实快一个很多,我考虑换oracle原厂连接,网上的测试数据很多不靠谱,就和编程语言的效率评测一样。
或者大家针对这个问题还有什么其他点子。
强调一下,数据表是极其简单的,可能和某些本科生的课程设计复杂度都差不多,数据索引和SQL语句优化基本没有什么空间,ODBC层级的优化已经做了。NoSQL之类的我推荐过,但需求方坚持oracle,说是“放心”。因为这是一个专用通信系统的鉴权服务器,电信级的,数据安全很重要的,需求方可能会购买全套的oracle数据安全技术和服务(数据热备等)。
15 个解决方案
简单点说,就是想在一台比高档PC强不了多少的服务器硬件上,尽量实现最高的处理速度……
我们现在用的测试服务器,机架式,价格应该就几万吧,最多不超过10万,4个CPU,每个4核,32GB内存,确实不比那些工作站级的台式PC强到哪里去
另一台更矬,2个CPU,每个四核,4GB内存,比开发用机i5+4GB都好不了多少,只是这台准我乱搞
楼主,有没有尝试用用OTL这个库呢,它直接封装好了OCI。
学习某人上个几G内存
ODBC的驱动也没那么慢吧,反正我没比较过
看你的描述,你的缓存机制好像是write through,如果用write back机制会怎么样?还有,数据缓存可以多做几级,一级缓存放内存,二级缓存放磁盘.磁盘要换出时才写回.
至于数据访问的性能,ODBC的应该可以做到基本和原生API持平的.除非原生API有专门处理海量数据的特殊方法.这个没有研究过...或者你可以在应用服务器端把数据压缩打包,交由数据服务器直接处理,以减少通信瓶颈的压力.这应该可以提高很多的性能.如果你的瓶颈是数据服务器的处理能力,那就只有换硬件了.呵呵
你的数据结构和处理方式不明确,很难帮你想什么其它的办法.
>
本身数据库已经全预读了,对数据库只有写操作,数据库本身的后写缓存应该就能起到二级缓冲的作用
你没理解我说的重点.根据你的描述,瓶颈应该是在写数据库这个交互过程中.那就要想办法消除这个过程.我说的write back以及磁盘缓存机制,就是为了在应用服务器端做更多的写入合并,以减少和数据库交互的过程.
>odbc真的和原生api一样?我看了许多说法都说odbc在M$提供的的通用接口里都算慢的
odbc的性能和具体驱动的实现有关.Oracle的ODBC驱动到底性能如何,我也不知道.只是想当然的认为,是可以实现出与原生API性能差不多的驱动的.因为ODBC的封装层次足够简单,MS根本就没做什么事.
因为不知道你做数据写回是怎么实现的,所以没法确定怎么优化.我在上面提出,最好把数据压缩打包,交由数据服务器实现写回的动作,就是为了避免应用服务器端执行查询产生的复杂交互动作.比如:你把100条要写回的数据组织成XML,然后在数据库服务器上用存储过程解析,写入.肯定比100条数据分别在应用服务器端写入来得快得多.因为打包写入只产生一次查询交互,分别写入则会产生100次.如果你能把数据再压缩成2进制的,还能极大得减少应用服务器和数据服务器的交互数据量.