2009-11-24 80 views
9

我們爲我們的Web應用程序設置了三個memcache服務器。內存緩存連接數永不丟失,持續增長

兩個工作正常,處理成千上萬的讀寫操作,同時每個連接保持不超過12個連接(根據memcache-top)。

我們有第三個memcache服務器負責存儲管理客戶端會話數據(使用PHPs built in memcache session handler)和一些隨機應用程序數據。出於某種原因,此盒子上的連接數量永遠不會下降,只會隨着時間的推移而增加。例如,我們最近重新啓動了服務器,一小時後,memcache-top記錄了300個連接。

代碼庫使用持久連接和動態連接的混合,但我一直無法想出一個簡單的例子來重新創建連接永遠不會死的情況。這第三個內存緩存服務器實際上承載我們的web應用程序的最不活躍的部分,你可以從內存緩存,最高見:

memcache-top v0.6 (default port: 11211, color: on, refresh: 3 seconds) 

INSTANCE   USAGE HIT % CONN TIME EVICT/s READ/s WRITE/s 
memcache1:11211 15.7% 83.5% 10 1.2ms  0.0 24.9K 34.5K 
memcache2:11211 15.8% 81.3% 10 1.0ms  0.0 19.1K 31.6K 
memcache3:11211 0.1% 0.0% 354 1.1ms  0.0  4  321 

AVERAGE: 10.5% 55.0% 124 1.1ms 0.0 14.7K 22.1K 

TOTAL: 0.6GB/ 6.0GB 374 3.2ms 0.0 44.0K 66.4K 

所以我的問題是:爲什麼這個內存緩存實例的連接永遠不死?

+1

Q1。那第三個「麻煩」的服務器碰巧是* BSD,而那些2個「好」的服務器 - Linux? Q2。所有3個memcache的CPU使用率是多少? – chronos 2009-12-03 14:26:49

回答

4

PHP中的持久連接會爲每個apache工作進程分配一個連接。 Apache設置爲允許〜354個工作進程?

1

什麼是您的session.gc_probability和session.gc_divisor設置爲? 一些Linux發行版會覆蓋這些值並添加一個cronjob來清除會話。您的問題可能是由此行爲引起的。

2

您使用的是PHP5嗎?很可能是的。下面是來自PHP session_set_save_handler documentation可能的陷阱:

由於PHP 5.0.5的寫入和關閉 處理程序對象 破壞後調用,因此不能使用 對象或拋出異常。對象析構函數可以使用 會話。

有可能調用 session_write_close()從 析構函數來解決這個雞蛋問題和 雞蛋問題。

你有多想打賭內存緩存的會話處理器還沒有被此更改之前重新審視?作爲一個解決方案或至少是診斷,我建議編寫自己的memcached會話open/close/read/write並銷燬函數(不是對象),用session_set_save_handler掛接它們並跳過使用內置函數。至少你可以記錄內部信息。

+0

作爲記錄/調試您的自定義會話處理程序的旁註 - 您需要沿着** file_put_contents()**的行使用某些內容,因爲write()方法在內容刷新到頁面後發生。 – 2009-12-07 18:01:47