這是關于 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 |
---|
0 | 39m | 24m |
100000 | 302m | 288m |
200000 | 579m | 565m |
500000 | 1441m | 1427m |
1000000 | 2734m | 2720m |
可以看到, 每一個 Comet 連接大約占用了 2.7KB 的內存. 此時, 服務器空閑, 進程占用 CPU 為 0%.
項目的代碼在: https://github.com/ideawu/icomet, 歡迎大家試用, 并反饋你的測試數據.
Related posts:
- HTTP 長連接技術 Comet
- 構建C1000K的服務器(1) – 基礎
- iComet 的一個應用場景
- 長連接技術的應用