構建C1000K的服務器(2) – 實現百萬鏈接的comet服務器

轉自:http://www.ideawu.net/blog/archives/742.html

html

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

Comet 服務器是一類邏輯相對簡單, 須要高併發鏈接的服務器. Comet 在網站系統中的應用很是普遍, 能夠見這篇日誌的介紹: http://www.ideawu.net/blog/archives/737.html.github

HTTP 協議處理

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

 

通道和訂閱者管理

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

Benchmark

啓動 icomet 服務器:ide

./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%.idea

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

相關文章
相關標籤/搜索