2010-09-25 49 views
1

我是套接字編程的新手,我已經爲使用epoll的服務器編寫了代碼。基本上它會等待接受任何客戶端連接,並且如果可以從其他來源獲得數據,它將向客戶端發送數據。Linux套接字編程測試

我需要測試當有多個連接請求和服務器正在向多個客戶端發送數據時,服務器的性能如何。我的問題是,如何模擬來自服務器的多個客戶端的併發連接請求?我是否創建多個線程來請求或多個進程或其他方式來測試它?

謝謝。

回答

7

我通常創建一個客戶端程序與服務器模擬一個會議,在附近找到儘可能多的Linux系統,並從這樣的命令行的每臺機器上旋轉起來他們的千人

for i in {0..1000} ; ./myprogram serverip & done 

在某些情況下,協議是基於文本和交互或測試很簡單,所以我沒有寫myprogram只是在運行nc serverip <input>/dev/null

使用netcat,因爲如果你需要的是數據流測試你的客戶,我會從netcat開始,從那裏開始工作。

這種方法對我的需求沒問題,我通常不需要測試比少數幾千客戶更多的併發性。如果你需要更多的可擴展性,你可能必須使用io多路複用(epoll)編寫客戶端模擬器,讓每個實例模擬儘可能多的交互 - 而且你必須做更多的受控測試來找到限制你的客戶。

不要將性能測試與功能測試混合在一起。雖然在測試環境中您可能會獲得較高的性能,但實時環境可能會有很大差異。例如客戶將會行事不端,他們會在最不恰當的時候斷開連接。他們可能會向您發送惡意數據。它們可能很慢,導致服務器上的內部隊列積聚,或使您看到幾千個看似空閒的連接(killall -STOP nc,而在發送數據以測試客戶端的過程中可能會顯示您遇到問題)

0

您可以使用兩個線程一個發送請求和其他接收響應。

要模擬多個客戶端,您可以在腳本中使用ifconfig命令或在c程序中使用ioctl創建多個子接口。

對於從客戶端發送數據,您可以創建多個套接字陣列,並將它們綁定到不同的子接口IP,並通過它們循環發送數據,並使用select或poll從服務器接收數據。