這是關(guān)于 C1000K 序列文章的第二篇, 在前一篇文章 構(gòu)建C1000K的服務(wù)器(1) – 基礎(chǔ) 中, 介紹了支持 C1000K 的 Linux 系統(tǒng)的內(nèi)核參數(shù)調(diào)整和系統(tǒng)設(shè)置. 在本篇文章中, 將對(duì)一個(gè)真正的應(yīng)用服務(wù)器做 C1000K 測(cè)試.

Comet 服務(wù)器是一類(lèi)邏輯相對(duì)簡(jiǎn)單, 需要高并發(fā)連接的服務(wù)器. Comet 在網(wǎng)站系統(tǒng)中的應(yīng)用非常廣泛, 可以見(jiàn)這篇日志的介紹: http://www.ideawu.net/blog/archives/737.html.

HTTP 協(xié)議處理

要開(kāi)發(fā)一個(gè)支持百萬(wàn)并發(fā)連接的 Comet 服務(wù)器, 我選擇 C/C++ 語(yǔ)言, 當(dāng)然還有其它的選擇如 Erlang, Java 等. 對(duì)于一個(gè)只支持 long-polling Comet 服務(wù)器, 首先要具備解析 HTTP 協(xié)議的能力, 我選擇 libevent 來(lái)處理 HTTP 協(xié)議.

通道和訂閱者管理

服務(wù)器在啟動(dòng)的時(shí)候, 就預(yù)先分配了 100 萬(wàn)個(gè)通道對(duì)象的空間, 但訂閱者對(duì)象是按需分配的, 通過(guò)內(nèi)存池方式. 100 萬(wàn)個(gè)通道對(duì)象和程序的其它數(shù)據(jù)占用了 24MB 的內(nèi)存.

Benchmark

啟動(dòng) icomet 服務(wù)器:

./icomet 

服務(wù)器監(jiān)聽(tīng)了 100 個(gè)端口, 是為了測(cè)試方便, 原因見(jiàn)前一篇文章的分析: 構(gòu)建C1000K的服務(wù)器(1) – 基礎(chǔ).

然后啟動(dòng) benchmark 客戶(hù)端:

./tools/benchmark 127.0.0.1 8100 

benchmark 程序每創(chuàng)建十萬(wàn)個(gè)連接, 就會(huì)暫停, 按回車(chē)后繼續(xù). 通過(guò) top/ps 查看 icomet 進(jìn)程的內(nèi)存占用. 最終, 得出如下數(shù)據(jù).

連接數(shù)進(jìn)程VIRT進(jìn)程RES
039m24m
100000302m288m
200000579m565m
5000001441m1427m
10000002734m2720m

可以看到, 每一個(gè) Comet 連接大約占用了 2.7KB 的內(nèi)存. 此時(shí), 服務(wù)器空閑, 進(jìn)程占用 CPU 為 0%.

項(xiàng)目的代碼在: https://github.com/ideawu/icomet, 歡迎大家試用, 并反饋你的測(cè)試數(shù)據(jù).

Related posts:

  1. HTTP 長(zhǎng)連接技術(shù) Comet
  2. 構(gòu)建C1000K的服務(wù)器(1) – 基礎(chǔ)
  3. iComet 的一個(gè)應(yīng)用場(chǎng)景
  4. 長(zhǎng)連接技術(shù)的應(yīng)用