關於php-fpm的進程數管理

來源:互聯網
上載者:User
這篇文章主要介紹了關於php-fpm的進程數管理 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

PHP-FPM

先來瞭解一些名詞概念:

CGICommon Gateway Interface(通用網管協議),用於讓互動程式和Web伺服器通訊的協議。它負責處理URL的請求,啟動一個進程,將用戶端發送的資料作為輸入,由Web伺服器收集程式的輸出並加上合適的頭部,再發送回用戶端。

FastCGI是基於CGI的增強版本的協議,不同於建立新的進程來服務要求,使用持續的進程和建立的子進程來處理一連串的進程,這些進程由FastCGI伺服器管理,開銷更小,效率更高。

PHP-FPMPHP實現的FastCGI Process Manager(FastCGI進程管理器), 用於替換PHP FastCGI的大部分附加功能,適用於高負載網站。支援的功能如:

  1. 平滑停止/啟動的進階進程管理功能

  2. 慢日誌記錄指令碼

  3. 動態/靜態子進程產生

  4. 基於php.ini的設定檔

PHP-FPM在5.4之後已經整合進入PHP原始碼中,提供更好的PHP進程管理方式,可以有效控制記憶體和進程,平滑重載PHP配置。如果需要使用,在./configure的時候帶上-enable-fpm參數即可,使用PHP-FPM來控制FastCGI進程:

// 支援start/stop/quit/restart/reload/logrotate參數// quit/reload是平滑終止和平滑重新載入,即等現有的服務完成./php-fpm --start

PHP-FPM 配置

PHP-FPM設定檔為php-fpm.conf,在這個設定檔中我們需要瞭解一些參數。下面所有的子進程均指php-fpm進程,可以在終端通過ps aux | grep php查看到。

  • 顯示php-fpm: pool www的代表work子進程(實際處理請求)

  • 顯示php-fpm: process master的代表master主進程(負責管理work子進程)

全域配置

先看PHP-FPM最重要的全域配置部分:

emergency_restart_threshold

如果在emergency_restart_interval設定的時間內收到該參數設定次數的SIGSEGVSIGBUS退出的訊號,則FPM會重新啟動。預設值為0,表示關閉該功能。

emergency_restart_interval

設定平滑重啟的間隔時間,有助於解決加速器中共用記憶體的使用問題。可用單位s(預設)/m/h/d,預設值為0, 表示關閉。

process.max

FPM能夠建立的最大子進程數量,它在使用多個pm = dynamic配置的php-fpm pool進程池的時候,控制全域的子進程數量。預設值為0,代表著無限制。

進程池配置

PHP-FPM的配置其餘部分是一個名為Pool Definitions的地區,這個地區的配置設定每個PHP-FPM進程池,進程池中是一系列相關的子進程。這部分開頭都是[進程池名稱],如[www]

此時可以解釋看到ps aux | grep php中顯示的是php-fpm: pool www

pm

pm指的是process manager,指定進程管理器如何控制子進程的數量,它為必填項,支援3個值:

  • static: 使用固定的子進程數量,由pm.max_children指定

  • dynamic:基於下面的參數動態調整子進程的數量,至少有一個子進程

    • pm.max_chidren: 可以同時存活的子進程的最大數量

    • pm.start_servers: 啟動時建立的子進程數量,預設值為min_spare_servers + max_spare_servers - min_spare_servers) / 2

    • pm.min_spare_servers: 空閑狀態的子進程的最小數量,如果不足,新的子進程會被自動建立

    • pm.max_spare_servers: 空閑狀態的子進程的最大數量,如果超過,一些子進程會被殺死

  • ondemand: 啟動時不會建立子進程,當新的請求到達時才建立。會使用下面兩個參數:

    • pm.max_children

    • pm.process_idle_timeout 子進程的空閑逾時時間,如果逾時時間到沒有新的請求可以服務,則會被殺死

pm.max_requests

每一個子進程的最大請求服務數量,如果超過了這個值,該子進程會被自動重啟。在解決第三方庫的記憶體流失問題時,這個參數會很有用。預設值為0,指子進程可以持續不斷的服務要求。

PHP-FPM配置最佳化

PHP-FPM管理的方式是一個master主進程,多個pool進程池,多個worker子進程。其中每個進程池監聽一個socket通訊端。具體的圖示:

其中的worker子進程實際處理串連請求,master主進程負責管理子進程:

1. `master`進程,設定1s定時器,通過`socket`檔案監聽2. 在`pm=dynamic`時,如果`idle worker`數量<`pm.min_spare_servers`,建立新的子進程3. 在`pm=dynamic`時,如果`idle worker`數量>`pm.max_spare_servers`,殺死多餘的空閑子進程4. 在`pm=ondemand`時,如果`idle worker`空閑時間>`pm.process_idle_timeout`,殺死該空閑進程5. 當串連到達時,檢測如果`worker`數量>`pm.max_children`,列印`warning`日誌,退出;如果無異常,使用`idle worker`服務,或者建立`worker`服務

保障基本安全

我們為了避免PHP-FPM主進程由於某些糟糕的PHP代碼掛掉,需要設定重啟的全域配置:

; 如果在1min內有10個子進程被中斷失效,重啟主進程emergency_restart_threshold = 10emergency_restart_interval = 1m

進程數調優

每一個子進程同時只能服務一次串連,所以控制同時存在多少個進程數就很重要,如果過少會導致很多不必要的重建和銷毀的開銷,如果過多又會佔用過多的記憶體,影響其他服務使用。

我們應該測試自己的PHP進程使用多少記憶體,一般來說剛啟動時是8M左右,運行一段時間由於記憶體流失和緩衝會上漲到30M左右,所以你需要根據自己的預期記憶體大小設定進程的數量。同時根據進程池的數量來看一個進程管理器的子進程數量限制。

測試平均PHP子進程佔用的記憶體:

$ps auxf | grep php | grep -v grepwork     26829  0.0  0.0 715976  4712 ?        Ss   Jul11   0:00 php-fpm: master process (./etc/php-fpm.conf)work     21889  0.0  0.0 729076 29668 ?        S    03:12   0:20  \_ php-fpm: pool www         work     21273  0.0  0.0 728928 31380 ?        S    03:25   0:21  \_ php-fpm: pool www         work     15114  0.0  0.0 728052 29084 ?        S    03:40   0:19  \_ php-fpm: pool www         work     17072  0.0  0.0 728800 34240 ?        S    03:54   0:22  \_ php-fpm: pool www         work     22763  0.0  0.0 727904 20352 ?        S    11:29   0:04  \_ php-fpm: pool www         work     38545  0.0  0.0 727796 19484 ?        S    12:34   0:01  \_ php-fpm: pool www// 共佔用的記憶體數量$ps auxf | grep php | grep -v grep | grep -v master | awk '{sum+=$6} END {print sum}'162712// 所有的子進程數量$ ps auxf | grep php | grep -v grep | grep -v master | wc -l 6

可以看到第6列,每一個子進程的記憶體佔用大概在19-34M之間(單位為KB)。平均的記憶體佔用為162712KB/6 = 27.1M

查看伺服器總的記憶體大小

$ free -g             total       used       free     shared    buffers     cachedMem:           157        141         15          0          4        123-/+ buffers/cache:         13        143Swap:            0          0          0

可以看出我的伺服器總得記憶體大小是157G(-g採用了G的單位)。

進程數限制

此時如果我們分配全部的記憶體給PHP-FPM使用,那麼進程數可以限制在157000/27 = 5814,但是由於我的伺服器同時服務了很多內容,所以我們可以向下調整到512個進程數:

process.max = 512pm = dynamicpm.max_children = 512pm.start_servers = 16pm.min_spare_servers = 8pm.max_spare_serveres = 30

防止記憶體流失

由於糟糕的外掛程式和庫,記憶體流失時有發生,所以我們需要對每一個子進程服務的請求數量做限制,防止無限制的記憶體流失:

pm.max_requests = 1000

重啟

如果上面的配置都按照你的實際需求和環境配置好了,不要忘記重啟PHP-FPM服務。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

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