webbench原始碼分析

2021-06-28 23:44:01 字數 2803 閱讀 4355

根據提供的引數構造http請求的訊息頭,然後fork出n個子程序(也就是webbench時候提供的引數-c n),每個子程序根據根據引數-t提供的時間,持續這麼多秒,這這麼長的時間內利用socket建立乙個tcp連線到我們想要的**頁面。然後每個程序統計自己再這個時間內取得了多少頁面和多少資料,然後由父程序統計,最後傳送的consel上面來。

我提取出主要的幾個函式

}上面這個函式很簡單,就是根據提供的**獲取主機位址和埠號 (其中有獲取**主機的處理)

static int bench(void)

close(i);

if(pipe(mypipe))

for(i=0;i 

} if( pid< (pid_t) 0)

if(pid== (pid_t) 0)

fprintf(f,"%d %d %d\n",speed,failed,bytes);

fclose(f);

return 0;

} else

setvbuf(f,null,_ionbf,0);

speed=0;

failed=0;

bytes=0;

while(1)

speed+=i;

failed+=j;

bytes+=k;

if(--clients==0) break;

} fclose(f);

printf("\nspeed=%d pages/min, %d bytes/sec.\nrequests: %d susceed, %d failed.\n",

(int)((speed+failed)/(benchtime/60.0f)),

(int)(bytes/(float)benchtime),

speed,

failed);

} return i;

}這個函式也簡單,就是建立n個子程序,子程序呼叫benchcore來獲得t時間內連線到**的三個資料,speed(其實不太準確,應該是success數目),fail(失敗數目),總共獲取到的位元組數。父程序利用管道統計三種資料,最終負責顯示。

這個函式作用就是連線到網頁上,持續benchtime時間(也就是t時間),其中利用到了訊號處理函式來註冊了sigalarm,當時間到達後,結束迴圈。連線使用的是自己封裝了的socket,其實也是很簡單的。

int socket(const char *host, int clientport)

ad.sin_port = htons(clientport);

sock = socket(af_inet, sock_stream, 0);

if (sock < 0)

return sock;

if (connect(sock, (struct sockaddr *)&ad, sizeof(ad)) < 0)

return -1;

return sock;

}這就是封裝的。

從**中我們可以看到這個過程是比較簡單的,但是問題也是很明顯的,無法模擬多個ip測試,而且準確性很低,時間不是真正的web伺服器處理請求的時間。但是這個工具比較簡單,可以用來做初步分析。

webbench原始碼學習

解讀getopt long static const struct option long options while opt getopt long argc,argv,912vfrt p c h long options,options index eof if tmp optarg if tm...

Web Bench 原始碼學習

web bench是乙個開源的,用c語言寫成的測試伺服器或 的乙個工具 通過fork 來測試,量不大,絕對是乙個學習的教材 但是沒有更新了,估計也很少人用這個,最新的是2004年的1.5版本,不過也不失為乙個好的學習專案 介紹中說,這個測試不是很真實,但起碼可以模擬伺服器的效能 檔案結構 makef...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...