青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

陳碩的Blog

Muduo 網絡編程示例之六:限制服務器的最大并發連接數

Muduo 網絡編程示例之六:限制服務器的最大并發連接數

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

這是《Muduo 網絡編程示例》系列的第六篇文章。

Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

 

本文已以大家都熟悉的 EchoServer 介紹如何限制服務器的并發連接數。

本文的代碼見 http://code.google.com/p/muduo/source/browse/trunk/examples/maxconnection/

《Muduo 網絡編程示例 系列》計劃中的第六篇文章原本是“用于測試兩臺機器的帶寬的 pingpong 程序”,pingpong 協議的程序已經在《muduo 與 boost asio 吞吐量對比》和《muduo 與 libevent2 吞吐量對比》兩篇文章中介紹過了,所以我改為寫另外一個有點意思的主題。

這篇文章中的“并發連接數”是指一個 server program 能同時支持的客戶端連接數,連接系由客戶端主動發起,服務端被動接受(accept)連接。(如果要限制應用程序主動發起的連接,則問題要簡單得多,畢竟主動權和決定權都在程序本身。)

為什么要限制并發連接數?

一方面,我們不希望服務程序超載,另一方面,更因為 file descriptor 是稀缺資源,如果出現 file descriptor 耗盡,很棘手(跟 “malloc 失敗/new() 拋出 std::bad_alloc”差不多同樣棘手)。

我在《分布式系統的工程化開發方法》一文中曾談到 libev 作者建議的一種應對“accept()ing 時 file descriptor 耗盡”的辦法。

 

幻燈片35

幻燈片36

Muduo 的 acceptor 正是這么實現的,但是,這個做法在多線程下不能保證正確,會有 race condition。(思考題:是什么 race condition?)

其實有另外一種比較簡單的辦法:file descriptor 是 hard limit,我們可以自己設一個稍低一點的 soft limit,如果超過 soft limit 就主動關閉新連接,這樣就避免觸及“file descriptor 耗盡”這種邊界條件。比方說當前進程的 max file descriptor 是 1024,那么我們可以在連接數達到 1000 的時候進入“拒絕新連接”狀態,這樣留給我們足夠的騰挪空間。

 

Muduo 中限制并發連接數


Muduo 中限制并發連接數的做法簡單得出奇。以在《Muduo 網絡編程示例之零:前言》中出場過的 EchoServer 為例,只需要為它增加一個 int 成員,表示當前的活動連接數。(如果是多線程程序,應該用 muduo::AtomicInt32。)

class EchoServer
{
 public:
  EchoServer(muduo::net::EventLoop* loop,
             const muduo::net::InetAddress& listenAddr,
             int maxConnections);

  void start();

 private:
  void onConnection(const muduo::net::TcpConnectionPtr& conn);

  void onMessage(const muduo::net::TcpConnectionPtr& conn,
                 muduo::net::Buffer* buf,
                 muduo::Timestamp time);

  muduo::net::EventLoop* loop_;
  muduo::net::TcpServer server_;
  int numConnected_; // should be atomic_int
  const int kMaxConnections;
};

然后,在 EchoServer::onConnection() 中判斷當前活動連接數,如果超過最大允許數,則踢掉連接。

void EchoServer::onConnection(const TcpConnectionPtr& conn)
{
  LOG_INFO << "EchoServer - " << conn->peerAddress().toHostPort() << " -> "
    << conn->localAddress().toHostPort() << " is "
    << (conn->connected() ? "UP" : "DOWN");

  if (conn->connected())
  {
    ++numConnected_;
    if (numConnected_ > kMaxConnections)
    {
      conn->shutdown();
    }
  }
  else
  {
    --numConnected_;
  }
  LOG_INFO << "numConnected = " << numConnected_;
}

這種做法可以積極地防止耗盡 file descriptor。

另外,如果是有業務邏輯的服務,可以在 shutdown() 之前發送一個簡單的響應,表明本服務程序的負載能力已經飽和,提示客戶端嘗試下一個可用的 server(當然,下一個可用的 server 地址不一定要在這個響應里給出,客戶端可以自己去 name service 查詢),這樣方便客戶端快速 failover。

 

后文將介紹如何處理空閑連接的超時:如果一個連接長時間(若干秒)沒有輸入數據,則踢掉此連接。辦法有很多種,我用 Time Wheel 解決。

posted on 2011-04-27 00:03 陳碩 閱讀(4920) 評論(9)  編輯 收藏 引用 所屬分類: muduo

評論

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 00:52 ouyang

那對于TCP服務器來說,應該限制最大并發連接數為多少合適呢?另外,Muduo是否適合用來開發大并發(單機2萬+)、短連接、小流量(整體網絡流量不大)的TCP服務器?請指點。謝謝!  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 08:20 陳碩

@ouyang
> 限制最大并發連接數為多少合適呢?
看應用的復雜度,看多少個并發連接就把 CPU 或者 Memory 或者 IO 占滿,然后設一個比它略小的上限,以保證服務質量。

> Muduo是否適合用來開發大并發(單機2萬+)、短連接、小流量(整體網絡流量不大)的TCP服務器?
應該可以,可能要為短連接適當優化一下 Acceptor。不過如果是短連接的話,單機并發 2萬+ 是指什么?同時有 2 萬個連接在線嗎?那這不是長連接嗎?  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 13:12 ouyang

比如說可能有幾十萬上百萬個用戶,每個用戶都會連接到服務器在很短時間內(10秒內)做些數據交互,估計最大同時在線的并發數在幾萬(2-3萬)左右。不考慮其他因素(出口帶寬、服務器的內存大小)等的影響,光TCP服務器這塊,如果采用Muduo,需要做些什么特色處理嗎?謝謝!  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數[未登錄] 2011-04-27 14:54 陳碩

@ouyang
按照你提供的數據,并發數 30000,每個連接存活時間 10 秒,可以計算出至少每秒鐘要 accept 3000 個連接,并斷開 3000 個舊連接(假設客戶端主動斷開連接,這樣服務器不進入 time-wait 狀態)。
對于服務端,每 accept 一個連接需要收兩個 packet,發一個 packet。
每斷開一個連接需要收兩個 packet,發兩個 packet。
這樣一生一滅,操作系統每秒鐘要處理 6~7 * 3000 = 18,000 ~ 21,000 個 packet。你確定你的服務器還有資源處理業務嗎?
如果是單線程,平均每個連接的業務處理時間只有 0.3 毫秒,來得及完成任務嗎?

對于 muduo,需要做的優化是修改 Acceptor::handleRead(),每次 accept N 個連接,而不是 1 個。N 的值可能是 10。
見下面這篇論文第 5.2 節: http://www.cs.uwaterloo.ca/~brecht/papers/ols-2004.pdf
  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 23:02 test

紙上談兵吧
不會死循環的  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 23:10 陳碩

@test
這位名為“test”的網友,您測過嗎?  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 23:43 test

寫過很多類似代碼。
超過ulimit maxfile的設置后,打印超出最大連接。 但不死循環  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-27 23:48 陳碩

@test
那你怎么關閉那個 pending connection ?
抑或根本不是 level-trigger reactor?  回復  更多評論   

# re: Muduo 網絡編程示例之六:限制服務器的最大并發連接數 2011-04-28 00:15 test

不處理。
現在沒有環境 也不好測試, 搜索了下, 有人說和不同內核版本號有關系。  回復  更多評論   

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费观看久久久4p| 欧美手机在线| 亚洲精选91| 亚洲黄色在线看| 欧美成人亚洲| 91久久线看在观草草青青| 亚洲国产精品久久久久久女王| 亚洲国产婷婷香蕉久久久久久99| 日韩一区二区精品葵司在线| 在线视频精品一| 欧美在线免费观看亚洲| 欧美在线观看天堂一区二区三区| 亚洲一区图片| 蜜桃av综合| 欧美成人免费网站| 亚洲精品一区在线| 亚洲伊人久久综合| 久久九九免费视频| 欧美精品电影| 国产精品―色哟哟| 136国产福利精品导航网址| 一本色道久久综合亚洲二区三区| 午夜一区二区三视频在线观看 | 亚洲精品少妇| 亚洲自拍16p| 久久香蕉精品| 欧美午夜精品久久久久久超碰| 国产欧美日韩在线| 亚洲精品欧美极品| 久久精品一区四区| 99精品免费| 另类酷文…触手系列精品集v1小说| 欧美三级特黄| 亚洲国产精品一区二区第四页av | 激情国产一区二区| 一区二区国产精品| 欧美电影电视剧在线观看| 亚洲校园激情| 欧美精品久久天天躁| 精品成人免费| 欧美一区二区三区视频在线| 最近看过的日韩成人| 欧美一级久久久| 欧美日韩一区二区三区视频| 精品91在线| 午夜一区二区三区在线观看| 亚洲欧洲视频在线| 老司机一区二区三区| 国产一区二区三区久久精品| 亚洲一区二区三区777| 亚洲国产精品成人久久综合一区| 欧美一区日韩一区| 国产精品久久久久av免费| 日韩午夜电影在线观看| 欧美成人精品1314www| 久久精品综合| 好吊一区二区三区| 久久在线免费观看| 欧美影院精品一区| 国产婷婷色一区二区三区| 性欧美xxxx大乳国产app| 亚洲一区二区三区精品在线观看| 欧美调教视频| 欧美成熟视频| 久久永久免费| 亚洲精品免费一区二区三区| 亚洲国产91色在线| 欧美亚洲在线播放| 国产欧美一区二区三区久久| 欧美一级黄色录像| 亚洲欧美变态国产另类| 国产精品色婷婷久久58| 欧美在线观看视频一区二区三区| 亚洲天堂激情| 国产日韩欧美一二三区| 欧美一区二区视频免费观看| 亚洲欧美在线免费| 国模私拍一区二区三区| 欧美高清在线精品一区| 欧美v国产在线一区二区三区| 亚洲区中文字幕| 日韩一级黄色av| 国语自产精品视频在线看8查询8| 欧美一级午夜免费电影| 久久天天躁夜夜躁狠狠躁2022| 久久精品成人| 伊人精品久久久久7777| 久久综合狠狠综合久久激情| 久久久之久亚州精品露出| 亚洲福利av| 国产精品久久亚洲7777| 亚洲欧美中文另类| 美脚丝袜一区二区三区在线观看 | 欧美黄色网络| 国产一区二区三区久久 | 亚洲日本电影在线| 欧美性猛交一区二区三区精品| 亚洲欧美三级在线| 久久久xxx| 亚洲一区二区影院| 久久亚洲欧美| 亚洲欧美国产精品桃花| 久久婷婷影院| 久久av免费一区| 欧美日本在线观看| 猫咪成人在线观看| 国产精品美女久久久久久久| 牛人盗摄一区二区三区视频| 欧美性视频网站| 亚洲伊人观看| 91久久在线视频| 中文在线资源观看网站视频免费不卡 | 激情av一区| 亚洲午夜电影| 日韩一级黄色大片| 久久蜜臀精品av| 欧美在线啊v| 欧美视频一区二区三区在线观看 | 欧美一区二粉嫩精品国产一线天| 一本一本久久a久久精品综合妖精| 久久gogo国模啪啪人体图| 亚洲一区在线免费| 欧美精品久久久久久久久久| 免费高清在线一区| 国产三级精品在线不卡| 亚洲视频欧美在线| 国产精品99久久久久久人| 久久女同互慰一区二区三区| 久久精品观看| 国产无一区二区| 午夜在线一区| 久久av一区二区三区| 国产精品私房写真福利视频| 日韩视频在线永久播放| 亚洲美女网站| 欧美噜噜久久久xxx| 亚洲欧洲一区二区在线播放| 亚洲激情视频网站| 欧美激情亚洲精品| 99精品国产在热久久婷婷| 中日韩高清电影网| 欧美三区在线观看| 中文国产成人精品久久一| 亚洲在线视频| 国产毛片精品国产一区二区三区| 亚洲一区日本| 久久精品在这里| 麻豆freexxxx性91精品| 亚洲第一天堂无码专区| 亚洲国产精品123| 性欧美暴力猛交另类hd| 欧美好骚综合网| 亚洲精品一区二区在线观看| 久久久综合免费视频| 亚洲一区二区三区中文字幕在线 | 欧美在线免费视屏| 久久成人免费| 亚洲综合大片69999| 国产精品激情电影| 欧美在线观看一区| 欧美大片在线观看一区| 亚洲黄色视屏| 国产一级一区二区| 久久久www成人免费毛片麻豆| 久久资源在线| 日韩亚洲精品视频| 国产精品午夜春色av| 久久久人人人| 亚洲蜜桃精久久久久久久| 欧美在线网址| 亚洲人永久免费| 国产区在线观看成人精品| 久久久久免费视频| 夜夜嗨av一区二区三区网站四季av | 亚洲女同在线| 欧美aaa级| 亚洲一区在线看| 亚洲国产欧美日韩| 国产日韩一区二区三区在线| 欧美88av| 欧美在线不卡视频| 99精品免费网| 亚洲成人直播| 久久精品99久久香蕉国产色戒| 亚洲免费观看视频| 激情综合中文娱乐网| 国产精品久久久久9999高清| 你懂的网址国产 欧美| 久久久精品一区二区三区| 亚洲网站视频福利| 亚洲人久久久| 欧美大片一区二区| 久久嫩草精品久久久精品一| 午夜精品在线看| 一区二区三区产品免费精品久久75 | 亚洲国产欧美在线| 国产又爽又黄的激情精品视频| 欧美视频精品在线观看| 欧美xart系列高清| 美女脱光内衣内裤视频久久网站|