系统迁移到AWS上(Web+WCF+RDS),果断采用的RDS sql server , 不想再花费精力及备份数据库。 但从一开始 WCF连结RDS 就不定时爆出如下Error:
(provider: TCP Provider, error: 0 - The semaphore timeout period has expired
在AWS forum 上发了咨询贴 ,也咨询了AWS 专家,回复一般是优化sql ,但我看看数据库资料,虽然加了一些index,但error持续,并且数据量还远不到要深度优化的地步。并且以前运行在机房时都是好好的,难道只能升级RDS DB 到large(只有RDS数据库级别比原先差),但目前RDS CPU ,connection,IPOS 都还很正常,不想花那冤枉钱。
Google "semaphore timeout" 发现这是windows 网络issue ,参见:
http://support.microsoft.com/kb/325487?wa=wsignin1.0
但部署在AWS 上的EC2 可控的只有操作系统了,在Aws forum逛了很久很久,终于发现新的关联贴
https://forums.aws.amazon.com/thread.jspa?messageID=477159
正解如下 :
IPv4 checksum offload - disable
large receive offload - disable
large send offlaod - disable
tcp checksum offload - disable
上图:
结果 : 目前已运行近一周,还未出现此error ,看来有效,还会持续观察。
此设定的用意是让网卡硬件自己计算校验和,而不是交给操作系统的 tcp/ip 协议栈来计算。看来Ec2 Windows instance 有些Bottleneck ,也可能操作系统需要更改一些设定项吧(待查)。
当然如果你的数据库达到百万级或者更高,也需考虑优化sql。