如果我正確理解你,對於網絡特定的系統調用,你基本上對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。
你問,如何獲得所需的數據,以便爲任意的網絡程序提出這樣的基準? – none 2009-06-05 21:27:12