2017-03-24 136 views
0

我有一个客户端服务器应用程序,我试图优化。 我建立了一个psydo-client来对付我的服务器的apis。 我在一个盒子上运行客户端&在另一个服务器上。 我试图关联在每个本地系统的本地系统时钟方面记录时间的两个时间之间的某些事件的时间。 客户端发送请求并记录该时间。 服务器收到该请求并记录该时间。 服务器是否处理表单/发送响应,记录该时间。 客户端记录它完成接收响应的时间。c#WCF客户端服务器消息传递/事务优化

最终,我试图做的是提高通过量,通过客户端的请求发送和响应收到。

我错过了什么,试图有意义地关联两个系统上的时钟?这甚至有可能吗?如果是这样怎么办?你如何衡量/改进这个通过量?

目前,我的客户告诉我,我每秒接收的请求发送响应数为25(或平均间隔0.04秒),用于19,000+次交易。 但服务器上的两个时间戳记告诉我,我正在转向一个事务,请求接收到响应 - 平均响应时间为0.020秒(扩展容量〜最大:50个事务/秒) 含义1/2开始到结束的时间是数据'在线'(以称赞Vince Vaughn)。 如果我不得不把线上的时间看作是固定的,并且只能优化服务器的周转时间,并且假设我可以将其减少到0,那么我的最大吞吐量不会超过每秒50个事务。 我想这可能会减少到1/100。对于1G网络来说,只有50次交易/秒似乎疯狂缓慢,因为1G网络只有一个数据包需要传输一个交换机,整个长度大约为50英尺。

那么如何关联两个系统时间? 你如何衡量这个通过量?

回答

0

去过那里,这就是我所做的。

让客户端记录请求发送时间并将其发送到服务器。 服务器收到服务器计算出的客户端报告的TimeSpan和服务器自己的DateTime.Now

在服务器记录它相对于TimeSpanDateTime.Now.减去(tsVariable); 在“客户的”时钟的方面可以(轻微*)认为服务器记录时代的时代。

您需要Subtract的区别,因为如果服务器的时钟稍微超前于客户端,那么减去差异以使服务器的DateTime.Now更接近地反映客户端的相对DateTime.Now。在这种情况下,TimeSpan将是(+)正值。如果服务器的时钟稍微落后于客户端,则TimeSpan将为( - )负值。但仍然减去TimeSpan。这将是所谓的“减去负数”,这与添加TimeSpan以捕获服务器的DateTime.Now直到相对客户端的DateTime.Now相同。

当响应回到客户端时,让客户端再次记录它自己的时钟以记录最终的响应。服务器不需要将时间报告给客户端。

*缺点是当客户端首次开发要向服务器报告的内容和服务器收到该报告时计算TimeSpan的滴答时间之间的滴答滴答声并不是任何一方都知道的。但是我不得不相信,这不是过分的结果,或者至少不是务实的意义。

我玩过的另一个场景是客户端首先得到服务器的时间。这应该尽可能地表达超级表达。 让客户计算TimeSpan,在记录和向服务器报告时使用它,....您可能会发现这种努力水平并没有提供很多好处。

一个高端选项是第三个系统为您记录其他两个系统的时间,它将不断记录两个系统之间的时间差,并且它自己的时钟和/或调整两个系统上的时钟。

2

这是一个非常酷的测试 - 你的技术听起来像是一个很好的解决方案。

您是否在某处保存日期&次答案?难道是时差(0.04 &分别为0.02秒)是由于记录这些日期需要多长时间?也就是说,如果你保存到数据库中,例如,由于类似带索引的大表等,插入/更新可能需要一些时间才能完成。

编辑 我尝试以下方法使用WCF服务器&客户端在同一台机器上运行的模拟 - 以排除WCF本身可能是出于某种原因很慢。这似乎并非如此,我只能建议尝试,如果事件日志可能会导致延误找出的情况下,或者如果确有您的网络设置一些奇怪的滞后

我的服务器代码:

public interface IServiceWCF 
{ 
    [OperationContract] 
    DateTime TestConnectionSpeed(DateTime messageSentFromClientTime, out DateTime messageReceivedAtServerTime, out int millisecondsBetweenClientSentAndServerReceived); 
} 

public class ServiceWCF : IServiceWCF 
{ 
    public DateTime TestConnectionSpeed(DateTime messageSentFromClientTime, out DateTime messageReceivedAtServerTime, out int millisecondsBetweenClientSentAndServerReceived) 
    { 
     messageReceivedAtServerTime = DateTime.Now; 
     TimeSpan span = messageReceivedAtServerTime - messageSentFromClientTime; 
     millisecondsBetweenClientSentAndServerReceived = (int)span.TotalMilliseconds; 
     return DateTime.Now; 
    } 
} 

我的客户端代码

int millisecondsBetweenClientSentAndServerReceived; 
DateTime clientSent = DateTime.Now; 
DateTime serverReceived; 
DateTime serverSent = wcfService.TestConnectionSpeed(clientSent, out serverReceived, out millisecondsBetweenClientSentAndServerReceived); 
DateTime responseReceived = DateTime.Now; 
TimeSpan span = responseReceived - serverSent; 
int millisecondsBetweenServerSentAndClientReceived = (int)span.TotalMilliseconds; 

Console.WriteLine("Message sent from client at {0} - server received {1} milliseconds later at {2} - server response sent at {3} - was received at client {4} milliseconds later at {5}", 
    clientSent, 
    millisecondsBetweenClientSentAndServerReceived, 
    serverReceived, 
    serverSent, 
    millisecondsBetweenServerSentAndClientReceived, 
    responseReceived); 

而答案大多是非常快的 - 1毫秒 - 看样输出:

Message sent from client at 3/24/2017 3:56:22 PM - server received 1 milliseconds later at 3/24/2017 3:56:22 PM - server response sent at 3/24/2017 3:56:22 PM - was received at client 1 milliseconds later at 3/24/2017 3:56:22 PM 
+0

不意味着作为垃圾埠我会建议你的回应是一个后续评论,而不是一个问题。但是,我很欣赏这种回应,我很高兴在这里继续与你交谈。跟进你的问题。双方都将录制到两个单独的本地SQL服务器中。但是记录的时间来自c#代码,而不是SQL的时间戳记。是的,至少在服务器端,您所考虑的所有这些延迟都纳入了两个客户端时间戳。仅分析两个客户端时间戳就显示0.04个交易/秒。 – Steve

+1

注意到后续评论 - 但很抱歉,我的评分太低,不能评论你的问题;) – Thys

+0

大声笑。我不知道评级必须超过这么多评论。似乎颠倒。你应该可以评论但不能回答。答案意味着一些评论没有的专业知识。 – Steve

相关问题