Winsock closesocket()性能(本地计算机,127.0.0.1):为什么某些计算机上这么慢,而其他计算机超快?

时间:2011-10-08 10:29:52

标签: c# database performance sockets winsock

我正在努力解决与在C#代码中关闭数据库连接相关的奇怪性能问题。我们在本地计算机上使用一个名为Raima的数据库服务器(只有本地TCP连接127.0.0.1到同一台计算机上的本地数据库服务器,而不是通过局域网)通过其本机Raima API(不是ADO.NET,只是一个.NET)包装器)。

问题在于,在许多计算机(高性能双核或四核计算机)上,大多数情况下关闭大约需要120ms-250ms(例如,在.NET C#Web服务中为120ms,在.NET中为250ms) C#Windows应用程序)而在其他计算机上它只需要4毫秒(稳定)。令我困惑的是,在某些计算机上,例如,大部分时间是120毫秒,但有时可能会跳到4毫秒。

我们的数据库供应商(Raima)告诉我们他们无法做任何事情,因为这些减速是由Winsock方法closesocket()引起的。

所以我的问题是,Winsock closesocket()是否可能导致本地计算机上的这类速度减慢?或者,它毕竟是关于数据库供应商及其慢速数据库驱动程序/服务器?

谢谢!

2 个答案:

答案 0 :(得分:0)

我建议你使用性能工具/压力tess工具测试你的raima(你称之为);使用网络工具测试您的网络;使用其他数据库(免费版的SQL服务器,IBM DB2,MySQL,Oracle等)安装您的计算机并尝试连接它并计算其性能。 AFAIK它不是winsock实现,它是计算机配置。如果所有数据库都减速,那么你可以怀疑winsock。 如果一切都很慢,也许你可以提到升级硬件。 如果除了raima之外的所有都很快。你可以怀疑raima数据库很慢。 如果您一如既往地断开连接有困难,只需更换LAN电缆即可。

答案 1 :(得分:0)

我的名字来自Raima的杰森。希望您在2011年收到我们关于此问题的电子邮件,但对于遇到此性能问题的任何其他人,我们将解释如何解决此问题:

性能问题出在closesocket()中,并解释说我们无法对此做任何事情。紧接着,我们的一位工程师发现我们正在使用SO_LINGER选项,这会导致closesocket()被阻塞,直到所有未完成的数据在返回之前被发送。我们在2011年10月11日删除了此选项并发送了一个补丁。关闭SO_LINGER后,closesocket()函数仍会在关闭套接字之前发送未完成的数据,但在此操作完成之前可能会返回。在大多数情况下,补丁改善了性能。