PHP-FPM のメモリ使用量を削減するソリューションの紹介
概要: PHP-FPM は、PHP 用の FastCGI プロセス マネージャーです。 Unix 系オペレーティング システム (Linux および BSD システムを含む) では、php5-fpm (Linux) または php56-fpm (FreeBSD 10.1) をインストールすることで PHP-FPM が使用されます。しかし、デフォルトのインストールと多くのブログで推奨されているようにインストールされた PHP-FPM の最大の問題は...
PHP-FPM
是PHP
的FastCGI
过程管理器。在类Unix
操作系统(包括Linux
以及BSD
系统)中,PHP-FPM
通过安装php5-fpm
(Linux
)或者php56-fpm
(FreeBSD 10.1
) を使用することです。
ただし、デフォルトでインストールされ、多くのブログの推奨に従ってインストールされますPHP-FPM
最大の問題は、メモリやフォントファミリーを含む大量のリソースを消費することです。「Source Code Pro」、Consolas、Menlo、Monaco、「Courier New」、font-size: 0.93em; -sizing: ボーダーボックス; 背景色: rgb(249, 242, 244);">CPU。このブログが使用していたサーバーも同様の運命をたどりました。私もこれらのチュートリアルに従ってインストールしたため、チュートリアルでは、PHP-FPM
設定オプションが十分に効果的に説明されていません。 PHP-FPM
的最大问题是它会消耗大量资源,包括内存和CPU
。本博客使用的服务器也遭遇了类似的命运。因为我也是按照那些教程安装的,而教程里对于PHP-FPM
的配置选项描述的不够有效。
你可以在/etc/php5/fpm/pool.d
目录下发现这些低效的配置选项。举例来说,以下是我的服务器(当然不是目前这个站点)上的那些低效选项:
; Choose how the process manager will control the number of child processes. pm = dynamic pm.max_children = 75pm.start_servers = 10pm.min_spare_servers = 5pm.max_spare_servers = 20pm.max_requests = 500
那台服务器是一台DigitalOcean Droplet
,配置512M
内存。它上面运行了一个新网站,即使完全空闲时,也必须要靠交换内存才能避免僵死。执行top
/etc/php5/fpm/pool.d
ディレクトリこれらの非効率的な構成オプションを以下に示します。たとえば、私のサーバー (もちろん現在のサイトではありません) 上の非効率なオプションは次のとおりです: 🎜PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13891 cont 20 396944 56596 33416 S 0.0 11.3 :14.05 php5-fpm 13889 cont 20 396480 56316 32916 S 0.0 11.2 :17.67 php5-fpm 13887 cont 20 624212 55088 32008 S 0.0 11.0 :14.02 php5-fpm 13890 cont 20 396384 55032 32312 S 0.0 11.0 :13.39 php5-fpm 13888 cont 20 397056 54972 31988 S 0.0 11.0 :14.16 php5-fpm 14464 cont 20 397020 54696 31832 S 0.0 10.9 :09.44 php5-fpm 13892 cont 20 396640 54704 31936 S 0.0 10.9 :12.84 php5-fpm 13883 cont 20 396864 54692 31940 S 0.0 10.9 :15.64 php5-fpm 13893 cont 20 396860 54628 32004 S 0.0 10.9 :15.13 php5-fpm 13885 cont 20 396852 54412 32116 S 0.0 10.8 :13.94 php5-fpm 13884 cont 20 395164 53916 32364 S 0.0 10.7 :13.51 php5-fpm 13989 cont 20 394960 53548 32108 S 3.7 10.7 :14.37 php5-fpm 2778 mysql 20 1359152 31704 1728 S 0.7 6.3 1:38.80 mysqld 13849 root 20 373832 1180 188 S 0.0 0.2 :03.27 php5-fpm
DigitalOcean ドロップレット
、構成 512M
メモリ。その上で新しい Web サイトが実行されており、完全にアイドル状態の場合でも、フリーズを避けるためにメモリをスワップする必要がありました。実行top
コマンドは、サーバー上で最も多くのメモリを使用しているプロセスを表示します。 🎜PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13891 cont 20 396944 56596 33416 S 0.0 11.3 :14.05 php5-fpm 13889 cont 20 396480 56316 32916 S 0.0 11.2 :17.67 php5-fpm 13887 cont 20 624212 55088 32008 S 0.0 11.0 :14.02 php5-fpm 13890 cont 20 396384 55032 32312 S 0.0 11.0 :13.39 php5-fpm 13888 cont 20 397056 54972 31988 S 0.0 11.0 :14.16 php5-fpm 14464 cont 20 397020 54696 31832 S 0.0 10.9 :09.44 php5-fpm 13892 cont 20 396640 54704 31936 S 0.0 10.9 :12.84 php5-fpm 13883 cont 20 396864 54692 31940 S 0.0 10.9 :15.64 php5-fpm 13893 cont 20 396860 54628 32004 S 0.0 10.9 :15.13 php5-fpm 13885 cont 20 396852 54412 32116 S 0.0 10.8 :13.94 php5-fpm 13884 cont 20 395164 53916 32364 S 0.0 10.7 :13.51 php5-fpm 13989 cont 20 394960 53548 32108 S 3.7 10.7 :14.37 php5-fpm 2778 mysql 20 1359152 31704 1728 S 0.7 6.3 1:38.80 mysqld 13849 root 20 373832 1180 188 S 0.0 0.2 :03.27 php5-fpm
输出结果显示有12
个php5-fpm
子进程(用户名是cont
)和一个主进程(用户名是root
)。而这12
个子进程只是呆坐在那里,什么事也不做,每个子进程白白消耗超过10%
的内存。这些子进程主要是由pm=dynamic
这个配置选项产生的。
老实说,绝大部分的云主机拥有者也不知道所有这些配置选项是干什么用的,只是简单地复制粘贴而已。我也不准备假装我了解每个PHP
配置文件里的每一个选项的目的和意义。我在很大程度上也是复制粘贴的受害者。
但是我经常检查服务器的资源占用情况,困惑于为什么我的服务器占用这么多的内存和CPU
。举另外一个例子,是这台服务器上的free -mt
命令的结果:
total used free shared buffers cached Mem: 490 480 9 31 6 79 -/+ buffers/cache: 393 96 Swap: 2047 491 1556 Total: 2538 971 1566
在没有任何访问量的情况下,也几乎有整整1G
的内存(实际内存加上交换内存)被占用。当然,通过调整配置pm
的数量可以有所改变,但只是轻微的。只要设置pm=dynamic
,就会有空闲的子进程等在那里等待被使用。
直到读了一篇文章《A better way to run PHP-FPM
》(更好地运行PHP-FPM
)之后,我开始意识到应该如何修改我的配置文件。那篇文章是大约一年前写的,令人失望的是我从昨天晚上搜索相关主题时才看到它。如果你也有服务器并且使用PHP-FPM
的话,我建议你好好读一下那篇文章。
读完文章之后,我修改了我的pm
选项,如下:
; Choose how the process manager will control the number of child processes.pm = ondemand pm.max_children = 75pm.process_idle_timeout = 10s pm.max_requests = 500
最主要的改动就是用pm=ondemand
替换了pm=dynamic
。这一改动对资源占用的影响是巨大的。下面是改动并重新加载php5-fpm
之后运行free -mt
的结果:
total used free shared buffers cached Mem: 490 196 293 28 9 70 -/+ buffers/cache: 116 373 Swap: 2047 452 1595 Total: 2538 649 1888
和之前的结果对比,内存使用量下降了50%
。产生这一下降的原因通过执行top
命令一目了然:
2778 mysql 20 1359152 56708 3384 S 0.0 11.3 2:11.06 mysqld 26896 root 20 373828 19000 13532 S 0.0 3.8 :02.42 php5-fpm 25818 root 20 64208 4148 1492 S 0.0 0.8 :01.88 php5-fpm 25818 root 20 64208 4148 1492 S 0.0 0.8 :01.88 php5-fpm 17385 root 20 64208 4068 1416 S 0.0 0.8 :02.23 php5-fpm 1465 ossec 20 15592 2960 480 S 0.0 0.6 :08.60 ossec-analysisd 1500 root 20 6312 2072 328 S 0.0 0.4 :45.55 ossec-syscheckd 1 root 20 33444 1940 812 S 0.0 0.4 :03.29 init
你注意到这里已经没有子进程了吗?它们去哪里了?这就是设置pm=ondemand
的作用。这样设置之后,只有当有需要的时候,子进程才会被产生。事情做完之后,子进程会留在内存中10
秒钟时间(pm.process_idle_timeout = 10s
),然后自己退出。
我只是对PHP-FPM
的配置做了一点小小的修改,就节省了50%
的内存。当然,这台服务器没有承受大并发的压力,但我相信它能顶得住合理的高负载,考虑到它只有512M
内存。再加上Nginx
微缓存的配置,我想它会做的更好。当然还有另外一些PHP-FPM
和Percona MySQL
的配置优化我还没有做。这里只是给大家分享一个我觉得非常有用的小窍门。
以上がPHP-FPM のメモリ使用量を削減するソリューションの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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