spymemcached 的 useNagle 問題與 TCP/IP延遲發送數據


先說一下結論。
如果你沒有特意在   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算法就是為了盡可能發送大塊數據,避免網絡中充斥着許多小數據塊。
N agle算法的基本定義是 任意時刻,最多只能有一個未被確認的小段。 所謂“小段”,指的是小於MSS尺寸的數據塊,所謂“未被確認”,是指一個數據塊發送出去后,沒有收到對方發送的ACK確認該數據已收到

        Nagle算法的規則(可參考tcp_output.c文件里tcp_nagle_check函數注釋): 

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

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

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

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

      (5)上述條件都未滿足,但發生了超時(一般為200ms),則立即發送。
 
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 算法。

2mongo-java-driver 默認也禁用 Nagle 算法(DBPort.java 63行)。

參考資源:
2)火丁,2012, Memcached二三事兒
3)2009,  Issue 88:  Turn off TCP nagle can hugely improve performance;

 


 

http://ww4.sinaimg.cn/bmiddle/61b889f5jw1e0heyvf2bjj.jpg
http://ww4.sinaimg.cn/bmiddle/722cf283jw1e0gmqya3f5j.jpg

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM