先說一下結論。
那么 默認 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),則立即發送。
』——
糊塗窗口綜合症和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
<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行)。
參考資源:
2)火丁,2012,
Memcached二三事兒;
3)2009,
Issue 88: Turn off TCP nagle can hugely improve performance;
3)
最佳實踐系列:前端代碼標准和最佳實踐
(2012-12-19 23:33)
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、反向代理、獲取的那些事兒
(2012-09-19 01:17)
8)
電商課題:對付秒殺器等惡意訪問行為的簡單梳理
(2012-09-18 03:51)
9)
電商課題VII:支付交易一般性准則
(2012-12-14 01:38)
贈圖幾枚:


