我们有一个.Net应用程序,它分布在6个本地服务器上,每个服务器都有一个本地数据库(ORACLE),1个主服务器和1个负载均衡机.请求来到负载均衡器,负载均衡器将传入的请求重定向到6个本地服务器之一.在某些时间间隔内,数据在主服务器中收集并重新分配到6个本地服务器,以便能够使用完整数据做出决策.
每个本地服务器都有一个缓存组件,它根据不同的参数(位置,传入参数等)缓存传入的请求.对于每个请求,本地服务器决定是转到数据库(ORACLE)还是从缓存中获取响应.但是,在这两种情况下,本地服务器都必须转发数据库,以便为每个请求执行1次插入和1次更新.
在高峰期,每个本地服务器每秒接收2000个请求,系统开始减速(CPU:90%).我想在添加另一台本地服务器之前增加容量.在运行一些基准测试后,瓶颈一如既往,似乎是每次请求数据库不可避免的1次插入和1次更新.
为了降低频率,我创建了一个位于DB和.NET应用程序之间的Windows服务.它包含一个管道服务器,并从主.NET应用程序接收每个插入和更新,并将它们保存在Hashtable中.然后,新服务以特定时间间隔进入数据库一次,以进行批量插入和更新.关键是要不那么频繁地去数据库.虽然这有一个积极的影响,但它并没有像我预期的那样有益于系统负载.大多数cpu负载来自oracle.exe,因为每秒请求数增加.
我试图避免尽可能多地访问数据库,避免DB的唯一方法似乎是增加缓存命中率,而不是我尝试的上述解决方案.我的缓存命中率目前约为81%.因为每个本地计算机都有自己的缓存,所以我实际上缺少许多可缓存的请求.当两个类似的请求重定向到不同的服务器时,第二个请求无法从第一个请求的缓存结果中受益.
我在系统架构方面没有很多经验,所以我很感激这个问题的任何帮助.欢迎任何有关不同缓存架构或设置或任何工具的建议.
提前谢谢你,希望我明白我的问题.