2010-05-25 73 views
1

我正在構建我正在構建的通信中間件中的延遲測量。我的工作方式是我週期性地從我的發佈應用程序發送探測消息。訂閱應用程序會收到此探針,將其緩存,並在選擇時發回回聲,注意msg保持「保持」狀態的時間。訂閱應用程序接收這些回波並計算等待時間爲(now() - time_sent - time_on_hold)/ 2。測量窗口上的交叉過程延遲

這種工作方式,但當「保持時間」大於0時,數字差別很大(3x)。也就是說,如果我立刻回覆msg,我會在我的開發環境中得到50us左右,如果我等待,然後發送msg回到150us時間(儘管我可以隨時隨地打折)。我使用QueryPerfomanceCounter進行所有測量。

這是所有內一個單一的Windows 7盒。我在這裏錯過了什麼?

TIA。

+0

你們是不是要確定「在線'延遲時間?你會不會更好地嘗試使用ICMP數據包併爲此進行ping? – 2010-05-25 16:06:17

+0

我實際上試圖確定完整的堆棧延遲,即應用程序,內核和網絡。 – samwise 2010-05-25 17:27:05

回答

0

好吧,我已經編輯我的答案,以反映您的回答:對不起慢了,但我沒有注意到你已經通過創建一個答案對這個問題的闡述。

這似乎在功能上你沒有做錯什麼。

我認爲,當你的本地主機條件之外發布應用程序,附加的100us(如果它確實是大致不變)將小巫見大巫至正常工作的網絡的平均延遲。

爲了回答你的問題,我認爲在服務器端有一個線程/中斷調度問題需要調查,因爲你似乎沒有對客戶端做任何事情沒有考慮。

嘗試使用以下測試方案:

  • 發送兩個探針到客戶端A和B.(所有本地主機)
  • 後發送探測到 '客戶B' 一秒鐘(或X/2秒)將探頭髮送到客戶端A.
  • 確保「客戶機A」兩秒鐘(或X秒)等待和「客戶B」等待「一第二(或X/2秒)

的想法有希望的是,兩個客戶都會發送bac他們的探測器在大致相同的時間以及睡眠/等待(執行暴露問題的動作)之後都會回答。我們的目標是試圖讓客戶迴應'喚醒'發佈商,看看下一個客戶的答案是否會立即處理。

如果這些返回探測器中的一個顯示anomily(最有可能的第二反應)它可以指向一個事實,即出版商線程從睡眠週期醒來(在recv的第一個性反應),並立即可用處理第二個響應。

再次,如果事實證明,所述100us的延遲是大致不變,這將是1毫秒+ -10%,這是適合於現實世界的網絡條件的時間表。

+0

我不確定我遵循你的推理。即使響應線程進入睡眠狀態,我也會測量第一次獲取探測MSG和發送回覆之間的時間,並從總時間中減去該時間。我正在使用Upd,因此沒有連接設置/拆卸。 – samwise 2010-05-27 10:45:58

+0

你在發佈方面如何計算'now()'? – 2010-05-27 11:06:24

0

多一點信息。我使用下面的測量時間:

static long long timeFreq; 

    static struct Init 
    { 
     Init() 
     { 
     QueryPerformanceFrequency((LARGE_INTEGER*) &timeFreq); 
     } 
    } init; 

    long long OS::now() 
    { 
     long long result; 
     QueryPerformanceCounter((LARGE_INTEGER*)&result); 
     return result; 
    } 

    double OS::secondsDiff(long long ts1, long long ts2) 
    { 
     return (double) (ts1-ts2)/timeFreq; 
    } 

在出版方面我做這樣的事情:

Probe p; 
p.sentTimeStamp = OS::now(); 
send(p); 
Response r = recv(); 
latency=OS::secondsDiff(OS::now()- r.sentTimeStamp) - r.secondsOnHoldOnReceiver; 

而在接收端:

Probe p = recv(); 
long long received = OS::now(); 
sleep(); 
Response r; 
r.sentTimeStamp = p.timeStamp; 
r.secondOnHoldOnReceiver = OS::secondsDiff(OS::now(), received); 
send(r); 
+0

請參閱下面的答案。 – 2010-05-28 11:52:19