2010-09-15 51 views
3

一般情況下,內存緩存是工作......但我的日誌有很多這樣的實例:)的Memcache ::設置()斷管

的Memcache ::設置([memcache.set]:送 8192個字節失敗,錯誤號= 32 破碎管

(字節改變的次數)

PHP5.3,Memcache類(V2.2.5 - 最新的穩定version

什麼是破管,爲什麼發生這麼多,可以改進?

回答

0

我也有類似的情況,但對於getextendedstats()

Notice: Memcache::getextendedstats(): send of 9 bytes failed with errno=32 Broken pipe in /usr/local/zend/share/ZendFramework/library/Zend/Cache/Backend/Memcached.php on line 382 

這裏是我找到合乎邏輯的觀點。 http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00348.html

我的假設是,memcached配置不正確或網絡問題,但我在本地運行memcached所以不知道這裏我有網絡問題。

我會盡力解決問題並讓您知道問題所在。

+0

這是有關連接,因爲PHP試圖連接在不同的服務器上的memcache實例。 – Aram 2011-01-25 18:14:31

0

一般來說,當我看到斷管錯誤時,它是在非常高的負載。這是你的情況嗎?有時候,簡單的參數調整可以解決這個問題。如果你允許更多的連接進入某些東西可以處理的東西,你通常會得到一個破損的管道錯誤。

1

我一直在研究和閱讀這一點,並已聽到很多這方面的困惑。在服務器端的Memcached選項上只有很少的文檔。我發現了一個隱藏的寶石,令人驚訝地由MySQL託管。檢查出來http://downloads.mysql.com/docs/mysql-memcached-en.pdf

有幾個潛在的原因,一些援引令人信服地指出:

在操作系統級別
  • ulimit設置到一定程度,阻止其他連接
  • 連接數已經刷爆出
  • 它高負荷(抱歉,咄!)

我一直無法捉摸,也不想像上面是TRU期間只發生在大多數情況下。對於我們的情況,事實證明,當應用程序先前在自動模式下運行時(在-vv詳細模式下,我們說ascii寫入),我們切換到二進制模式連接選項。一旦我們打開二進制選項,寫入全部失敗,從而導致管道損壞。

對於最大連接數的影響,當您在telnet時查看統計數據時,可以檢測到它們。尋找以下內容

STAT accepting_conns 1 
STAT listen_disabled_num 0 

如果listen disabled_num爲0,那很好。這意味着自從memcached實例開始以來沒有丟棄連接。

也可以嘗試優化具有以下Memcached的選項你的連接,至少在PHP中,我們使用以下命令:

$this->m = new Memcached(); 
$this->m->setOption(Memcached::OPT_TCP_NODELAY, true); 
$this->m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); 
$this->m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY); 

所有我能說的是,試訓的設置的幾個組合,在應用程序方面,memcached服務器端並更改應用程序的其他默認設置(例如memcached.sess_lock_wait在memcached.ini文件上,有關更多信息,請參閱php -i|grep memcached)。

祝你好運!