nginx - mysql+php如何解決大並發下連接埠映射不足的問題

來源:互聯網
上載者:User
現在的情況是小規模 1mysql伺服器1web伺服器 資料操作很快 幾十ms級的處理邏輯
但是每次訪問本地都會映射出一個連接埠來去訪問3306 這樣在大並發的情況下連接埠就會映射不出來了
比如秒並發有500 30秒就夠映射出15000個連接埠 但是linux預設釋放time_wait要60s
試過pdo的持久化串連似乎沒什麼用
配了unixodbc 開啟pooling 大概有20%的機率崩潰 php-fpm直接被乾死了
另外這個情境比較簡單 整個系統只會開啟一種串連 不存在根據許可權或者情境切換串連的情況

回複內容:

現在的情況是小規模 1mysql伺服器1web伺服器 資料操作很快 幾十ms級的處理邏輯
但是每次訪問本地都會映射出一個連接埠來去訪問3306 這樣在大並發的情況下連接埠就會映射不出來了
比如秒並發有500 30秒就夠映射出15000個連接埠 但是linux預設釋放time_wait要60s
試過pdo的持久化串連似乎沒什麼用
配了unixodbc 開啟pooling 大概有20%的機率崩潰 php-fpm直接被乾死了
另外這個情境比較簡單 整個系統只會開啟一種串連 不存在根據許可權或者情境切換串連的情況

Nginx和PHP-FPM用UNIX Domain Socket通訊(不經過TCP),
PHP-FPM跟MySQL用持久串連(一個FPM背景工作處理序保持一個到MySQL的長串連),
這樣可以避免頻繁建立TCP短串連而導致TIME_WAIT串連過多的問題.

即是2個PHP-FPM背景工作處理序跟MySQL建立了2個持久的資料庫連接,串連沒有操作時處於Sleep狀態:

 true,    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));print_r($dbh);// mysql -uroot -p -e "show processlist"// sudo netstat -antp|egrep "php|mysqld"|grep ESTABLISHED

保持php指令碼儘快執行完畢,延遲大的操作放隊列去,這樣500並發30秒的話,釋放連接埠就會很快了(或者tcp串連是reuse就很快可以被重用).
假如你串連mysql或者你的http被串連時,不是正常斷開,如連mysql沒有close,或者http請求不等返回直接關閉,會出現time_wait,系統回收time_wait很費勁,最後導致連接埠被消耗完了.
time_wait產生原因可以找資料看看中斷連線時四次握手的資料.

如果並發實在太大就考慮分布式了

  • 相關文章

    聯繫我們

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