Heim  >  Artikel  >  Backend-Entwicklung  >  Die von Nginx verwendete PHP-FPM-Prozessverwaltungsmethode und -optimierung

Die von Nginx verwendete PHP-FPM-Prozessverwaltungsmethode und -optimierung

coldplay.xixi
coldplay.xixinach vorne
2020-08-08 16:51:432285Durchsuche

Die von Nginx verwendete PHP-FPM-Prozessverwaltungsmethode und -optimierung

PS: Als ich vor einiger Zeit PHP-FPM konfigurierte, entdeckte ich zufällig, dass es über zwei Prozessverwaltungsmethoden verfügt. Ähnlich wie bei Apache kann auch die Anzahl seiner Prozesse je nach Einstellungen in dynamisch und statisch unterteilt werden.

php-fpm verfügt derzeit über zwei Hauptzweige, die der Version von PHP-5.2.x und der Version von PHP-5.3.x entsprechen. In der Version 5.2.x verwendet php-fpm.conf das XML-Format, in der neuen Version 5.3.x hat es jedoch denselben Konfigurationsstil wie php.ini.
In Version 5.2.x behauptet php-fpm.conf, zwei Stile für die Prozessverwaltung zu haben, einer ist statisch und der andere ähnelt dem Apache-Stil (Apache-ähnlich). php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache风格(apache-like)的。

相关学习推荐:php编程(视频)

代码如下:

Process manager settings
<value name=”pm”>
Sets style of controling worker process count.
Valid values are &#39;static&#39; and ‘apache-like&#39;
<value name=”style”>static</value>

按照文档的说明,如果pm的style采用apache-like,启动的进程数应该是和StartServers指定的一样。不过经过数次的尝试,会发现,实际上在这里将pm的style配置成apache-like没有起任何作用。也就是说,这里的apache-like并没有被实现。
不过,在最新的5.3.x的配套php-fpm中,apache风格的进程管理已经被实现了。

代码如下:

; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in &#39;idle&#39;
; state (waiting to process). If the number
; of &#39;idle&#39; processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in &#39;idle&#39;
; state (waiting to process). If the number
; of &#39;idle&#39; processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
;pm = dynamic
pm = static

由上面一段文字可知,对于进程的管理存在两种风格——static和dynamic。和之前的版本的进程管理其实还是一样的,只是将apache-like改成了dynamic,这样更容易理解。

如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。
如果设置成dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。

这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。

这里先说一下涉及到这个的几个参数,他们分别是pmpm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers
pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。

下面4个参数的意思分别为:

代码如下:

pm.max_children:静态方式下开启的php-fpm进程数量。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。

数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。

或者使用动态方式,因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers

Verwandte Lernempfehlungen: php-Programmierung

(Video)

Der Code ist wie folgt folgt: 🎜 🎜rrreee🎜Wenn der PM-Stil laut Dokumentation Apache-like annimmt, sollte die Anzahl der gestarteten Prozesse mit der von StartServers angegebenen Anzahl übereinstimmen. Nach mehreren Versuchen werden Sie jedoch feststellen, dass die tatsächliche Konfiguration des PM-Stils auf Apache-like keine Wirkung hat. Mit anderen Worten, Apache-like wurde hier nicht implementiert. 🎜In der neuesten Version 5.3.x, die PHP-FPM unterstützt, wurde jedoch eine Prozessverwaltung im Apache-Stil implementiert. 🎜🎜Der Code lautet wie folgt:🎜🎜rrreee🎜Wie aus dem obigen Absatz ersichtlich ist, gibt es zwei Arten des Prozessmanagements – statisch und dynamisch. Die Prozessverwaltung ist tatsächlich dieselbe wie in der vorherigen Version, außer dass Apache-ähnlich in dynamisch geändert wurde, was einfacher zu verstehen ist. 🎜🎜Wenn es auf „statisch“ eingestellt ist, entspricht die Anzahl der PHP-FPM-Prozesse immer der durch pm.max_children angegebenen Anzahl und erhöht oder verringert sich nicht. 🎜Wenn auf dynamisch eingestellt, ist die Anzahl der PHP-FPM-Prozesse dynamisch. Wenn mehr Anfragen vorliegen, wird sie automatisch erhöht, um sicherzustellen, dass die Anzahl der inaktiven Prozesse nicht kleiner als pm.min_spare_servers: Wenn die Anzahl der Prozesse groß ist, wird eine entsprechende Bereinigung durchgeführt, um sicherzustellen, dass die Anzahl der redundanten Prozesse nicht mehr als pm.max_spare_servers beträgt. 🎜🎜Diese beiden unterschiedlichen Prozessverwaltungsmethoden können an die tatsächlichen Anforderungen des Servers angepasst werden. 🎜🎜Hier sind die Parameter, die dabei beteiligt sind: pm, pm.max_children, pm.start_servers, pm.min_spare_servers und pm.max_spare_servers. 🎜pm bedeutet, welche Art und Weise verwendet werden soll. Es stehen zwei Werte zur Auswahl: statisch oder dynamisch. In älteren Versionen wurde Dynamic als apache-like bezeichnet. Bitte beachten Sie hierzu die Beschreibung der Konfigurationsdatei. 🎜🎜Die folgenden vier Parameter haben folgende Bedeutung:🎜🎜Der Code lautet wie folgt:🎜🎜rrreee🎜Wenn dm auf „statisch“ eingestellt ist, dann nur der pm.max_children Der Parameter wird wirksam. Das System startet eine festgelegte Anzahl von PHP-FPM-Prozessen. 🎜Wenn dm auf dynamisch eingestellt ist, ist der Parameter pm.max_children ungültig und die nächsten drei Parameter werden wirksam. Das System startet pm.start_servers php-fpm-Prozesse, wenn php-fpm gestartet wird, und passt dann dynamisch die Anzahl der php-fpm-Prozesse zwischen pm.min_spare_servers und pm.max_spare_servers entsprechend den Anforderungen an System. 🎜🎜Welche Ausführungsmethode ist also besser für unseren Server? Tatsächlich weist das laufende PHP-Programm wie Apache nach der Ausführung mehr oder weniger Speicherverluste auf. Dies ist auch der Grund, warum ein PHP-FPM-Prozess zu Beginn nur etwa 3 MB Speicher belegt und nach einiger Zeit auf 20 bis 30 MB ansteigt. 🎜Für Server mit großem Speicher (z. B. 8 GB oder höher) ist es tatsächlich angemessener, statisches max_children anzugeben, da dies keine zusätzliche Kontrolle der Prozessnummer erfordert und die Effizienz verbessert. Da ein häufiger Wechsel des PHP-FPM-Prozesses zu Verzögerungen führt, ist es besser, die statische Funktion zu aktivieren, wenn der Speicher groß genug ist. 🎜🎜Die Menge kann auch basierend auf Speicher/30 MB ermittelt werden. Beispielsweise kann 8 GB Speicher auf 100 eingestellt werden, dann kann der von PHP-FPM verbrauchte Speicher auf 2G-3G gesteuert werden. Wenn der Speicher etwas kleiner ist, z. B. 1 GB, ist die Angabe einer statischen Anzahl von Prozessen der Stabilität des Servers förderlicher. Dadurch kann sichergestellt werden, dass PHP-FPM nur genügend Speicher erhält und anderen Anwendungen eine kleine Menge Speicher zur Verwendung zuweist, wodurch das System reibungsloser läuft. 🎜🎜Bei einem Server mit kleinem Speicher, z. B. einem VPS mit 256 MB Speicher, verbrauchen 10 PHP-CGI-Prozesse 200 MB Speicher, selbst wenn die Berechnung auf 20 MB Speicher basiert, und der Systemabsturz sollte dann normal sein. Daher sollten Sie versuchen, die Anzahl der PHP-FPM-Prozesse so weit wie möglich zu kontrollieren. Nachdem Sie den von anderen Anwendungen belegten Speicher grob geklärt haben, wird das System stabiler, indem Sie ihm eine statische kleine Zahl zuweisen. 🎜🎜Oder verwenden Sie die dynamische Methode, da die dynamische Methode redundante Prozesse beendet und Speicher recyceln und freigeben kann. Daher wird empfohlen, sie auf Servern oder VPS mit weniger Speicher zu verwenden. Die spezifische Höchstmenge wird basierend auf Speicher/20 MB ermittelt. Für einen 512-MB-VPS wird beispielsweise empfohlen, pm.max_spare_servers auf 20 zu setzen. Für pm.min_spare_servers wird empfohlen, ihn entsprechend der Auslastung des Servers festzulegen. Ein geeigneterer Wert liegt zwischen 5 und 10. 🎜🎜🎜Verwandte Empfehlungen: 🎜Programmiervideokurse🎜🎜🎜

Das obige ist der detaillierte Inhalt vonDie von Nginx verwendete PHP-FPM-Prozessverwaltungsmethode und -optimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen