SQL SERVER2005做读写分离后性能反而下降???

fanzhouqi 2011-10-23 09:19:19
我的测试环境是这样的:
3台PC,配置都一样,A作为数据库发布服务器负责只写;B作为订阅服务器负责只读;C作为应用服务器,开一个ASP.NET页面进行测试,测试程序也跑在C上。
测试页面做的工作是在拥有4000条数据的表中select 50条数据,条件语句带了几个like用来吃性能。同时更新1000条数据的某个字段为随机产生的值(一条update语句)。
使用VS2010自带的负载测试,模拟250个用户并发访问,未使用读写分离前的测试结果图是这样的:

可以看到,系统的每秒请求数为151,平均页响应时间是3秒。

然后使用读写分离,即将查询语句连接到B服务器,update语句则使用A服务器。然后测试结果如下:

系统的每秒请求数骤降到33,平均页响应时间竟到了15.5秒

在测试过程中,我观察了A服务器中的数据库日志文件,发现日志文件激增的很厉害,3分钟就到了2G多,而不使用复制数据库时,10多分钟也就4M。而CPU的使用率一般都保持在50%左右,想来这个应该不是瓶颈。

有经验的朋友能不能帮忙解释一下,为何扩展后性能反而大幅度下降了?
...全文
616 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2011-10-25
  • 打赏
  • 举报
回复
复制是有一些很苛刻的前提
fanzhouqi 2011-10-25
  • 打赏
  • 举报
回复
数据库的恢复模式默认就是简单的,我觉得应该就是硬件配置过低的问题,7200r/m的IO吃不消,没法满足复制数据库的要求
guanjm 2011-10-25
  • 打赏
  • 举报
回复
第一个问题,你说日志文件变大
你先把发布服务器的数据库模式改成简单
然后根据UPDATE语句修改相关索引。
并且建议使用分区表。
第二个问题,速度变慢
我觉得你把订阅服务器的数据库模式也改成简单。
索引根据SELECT也重新建下。
==============================
这样你再测试下。
q465897859 2011-10-24
  • 打赏
  • 举报
回复
学习 帮顶
唐诗三百首 2011-10-24
  • 打赏
  • 举报
回复
A机到B机的复制是实时在传送的吗?

A机的复制不断在同步到B机上,导致B机IO繁忙,所以读取就慢了.

而且A机要分一部分性能给复制,所以写入也慢了.
唐诗三百首 2011-10-24
  • 打赏
  • 举报
回复
楼主的测试程序是不是先查询B后更新A?

我想性能是耗在不断的切换连接中吧?

如:建立对B的连接-->查询-->断开B连接-->建立对A的连接-->更新-->断开A连接->....

而且是"模拟250个用户并发访问",数据库用于管理连接的成本比较高.
fanzhouqi 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ap0405140 的回复:]

读不太懂楼主的2个贴图,
平均页响应时间怎么计算的, 图1何来3秒,图2何来15秒?
这2个图是针对读的还是写的程序?

建议用sql server或windows的性能监控工具试试.
[/Quote]
平均页面响应时间是 Avg. Page Time, 这是负载测试的实时监控图。
图片有点大,右边有一部分被吃掉了,可以在单独一个页面查看图片
唐诗三百首 2011-10-24
  • 打赏
  • 举报
回复
读不太懂楼主的2个贴图,
平均页响应时间怎么计算的, 图1何来3秒,图2何来15秒?
这2个图是针对读的还是写的程序?

建议用sql server或windows的性能监控工具试试.
fanzhouqi 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 perfectaction 的回复:]

你的硬件情况不符合读写分离提高性能的要求。
[/Quote]
这个有道理,我做的实验用的都是PC机,7200转的IO速度被吃死了。
另外,只有一台订阅服务器应该没关系吧,我就用一台承担所有的查询任务,多台的话不是更耗发布服务器的性能吗?
nzperfect 2011-10-24
  • 打赏
  • 举报
回复
读写分离的主要目的是提高主服务器的写的能力,并采用多订阅服务器提高读的并发能力。
所以必须要有一台分发服务器,必须要有多台订阅服务器。
nzperfect 2011-10-24
  • 打赏
  • 举报
回复
你的硬件情况不符合读写分离提高性能的要求。
1.你没有分发服务器
2.你只有一台订阅服务器

昵称被占用了 2011-10-24
  • 打赏
  • 举报
回复
1对1的读写分离肯定是增加了总的工作量的,因为你一份数据修改两个服务器都需要操作。
你读写分开的主要目的是什么,一般应该是解决大并发条件下的查询,而你模拟的却是不是很大的并发环境的大量修改操作,这是你的目的吗?
fanzhouqi 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ap0405140 的回复:]

A机到B机的复制是实时在传送的吗?

A机的复制不断在同步到B机上,导致B机IO繁忙,所以读取就慢了.

而且A机要分一部分性能给复制,所以写入也慢了.
[/Quote]
这个我可以想明白,但我想不明白的是数据库本身的发布订阅功能的开销如此之大,那它存在的意义何在?使用这个功能进行的读写分离就是为了提高系统的吞吐量,结果却带来负面效果,这究竟是我的错还是微软的错?
fanzhouqi 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]

如果是大数据量的update,insert操作,则会增加大量的日志文件和数据文件.
建议你把相关索引重建一下.
[/Quote]
问题是我没有进行数据库复制的时候,日志文件增长很小,测试程序也都是一样的。
dawugui 2011-10-23
  • 打赏
  • 举报
回复
如果是大数据量的update,insert操作,则会增加大量的日志文件和数据文件.
建议你把相关索引重建一下.
fanzhouqi 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]

A服务器的读写是不是很频繁 大量的读写是会产生很多日志的
[/Quote]
A服务器是发布服务器,只负责写操作,一次请求update 1000条数据
--小F-- 2011-10-23
  • 打赏
  • 举报
回复
A服务器的读写是不是很频繁 大量的读写是会产生很多日志的

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧