目次
PHP-FPM
emergency_restart_interval## 以内に受信された場合#set time SIGSEGV または
作成できる子プロセスの最大数。複数の pm = Dynamic# を使用します。 ##php-fpm プール
PHP-FPM
pm.max_requests
保障基本安全
进程数调优
测试平均PHP子进程占用的内存:
查看服务器总的内存大小
进程数限制
防止内存泄漏
重启
ホームページ バックエンド開発 PHPチュートリアル php-fpmのプロセス番号管理について

php-fpmのプロセス番号管理について

Jul 13, 2018 pm 04:03 PM
cgi fastcgi php php-fpm

この記事では、参考値のあるphp-fpmのプロセス数管理を中心に紹介していますので、皆さんにも共有しておきますので、困っている方は参考にしてください

PHP-FPM

最初にいくつかの名詞の概念を理解しましょう:

CGICommon Gateway Interface (Common Network Management Protocol) であり、対話型プログラムとWeb サーバー通信用のプロトコル。 Web サーバーは、URL リクエストの処理、プロセスの開始、クライアントから送信されたデータの入力としての処理を担当し、Web サーバーはプログラムの出力を収集して適切なヘッダーを追加して、それをクライアントに送り返します。

FastCGI は、CGI に基づくプロトコルの拡張バージョンです。リクエストを処理する新しいプロセスを作成する代わりに、永続プロセスと作成された子プロセスを使用して処理します。これらのプロセスは FastCGI サーバーによって管理され、オーバーヘッドが少なく効率が高くなります。

PHP-FPM は、PHP FastCGI Process Manager (FastCGI Process Manager) の実装であり、PHP FastCGI# の置き換えに使用されます。 ## 追加機能のほとんどは、高負荷の Web サイトに適しています。サポートされている機能は次のとおりです。

    ##スムーズな停止/開始を実現する高度なプロセス管理機能
  1. 低速ロギング スクリプト
  2. 動的/静的サブプロセスの生成
  3. php.iniに基づく設定ファイル
  4. PHP-FPM
5.4 以降は PHP ソース コードに統合され、メモリとプロセスを効果的に制御し、PHP 設定をスムーズにリロードできる、より優れた PHP プロセス管理方法を提供します。これを使用する必要がある場合は、

./configure のときに -enable-fpm パラメータを指定し、PHP-FPM を使用して FastCGI# を制御します。 # #プロセス:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// 支持start/stop/quit/restart/reload/logrotate参数 // quit/reload是平滑终止和平滑重新加载,即等现有的服务完成 ./php-fpm --start</pre><div class="contentsignin">ログイン後にコピー</div></div>PHP-FPM 構成

PHP-FPM構成ファイルは

php-fpm.conf## です。 #, この設定ファイルでは、いくつかのパラメータを知る必要があります。以下のすべてのサブプロセスは

php-fpm プロセスを参照しており、ps aux | grep php を介してターミナル上で表示できます。 表示php-fpm: プールwww

は作業サブプロセスを表します(実際にリクエストを処理しています)
  • 表示php-fpm: プロセス マスター

    マスター メイン プロセスを表します (作業サブプロセスの管理を担当します)
  • グローバル構成

    最初に見てください
  • PHP-FPM
最も重要なグローバル構成部分:

emergency_restart_threshold

パラメータ設定の数が

emergency_restart_interval## 以内に受信された場合#set time SIGSEGV または

SIGBUS

終了信号、FPM が再起動します。デフォルト値は 0 で、これはこの機能をオフにすることを意味します。 emergency_restart_intervalスムーズな再起動間隔を設定して、アクセラレータの共有メモリ使用量の問題を解決します。使用可能な単位は

s (デフォルト)/m/h/d

で、デフォルト値は 0 (オフを意味します) です。

process.max

FPM

作成できる子プロセスの最大数。複数の pm = Dynamic# を使用します。 ##php-fpm プール

プロセス プールを構成する場合、子プロセスのグローバル数を制御します。デフォルト値は 0 で、制限がないことを意味します。

プロセス プール構成PHP-FPM の残りの構成は、プール定義

という名前の領域です。この領域の構成設定は次のとおりです。各

PHP-FPM

プロセス プール。プロセス プールは、関連する一連のサブプロセスです。この部分は、

[www] のように、[プロセス プール名] で始まります。 ps aux | grep phpphp-fpm: pool www が表示されると説明できます。

#pm##pm

プロセス マネージャー

を指し、プロセス マネージャーが子プロセスの数を制御する方法を指定します。これは必須であり、3 つの値をサポートします:

static: pm.max_children## で指定された固定数の子プロセスを使用します。

  • dynamic: 次のパラメータに基づいて子プロセスの数を動的に調整します。少なくとも 1 つの子プロセスが必要です。

  • 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

      : 子プロセスは起動時に作成されず、新しいリクエストが到着したときにのみ作成されます。次の 2 つのパラメータが使用されます:

  • pm.max_children

    • pm.process_idle_timeou
    • t 子プロセスのアイドル タイムアウト。タイムアウト後に新しいリクエストを処理できない場合、子プロセスは強制終了されます

pm.max_requests

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

PHP-FPM配置优化

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

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容器源码中了解反射的作用

以上がphp-fpmのプロセス番号管理についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles