2017-03-24 165 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

相關問題