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

陳碩的Blog

Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù)

Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù)

陳碩 (giantchen_AT_gmail)

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

這是《Muduo 網(wǎng)絡(luò)編程示例》系列的第六篇文章。

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

 

本文已以大家都熟悉的 EchoServer 介紹如何限制服務(wù)器的并發(fā)連接數(shù)。

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

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

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

為什么要限制并發(fā)連接數(shù)?

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

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

 

幻燈片35

幻燈片36

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

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

 

Muduo 中限制并發(fā)連接數(shù)


Muduo 中限制并發(fā)連接數(shù)的做法簡單得出奇。以在《Muduo 網(wǎng)絡(luò)編程示例之零:前言》中出場過的 EchoServer 為例,只需要為它增加一個 int 成員,表示當前的活動連接數(shù)。(如果是多線程程序,應(yīng)該用 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() 中判斷當前活動連接數(shù),如果超過最大允許數(shù),則踢掉連接。

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。

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

 

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

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

評論

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 00:52 ouyang

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

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 08:20 陳碩

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

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

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 13:12 ouyang

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

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù)[未登錄] 2011-04-27 14:54 陳碩

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

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

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 23:02 test

紙上談兵吧
不會死循環(huán)的  回復(fù)  更多評論   

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 23:10 陳碩

@test
這位名為“test”的網(wǎng)友,您測過嗎?  回復(fù)  更多評論   

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 23:43 test

寫過很多類似代碼。
超過ulimit maxfile的設(shè)置后,打印超出最大連接。 但不死循環(huán)  回復(fù)  更多評論   

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-27 23:48 陳碩

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

# re: Muduo 網(wǎng)絡(luò)編程示例之六:限制服務(wù)器的最大并發(fā)連接數(shù) 2011-04-28 00:15 test

不處理。
現(xiàn)在沒有環(huán)境 也不好測試, 搜索了下, 有人說和不同內(nèi)核版本號有關(guān)系。  回復(fù)  更多評論   

<2011年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产乱码最新视频| 久久人人97超碰国产公开结果 | 国产主播一区二区三区四区| 欧美激情视频一区二区三区在线播放 | 欧美88av| 久久久精品国产99久久精品芒果| 亚洲在线观看免费视频| 久久久久久综合网天天| 性久久久久久久久久久久| 夜夜嗨av一区二区三区中文字幕| 日韩网站在线看片你懂的| 性做久久久久久久久| 欧美一区二区三区在线播放| 亚洲二区在线观看| 亚洲第一精品夜夜躁人人躁| 夜夜嗨av一区二区三区| 另类专区欧美制服同性| 国产精品一卡| 一区二区在线看| 亚洲精品乱码久久久久久| 欧美视频中文一区二区三区在线观看 | 亚洲一区二区三区久久| 狠狠色伊人亚洲综合成人| 亚洲你懂的在线视频| 卡通动漫国产精品| 免费欧美高清视频| 国产精品99久久久久久人| 亚洲欧美综合另类中字| 亚洲小说春色综合另类电影| 欧美日韩精品二区第二页| 在线亚洲免费| 亚洲乱码精品一二三四区日韩在线 | 亚洲国产日韩在线| 欧美福利视频| 午夜精品一区二区三区四区| 在线欧美不卡| 一区二区三区免费观看| 亚洲欧美日韩电影| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲欧洲一级| 亚洲国产精品久久| 欧美电影在线| 久久精品亚洲| 日韩视频中文字幕| 欧美午夜在线| 欧美精品激情在线观看| 欧美一区二区三区久久精品| 欧美日韩一区二区三区在线| 亚洲午夜精品久久久久久app| 一区二区三区色| 狠狠久久亚洲欧美| 欧美小视频在线观看| 亚洲私人影吧| 亚洲国产小视频在线观看| 欧美在线精品免播放器视频| 国产精品女主播在线观看| 欧美理论电影网| 欧美黄色大片网站| 久久久久88色偷偷免费| 亚洲欧洲日韩在线| 亚洲一区二区三区久久| 伊人成年综合电影网| 国产一区二区三区四区五区美女| 亚洲在线观看| 亚洲国产日韩欧美综合久久| 欧美激情在线有限公司| 亚洲国产综合在线| 亚洲高清不卡一区| 日韩视频免费观看高清在线视频| 亚洲电影免费在线观看| 亚洲综合视频一区| 久久久水蜜桃| 久久精品女人的天堂av| 久久综合99re88久久爱| 久久爱另类一区二区小说| 羞羞答答国产精品www一本 | 国产亚洲精品激情久久| 欧美一区综合| 乱码第一页成人| 免费在线国产精品| 欧美日本韩国一区| 国产精自产拍久久久久久| 亚洲亚洲精品在线观看| 久久精品夜色噜噜亚洲a∨| 午夜综合激情| 麻豆精品传媒视频| 亚洲国产精品高清久久久| 久久午夜av| 国产精品av久久久久久麻豆网| 在线成人激情视频| 男女av一区三区二区色多| 欧美另类一区二区三区| 欧美日韩一区二区高清| 国产综合av| 久久精品国产v日韩v亚洲 | 国内精品福利| 在线播放精品| 久久国产高清| 欧美刺激性大交免费视频| 国产亚洲一级| 亚洲一区二区免费| 国产精品激情av在线播放| 欧美国产激情| 亚洲午夜91| 黄色一区二区在线| 亚洲小说春色综合另类电影| 欧美电影在线免费观看网站| 亚洲视频在线观看网站| 欧美专区中文字幕| 亚洲三级电影全部在线观看高清 | 国产精品草草| 亚洲成人直播| 久久一区国产| 欧美日韩中文在线| 亚洲高清免费| 国产精品一页| 欧美激情亚洲自拍| 欧美激情视频一区二区三区在线播放| 国产综合在线视频| 亚洲精品少妇| 精品电影在线观看| 亚洲精选国产| 午夜精品久久久久99热蜜桃导演| 国产精品成人播放| 久久综合给合久久狠狠色 | 亚洲视频精品| 欧美精品一区二区三区久久久竹菊| 香蕉久久一区二区不卡无毒影院| 香港久久久电影| 午夜精品久久久久久久99樱桃| 欧美xx视频| 久久久亚洲影院你懂的| 一区在线免费| 欧美在线免费观看亚洲| 久久国产一区| 国产亚洲精品久| 欧美国产日韩在线| 精品999在线观看| 久久久精品国产免费观看同学| 在线免费观看日本欧美| 午夜久久久久| 99精品国产热久久91蜜凸| 亚洲人成网站色ww在线| 免费在线观看成人av| 亚洲美女啪啪| 在线一区二区三区四区| 国产精品久久久亚洲一区| 日韩小视频在线观看| 一区二区三区福利| 国产欧美精品在线播放| 欧美在线一二三区| 国产综合色精品一区二区三区| 亚洲电影天堂av| 欧美日韩在线直播| 欧美激情日韩| 欧美3dxxxxhd| 欧美在线观看网站| 亚洲丰满少妇videoshd| 亚洲激情偷拍| 欧美—级在线免费片| 亚洲一区二区三区涩| 亚洲第一综合天堂另类专| 欧美日韩国产丝袜另类| 亚洲精品日韩精品| 欧美大秀在线观看| 亚洲美女黄网| 亚洲精品在线一区二区| 9国产精品视频| 亚洲精品乱码久久久久久日本蜜臀| 国产女优一区| 欧美日韩免费高清| 欧美日韩一区高清| 久久乐国产精品| 久久99伊人| 亚洲一区二区黄色| 亚洲国产欧美一区二区三区久久 | 亚洲欧美综合另类中字| 欧美jizz19hd性欧美| 亚洲免费黄色| 欧美日韩在线三区| 久久三级福利| 久久亚洲一区| 亚洲精品免费一区二区三区| 性久久久久久| 欧美高潮视频| 欧美一区二区啪啪| 亚洲国产91精品在线观看| 精品动漫一区二区| 黄色精品一区二区| 伊人久久综合97精品| 亚洲精品免费在线| 91久久久久久| 亚洲免费综合| 欧美在线影院| 亚洲久久在线| 免费成人网www| 国产农村妇女精品一二区| 国产主播一区| 性视频1819p久久| 亚洲视频免费在线|