12

首先,有點背景。分佈式版本控制系統(DVCS)的許多比較比較了存儲庫的大小或運行的基準速度。我沒有發現任何能夠測試各種DVCS的網絡性能,以及使用的各種協議......除了測量涉及網絡的操作(命令)速度(如「克隆」,「拉取」/「取出」或「推送」)之外。如何測量網絡性能(如何基準網絡協議)

我想知道那你怎麼做這樣的比較;如何測量應用程序的網絡性能,或如何基準網絡協議。我在這裏想到的還包括測量性能對網絡帶寬和網絡延遲(ping時間)的依賴性;一些協議以更多往返交換(協商)的形式犧牲延遲來發送最少的所需最終「包」。

如果可能,我寧願只涉及一臺計算機的解決方案。我希望看到開源解決方案,在Linux上工作。但我也歡迎更通用的答案。

優選OS: Linux的
優選的語言: C,Perl中,外殼腳本


可能的測量:

  • 的總字節數從服務器傳送到客戶端,從客戶端到服務器裂變;這也可以用來測量協議(帶寬)
  • 數往返(連接)在一個事務(等待時間)的網絡操作的速度(時間花費克隆的
  • 依賴性/開銷(ping時間)

如何進行這樣的測量(如基準測試)?


添加2009年2月6日:
甲簡單的基準(測量)。將time命令的網絡版本,即,命令運行該會給我傳輸的字節數,並數往返/給定命令執行期間的網絡連接。


添加2009年9月6日:上面的time命令的網絡版本溶液提到
假想輸出可能看起來像以下:

$ ntime git clone -q git://git.example.com/repo.git 
... 
bytes sent: nnn (nn kiB), bytes received: nnn (nn kiB), avg: nn.nn KB/s 
nn reads, nn writes 

注意,這是隻是一個示例輸出,詳細描述了人們可能想要獲得的信息。


新增2009年9月6日:
看起來有些什麼,我想可以使用測試網絡協議Dummynet在,工具(原來)來來達到的......

+0

你問,如何獲得所需的數據,以便爲任意的網絡程序提出這樣的基準? – none 2009-06-05 21:27:12

回答

15

如果我正確理解你,對於網絡特定的系統調用,你基本上對Linux 'strace'Introduction)感興趣?

對於網絡應用程序(即'ntrace'),可能是探查器和調試器的組合,提供各種可選測量的詳細分析?

在Linux下,strace效用很大程度上基於由Linux內核提供的功能,即ptrace (process tracing) API:

使用ptrace的,它應該是能夠獲得大多數您感興趣的數據。

在Windows上,你可能會想看看detours爲了攔截/重定向Winsock API調用以進行檢查/基準測試。

如果你真的不需要那麼多低級信息,你可能也可以直接使用strace(在linux上)並且只用它來跟蹤某些系統調用,例如考慮下面這行只跟蹤調用到開放系統調用(使用附加-o FILE參數,可以將所有輸出到輸出文件重定向):

strace -e trace=open -o results.log

通過傳遞一個額外的-v標誌與strace,可以增加其詳細程度得到更多的信息(當使用由許多小型shell工具和獨立工具組成的git等SCM時,您可能還需要考慮使用-f標誌以便也遵循分叉過程)。

所以,你會是什麼興趣,是涉及到sockets所有的系統調用,即:

  • 接受
  • 結合
  • 連接
  • getpeername
  • getsockname
  • getsockopt
  • 的recv
  • recvfrom的
  • 發送
  • SENDTO
  • setsockopt的
  • 關機
  • 插座
  • socketpair

(在開始的時候,你可能只需要不過,請考慮處理send .../recv ...調用)

爲了簡化這個,你也可以使用「網絡」作爲參數跟蹤,這將跟蹤所有網絡相關的呼叫:

-e跟蹤=網絡:跟蹤所有網絡相關的系統調用。

所以,相應的strace的調用看起來是這樣的:

strace -v -e trace=accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,send,sendto setsockopt,shutdown,socket,socketpair -o results.log -f git pull

當程序運行完畢後,你會那麼主要是想檢查日誌文件,以評估數據,這然後可以通過使用正則表達式輕鬆實現。

例如,在運行時,在一個linux殼以下: strace -v -o wget.log -e trace=connect,recv,recvfrom,send,sendto wget http://www.google.com

所得日誌文件包含這樣的信息:

  • 的recv(3,「HTTP/1.0 302實測值\ r \ nLocation:htt「...,511,MSG_PEEK)= 511
  • sendto(4,」\ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3^\ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0「...,20,0,{sa_family = AF_NETLINK,pid = 0,groups = 00000000},12)= 20

查看這兩個系統調用的手冊頁,顯然511和20分別是傳輸的字節數。如果您還需要具體的時序信息,你可以通過-T標誌與strace:

-T - 在每個系統調用花費了打印時間

此外,你可以通過得到一些統計數據-c標誌:

-c:計算每個系統調用的時間,調用和錯誤並報告程序 exit的摘要。在Linux上,這會嘗試顯示獨立於掛鐘時間的系統時間(花費在內核中的CPU時間) 。如果-c與-f或-F(如下)一起使用,則僅保留所有跟蹤進程的總計 總計。

如果你還需要檢查處理的實際數據,你可能要考慮讀/寫說明符:

-e讀=集:執行所有的全十六進制和ASCII轉儲從指定集中列出的文件 描述符中讀取的數據。例如,要查看文件 描述符3和5上的所有輸入活動,請使用-e read = 3,5。請注意,這與通過選項-e trace = read控制的read(2)系統調用的正常 跟蹤無關。 -e write = set:對寫入到指定集中列出的文件 描述符的所有數據執行完整的十六進制和ASCII轉儲。例如,要查看文件 描述符3和5上的所有輸出活動,請使用-e write = 3,5。請注意,這與通過選項-e trace = write控制的write(2)系統調用的正常跟蹤 無關。

您還可以自定義字符串的最大長度:

-s了strsize:指定最大字符串大小打印(默認爲32)。需要注意的是 文件名不被視爲字符串,並且始終打印全

或者字符串轉儲爲十六進制:

-XX:打印十六進制字符串格式的所有字符串。

因此,使用strace的大部分如此,似乎是一個很好的混合方法,因爲它是很容易做到的,但還是有水平低一個很好的信息可用數量,如果你發現你需要額外的低您可能需要考慮擴展strace,或者使用strace project on sourceforge提交相應的功能請求。

但是,想一想更多的內容,實現一個相當簡單的網絡流量基準測試的一個較少涉及和更平臺不可知的方式將是在客戶端和實際服務器之間使用某種形式的中間層:a服務器基本上是測量,分析和重定向到真實服務器的流量。

非常像代理服務器(例如SOCKS),因此所有流量都通過分析器進行隧道傳輸,從而可以累積統計數據和其他指標。

這樣的基本版本可能很容易通過使用netcat和一些shell腳本放在一起,但更復雜的版本可能會受益於使用perl或python。

對於SOCKS服務器的python實現,您可能需要查看pysocks

此外,還有當然twisted爲蟒蛇:

Twisted是用Python寫的 並授權在MIT許可下的事件驅動的網絡引擎。

如果您確實需要更多的低級信息,那麼您可能真的需要考慮攔截系統調用。

如果您還需要協議特定的效率數據,則可能需要查看tcpdump

5

可能回答將使用SystemTap。在示例腳本中,有nettop,它以「頂級」方式顯示(一些)所需的網絡信息,並且有iotime腳本以所需的形式顯示I/O信息。