轉自: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
要開發一個支持百萬併發鏈接的 Comet 服務器, 我選擇 C/C++ 語言, 固然還有其它的選擇如 Erlang, Java 等. 對於一個只支持 long-polling Comet 服務器, 首先要具有解析 HTTP 協議的能力, 我選擇 libevent 來處理 HTTP 協議.服務器
服務器在啓動的時候, 就預先分配了 100 萬個通道對象的空間, 但訂閱者對象是按需分配的, 經過內存池方式. 100 萬個通道對象和程序的其它數據佔用了 24MB 的內存.併發
啓動 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, 歡迎你們試用, 並反饋你的測試數據.