LightSailでのphp-fpmプロセス数を増やせるか調べてみた

Amazon Linux

↓の記事にて、
このブログを動かしているサーバーであるLightSailのインスタンスをメモリ1GBにしました。



メモリが512MBも増えたので、php-fpmプロセス数を増やせるか、空きメモリを調べました。
その確認方法などのメモになります。

結論から言うと、増やさずにこのままにしておくことにしました。

一定時間ごとに空きメモリ量を表示するスクリプトを動かします。
 ついでにhttpd/mysqld/php-fpmの使用メモリ量も表示。
awkでの算出には↓のサイトを大いに参考にさせていただきました。ありがとうございます。

メモリの共有分を考慮してApacheのメモリ使用量を割り出す - grep Tips *
ps auxの結果でてくるRSS(プロセスが実際に使用しているRAMの総メモリ量)の値を見て、Apacheのメモリ使用量を計算すると、Apach
#!/bin/bash

min=65535
min_time=''
loop=0
loop_per_day=17280 # 86400 / 5
export TZ="Asia/Tokyo"

declare -a processes=("httpd" "mysqld" "php-fpm")
declare -a max_mem=(0 0 0)

function get_max_mem_usage() {
	process=$1
	ps -ef | grep ${process} | grep -v root | grep -v grep | \
	while read line;
	do
		args=(${line});
		echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps \
		|awk 'BEGIN{rss=0;shared=0;private=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}/Private/{private+=$2;}END{printf("%.1f\t%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,private/1024,(rss-shared)/1024);}';
	done \
	| awk '{sum+=$5}END{print sum}'
}
	
while :
do
	now=`date`
	freemem=$(free -m  | grep ^Mem | tr -s ' ' | cut -d ' ' -f 7)
	if [ ${min} -gt ${freemem} ]; then
		min=${freemem}
		min_time=${now}
	fi
	echo ${now} | tee -a stat.txt
	echo "Current available is ${freemem}MB at ${now}, Minimum available is ${min}MB at ${min_time}" | tee -a stat.txt

	for process in ${processes[@]}
	do
		mem_usage=`get_max_mem_usage ${process}`
		echo "${process} uses"  ${mem_usage} "MB" | tee -a stat.txt
	done

	echo "" >> stat.txt
	if [ ${loop} -ge ${loop_per_day} ]; then
		min=65535
		min_time=''
		loop=0
	fi
	loop=$((loop+1))
	sleep 5
done



これを動かしながら、このブログにちょこちょこアクセスしたときの表示がこちら。
空きが174MB、php-fpmは152.9MB使用中ということで、php-fpmのプロセス数を増やしてメモリをさらに使うのには心もとないです。



php-fpmのプロセス数設定などはこの様になっています。

vim /opt/bitnami/php/etc/php-fpm.conf

pm=ondemand
pm.max_children=5
pm.process_idle_timeout=10



それぞれの設定の意味は以下の通り書かれています。

 ;  ondemand - no children are created at startup. Children will be forked when
 ;             new requests will connect. The following parameter are used:
 ;             pm.max_children           - the maximum number of children that
 ;                                         can be alive at the same time.
 ;             pm.process_idle_timeout   - The number of seconds after which
 ;                                         an idle process will be killed.



噛み砕くと、

起動時には子プロセスなし。
リクエストが来るたびに子プロセスをfork()する。
最大pm.max_childrenまで子プロセスを作る。
 それ以上リクエストが来ても子プロセスを作らない。
 (リクエストをバックログで待たせ、処理中リクエストが終わったら順次処理する)
子プロセスは10秒暇な時間ができると自動的にkillされる。
 → 空きメモリ量が増える。

となります。

ちなみにpmに設定できる値にはondemandの他にstatic/dynamicもあります。

staticは文字通りで、固定数の子プロセスを常時起動しておく方法。
リクエストのたびに子プロセスを起動しないので、応答時間が短くなることが期待されます。
また、システム内の空きメモリ量の見積もりなどもやりやすいでしょう。

;   static  - a fixed number (pm.max_children) of child processes;



dynamicは常時一定数の暇な子プロセスを待機させておく仕様。
設定するパラメーターがやや多く、変更には慎重な調査が要りそうです。
 上級者向け

;   dynamic - the number of child processes are set dynamically based on the
 ;             following directives. With this process management, there will be
 ;             always at least 1 children.
 ;             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 'idle'
 ;                                    state (waiting to process). If the number
 ;                                    of 'idle' processes is less than this
 ;                                    number then some children will be created.
 ;             pm.max_spare_servers - the maximum number of children in 'idle'
 ;                                    state (waiting to process). If the number
 ;                                    of 'idle' processes is greater than this
 ;                                    number then some children will be killed.

終わりに

いかがでしたか。

「こんな設定にしているよ」
などありましたら、ぜひコメントください!
 試行錯誤中…

Comments

タイトルとURLをコピーしました