Maison  >  Article  >  développement back-end  >  À propos de la gestion des numéros de processus de php-fpm

À propos de la gestion des numéros de processus de php-fpm

不言
不言original
2018-07-13 16:03:102964parcourir

Cet article présente principalement la gestion des numéros de processus de php-fpm, qui a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

PHP-FPM

Commençons par comprendre quelques concepts de noms :

est CGI, un protocole utilisé pour permettre aux programmes interactifs de communiquer avec des serveurs Web. Il est responsable du traitement des demandes d'URL, du démarrage d'un processus, de la prise en entrée des données envoyées par le client. Le serveur Web collecte la sortie du programme et ajoute les en-têtes appropriés, puis la renvoie au client. Common Gateway Interface(通用网管协议)

est une version améliorée du protocole basé sur FastCGI Au lieu de créer un nouveau processus pour répondre aux demandes, il utilise des processus persistants et crée des processus enfants pour gérer une série de processus. géré par le serveur FastCGI Management, moins de surcharge et plus efficace. CGI

est PHP-FPM implémenté par PHP, qui est utilisé pour remplacer la plupart des fonctions supplémentaires de FastCGI Process Manager(FastCGI进程管理器) et convient aux sites Web à forte charge. Fonctions prises en charge telles que : PHP FastCGI

  1. Fonction avancée de gestion des processus avec arrêt/démarrage en douceur

  2. Script de journalisation lente

  3. Génération de sous-processus dynamique/statique
  4. Le fichier de configuration basé sur php.ini
a été intégré après 5.4 In le code source PHP, une meilleure méthode de gestion des processus PHP est fournie, qui peut contrôler efficacement la mémoire et le processus et recharger en douceur la configuration PHP. Si vous avez besoin de l'utiliser, apportez simplement le paramètre

lorsque PHP-FPM Utilisez ./configure pour contrôler le processus -enable-fpm : PHP-FPMFastCGI

// 支持start/stop/quit/restart/reload/logrotate参数
// quit/reload是平滑终止和平滑重新加载,即等现有的服务完成
./php-fpm --start
Configuration

PHP-FPM.

Le fichier de configuration est

Dans ce fichier de configuration, nous devons connaître certains paramètres. Tous les sous-processus ci-dessous font référence au processus PHP-FPM, qui peut être consulté via php-fpm.conf dans le terminal. php-fpmps aux | grep php

    Affiche le sous-processus de travail représentatif de
  • (traitant réellement les demandes)

    php-fpm: pool www

  • Affiche le processus principal représentatif de
  • ( responsable de la gestion) sous-processus de travail)

    php-fpm: process master

  • Configuration globale

Regardez d'abord la

partie de configuration globale la plus importante :

PHP-FPM

emergency_restart_thresholdSi le signal de sortie

ou

est reçu le nombre de fois défini par ce paramètre dans le délai défini par emergency_restart_interval, SIGSEGV redémarrera. La valeur par défaut est 0, ce qui signifie désactiver cette fonction. SIGBUSFPM

emergency_restart_intervalDéfinissez l'intervalle de redémarrage en douceur pour aider à résoudre le problème de l'utilisation de la mémoire partagée dans l'accélérateur. Unités disponibles

, la valeur par défaut est 0, signifie désactivée.

s(默认)/m/h/d

process.max

Le nombre maximum de processus enfants pouvant être créés. Il contrôle le nombre global de processus enfants lors de l'utilisation de plusieurs pools de processus

configurés FPM. . La valeur par défaut est 0, ce qui signifie aucune limite. pm = dynamicphp-fpm poolConfiguration du pool de processus Le reste de la configuration de

est une zone nommée

La configuration de cette zone définit chaque PHP-FPM pool de processus. Processus enfants liés à la série. Cette partie commence toujours par Pool Definitions, comme PHP-FPM. [进程池名称][www]À ce stade, on peut expliquer que

est affiché dans

. ps aux | grep phpphp-fpm: pool www

pm

fait référence à

, spécifiant comment le gestionnaire de processus contrôle le nombre de processus enfants. Il est obligatoire et prend en charge 3 valeurs : pm process manager.

  •  : utiliser un nombre fixe de processus enfants, spécifié par

    staticpm.max_children

  •  : ajuster dynamiquement le nombre de processus enfants en fonction des éléments suivants nombre de paramètres, avec au moins un processus enfant

    dynamic

    •  : Le nombre maximum de processus enfants pouvant survivre simultanément

      pm.max_chidren

    • : Le nombre de processus enfants créés au démarrage. La valeur par défaut est

      pm.start_serversmin_spare_servers + max_spare_servers - min_spare_servers) / 2

    • : Le nombre minimum de processus enfants inactifs. le nouveau processus enfant sera automatiquement créé

      pm.min_spare_servers

    •  : le nombre maximum de processus enfants inactifs s'il est dépassé, certains processus enfants seront tués

      pm.max_spare_servers

      <.>
    : Le processus enfant ne sera pas créé au démarrage, il le sera à l'arrivée d'une nouvelle requête. Les deux paramètres suivants seront utilisés :
  • ondemand

    • pm.max_children

    • t Le timeout d'inactivité du processus enfant, s'il expire Lorsque le délai expire et qu'aucune nouvelle demande ne peut être traitée, il sera tué

pm.max_requests

每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。在解决第三方库的内存泄漏问题时,这个参数会很有用。默认值为0,指子进程可以持续不断的服务请求。

PHP-FPM配置优化

PHP-FPM管理的方式是一个master主进程,多个pool进程池,多个worker子进程。其中每个进程池监听一个socket套接字。具体的图示:

À propos de la gestion des numéros de processus de php-fpm

其中的worker子进程实际处理连接请求,master主进程负责管理子进程:

1. `master`进程,设置1s定时器,通过`socket`文件监听
2. 在`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 = 10
emergency_restart_interval = 1m

进程数调优

每一个子进程同时只能服务一次连接,所以控制同时存在多少个进程数就很重要,如果过少会导致很多不必要的重建和销毁的开销,如果过多又会占用过多的内存,影响其他服务使用。

我们应该测试自己的PHP进程使用多少内存,一般来说刚启动时是8M左右,运行一段时间由于内存泄漏和缓存会上涨到30M左右,所以你需要根据自己的预期内存大小设定进程的数量。同时根据进程池的数量来看一个进程管理器的子进程数量限制。

测试平均PHP子进程占用的内存:

$ps auxf | grep php | grep -v grep
work     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     cached
Mem:           157        141         15          0          4        123
-/+ buffers/cache:         13        143
Swap:            0          0          0

可以看出我的服务器总得内存大小是157G(-g采用了G的单位)。

进程数限制

此时如果我们分配全部的内存给PHP-FPM使用,那么进程数可以限制在157000/27 = 5814,但是由于我的服务器同时服务了很多内容,所以我们可以向下调整到512个进程数:

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

防止内存泄漏

由于糟糕的插件和库,内存泄漏时有发生,所以我们需要对每一个子进程服务的请求数量做限制,防止无限制的内存泄漏:

pm.max_requests = 1000

重启

如果上面的配置都按照你的实际需求和环境配置好了,不要忘记重启PHP-FPM服务。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

对于PHP面向对象设计五大原则(SOLID)的总结

对于PhpStorm代码格式化设置的介绍

如何在yii2框架的di容器源码中了解反射的作用

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn