spymemcached 的 useNagle 問題與 TCP/IP延遲發送資料

來源:互聯網
上載者:User
先說一下結論。
如果你沒有特意在 spymemcached 的 client bean definition 裡配置 useNagleAlgorithm 屬性為 True,
那麼 預設 spymemcached 是不啟用 Nagle 演算法的
所以預設情況下不會引發恨少在《libmemcached的MEMCACHED_MAX_BUFFER問題》一文中提及的“shell指令碼set 1000次8KB的item,只要3s左右,平均需要3ms。而C++版本則需要39s左右,平均耗時39ms……發現8KB的資料需要發送兩次,兩次write都是非常快的,但是等memcached返回時用了很多時間,主要的時間就耗費在這個地方”現象。咱們業務中心可以排除這個嫌疑。  什麼是 Nagle 演算法?
TCP/IP協議中,無論發送多少資料,總是要在資料前面加上協議頭,同時,對方接收到資料,也需要發送ACK表示確認。為了儘可能地利用網路頻寬,TCP總是希望儘可能地發送足夠大的資料。(一個串連會設定MSS參數,因此,TCP/IP希望每次都能夠以MSS尺寸的資料區塊來發送資料)。Nagle演算法就是為了儘可能發送大塊資料,避免網路中充斥著許多小資料區塊。
Nagle演算法的基本定義是 任意時刻,最多隻能有一個未被確認的小段。 所謂“小段”,指的是小於MSS尺寸的資料區塊,所謂“未被確認”,是指一個資料區塊發送出去後,沒有收到對方發送的ACK確認該資料已收到。

        Nagle演算法的規則(可參考tcp_output.c檔案裡tcp_nagle_check函數注釋): 

      (1)如果包長度達到MSS,則允許發送;

      (2)如果該包含有FIN,則允許發送;

      (3)設定了TCP_NODELAY選項,則允許發送;

      (4)未設定TCP_CORK選項時,若所有發出去的小資料包(包長度小於MSS)均被確認,則允許發送; 

      (5)上述條件都未滿足,但發生了逾時(一般為200ms),則立即發送。』——糊塗視窗綜合症和Nagle演算法  spymemcached 預設不啟用 Nagle 演算法/net/spy/memcached/ConnectionFactoryBuilder.java 中定義如下:/** * Builder for more easily configuring a ConnectionFactory. */public class ConnectionFactoryBuilder {
  protected boolean useNagle = false;
……
  public ConnectionFactoryBuilder(ConnectionFactory cf) {
……
    setUseNagleAlgorithm(cf.useNagleAlgorithm());  }  /** * Set to true if you'd like to enable the Nagle algorithm. */  public ConnectionFactoryBuilder setUseNagleAlgorithm(boolean to) {    useNagle = to;    return this;  }然後,轉到 MemcachedConnection.java,說到底還是調用 socket 的 setTcpNoDelay 方法:  protected List<MemcachedNode> createConnections(……      ch.socket().setTcpNoDelay(!this.connectionFactory.useNagleAlgorithm());  通過 bean definition 可設定 useNagleAlgorithm參考 SpringIntegration 文檔,spring 裡配置如下:
<beanid="memcachedClient"class="net.spy.memcached.spring.MemcachedClientFactoryBean">……
   <propertyname="useNagleAlgorithm"value="false"/>
  </bean>
 p.s.:1)另一個常用的 memcached java client——xmemcached 從1.3.6版本開始也預設禁用了 Nagle 演算法。

2)mongo-java-driver 預設也禁用 Nagle 演算法(DBPort.java 63行)。

參考資源:1)網路編程中Nagle演算法和Delayed ACK的測試2)火丁,2012,Memcached二三事兒;3)2009, Issue 88:  Turn off TCP nagle can hugely improve performance;

 

 

1)55最佳實務系列:MongoDB最佳實務 (2012-12-15 15:48)
2)55最佳實務系列:Logging最佳實務 (2012-12-15 16:43)3)最佳實務系列:前端代碼標準和最佳實務 (2012-12-19 23:33) 1)電商課題I:Throttle Limits for calls/requests in a clustered environment (2012-11-17 22:14)

2)電商課題V:分布式鎖 (2012-11-17 22:16)

3)電商課題:cookie防篡改 (2012-11-17 22:24)4)電商課題VI:分布式Session (2012-11-17 22:30)

5)電商課題:RBAC許可權控制 (2012-11-17 22:47)

6)電商課題:等冪性 (2012-11-22 23:52)

7)電商課題:用戶端的IP地址偽造、CDN、反向 Proxy、擷取的那些事兒 (2012-09-19 01:17)

8)電商課題:對付秒殺器等惡意訪問行為的簡單梳理 (2012-09-18 03:51)

9)電商課題VII:支付交易一般性準則 (2012-12-14 01:38)

贈圖幾枚:

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.