這是關于 C1000K 序列文章的第二篇, 在前一篇文章 構建C1000K的服務器(1) – 基礎 中, 介紹了支持 C1000K 的 Linux 系統的內核參數調整和系統設置. 在本篇文章中, 將對一個真正的應用服務器做 C1000K 測試.

Comet 服務器是一類邏輯相對簡單, 需要高并發連接的服務器. Comet 在網站系統中的應用非常廣泛, 可以見這篇日志的介紹: http://www.ideawu.net/blog/archives/737.html.

HTTP 協議處理

要開發一個支持百萬并發連接的 Comet 服務器, 我選擇 C/C++ 語言, 當然還有其它的選擇如 Erlang, Java 等. 對于一個只支持 long-polling Comet 服務器, 首先要具備解析 HTTP 協議的能力, 我選擇 libevent 來處理 HTTP 協議.

通道和訂閱者管理

服務器在啟動的時候, 就預先分配了 100 萬個通道對象的空間, 但訂閱者對象是按需分配的, 通過內存池方式. 100 萬個通道對象和程序的其它數據占用了 24MB 的內存.

Benchmark

啟動 icomet 服務器:

./icomet 

服務器監聽了 100 個端口, 是為了測試方便, 原因見前一篇文章的分析: 構建C1000K的服務器(1) – 基礎.

然后啟動 benchmark 客戶端:

./tools/benchmark 127.0.0.1 8100 

benchmark 程序每創建十萬個連接, 就會暫停, 按回車后繼續. 通過 top/ps 查看 icomet 進程的內存占用. 最終, 得出如下數據.

連接數進程VIRT進程RES
039m24m
100000302m288m
200000579m565m
5000001441m1427m
10000002734m2720m

可以看到, 每一個 Comet 連接大約占用了 2.7KB 的內存. 此時, 服務器空閑, 進程占用 CPU 為 0%.

項目的代碼在: https://github.com/ideawu/icomet, 歡迎大家試用, 并反饋你的測試數據.

Related posts:

  1. HTTP 長連接技術 Comet
  2. 構建C1000K的服務器(1) – 基礎
  3. iComet 的一個應用場景
  4. 長連接技術的應用