PHP-FPM模式下可怕的 MongoDB-PHP-Driver 串連池無節制串連問題

來源:互聯網
上載者:User
@鄭昀匯總 建立日期:2013/1 問題發生環境:
  • Nginx
  • PHP 5.3.10 as php-fpm extension to nginx
  • mongodb-php-driver 1.2.12
  • MongoDB 2.2
此問題是 MongoDB PHP Driver 1.2.x 的官方特性導致的,描述請看 PHP-202 和  PHP-347 。簡單地說,PHP-FPM模式下,每一個 PHP Worker 進程都有自己獨立的 mongodb 串連池,從而導致串連數極易超標,記憶體數也隨之倍增。  一,PHP服務背景:某個 Web 應用程式是通過 Nginx+factcgi 啟動並執行 PHP 程式提供服務的。PHP-FPM的最大子進程數,是通過 php-fpm.conf 的 max_children 參數設定的(或pm=dynamic時由 spare_servers+start_servers 參數綜合決定)。這個值曾被設定為 512。  二,MongoDB服務背景:mongodb 執行個體的最大串連數限制可以通過啟動參數中的 maxConns 設定:
  • maxConns:預設值取決於系統的限制(如 ulimit 和 file descriptor)。如果沒設定這個參數, mongodb 自己不會限制串連數。但,你不能設定超過 20,000 。

一般不刻意設定 maxConns 參數。

  三,MongoDB PHP Driver 的可怕串連池特性(BUG?)MongoDB 官方提供的  mongodb-php-driver 在 1.3.0 以下版本(1.2.0~1.2.1x),擁有一個可怕的串連池實現方案,在執行任何查詢時,都會從串連池中請求一個串連,完成之後再歸還給串連池。這裡的完成是指持有該串連的變數離開了它的範圍。 PHP-FPM模式下,一個 PHP Web 應用程式能對 MongoDB instance 建立的並發串連數計算方式如下:
  • 進程數:max-children = 512 ,那麼是 512 個進程;
  • 一個MongoDB執行個體對應一個串連池:主站配置了165和166兩個複本集執行個體;
  • 串連池中的串連數:mongodb-php-driver 對此不做任何限制,可以無限增加直到控制代碼耗盡為止。
——————鄭昀:此計算方式出自 mongo.connecting.pools ——————根據 mongodb 官方文檔說明, 雖然串連數無限增長理論上是有可能的,但實際觀測發現,一個 Web Server 與一個 mongodb 執行個體的串連數通常會穩定在一個值上,不會有太大的起伏。那麼,假設 一個 PHP Web 應用程式向 mongodb-165 發起的串連數為750 個,該 MongoDB 執行個體為此需要維護的記憶體數至少為:750 × 預設10MB =  7.5 GB 

五,解決辦法

迅速升級到 mongodb-php driver 1.3.2。  參考文檔:1)2012-12-9,Connection Handling with the MongoDB PHP driver,英文稿,中文翻譯稿;2)李丹的測試結果:“再測試一下驅動升級到1.3.2穩定版後的ab結果,發現close效果很明顯,很快的串連數就下降到測試之前的數量了。雖然在峰值上大於老的驅動,但是應該可以解決現有線上的高串連持續的問題。”3)mongodb Connection Pooling (version 1.2.0-1.2.12 *only*);4)mongodb-java-driver 定義了一個應用與 mongodb 執行個體能建立的最大串連數,即 (connectionsPerHost × threadsAllowedToBlockForConnectionMultiplier)個串連:
  • mongo.options.connectionsPerHost:每個Application與 MongoDB 執行個體能建立的最大物理串連數,預設是10;
  • mongo.options.threadsAllowedToBlockForConnectionMultiplier:可以等待池中有串連可用的最大線程數,預設是5。

5)crazyshell,2012,MongoDB maxConns參數;

贈圖幾枚:spymemcached 相關文章:1)spymemcached 的 useNagle 問題與 TCP/IP延遲發送資料2)spymemcached :某個mc節點操作連續逾時超過998次就 Auto-Reconnect 的特性3)關於 Multiget hole:spymemcached對此的實現方法

推薦閱讀:

三個執行個體示範 Java Thread Dump 日誌分析 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.