探求PHP-FPM最佳运行模式

我们安装php,在配置PHP-FPM的时候一般搜到的配置,大多数都是一样的,推荐你使用’dynamic’进程管理(process manager,在配置中简称位pm)模式来运行。虽然这没什么问题,但是本文将会探究最佳运行模式。

为什么要选择’ondemand’来代替’dynamic’来做为进程管理器

在大多数的配置指南中,都是这样配置的,然后你会直接复制粘贴放在你的配置文件中。

[pool_name]
...
pm = dynamic
pm.max_children = 200
pm.start_servers = 50
pm.min_spare_servers = 20
pm.max_spare_servers = 40
pm.max_requests = 500

这个时候你将如何配置最小和最大的进程数?这些指南其实也是盲目进行类配置,比如上面的列子中,每个pool中运行50个子进程(pm.start_servers=50)。如果你是一个流量相当低的站点,其实是相当浪费的。比如你的服务器上,用top看进程,显示是这样的:

...
root 3986 4704 ? Ss 19:04 0:00 php-fpm: master process (/etc/php-fpm.conf)
www 3987 4504 ? S 19:04 0:00 \_ php-fpm: pool pool_name
www 3987 4504 ? S 19:04 0:00 \_ php-fpm: pool pool_name
www 3987 4504 ? S 19:04 0:00 \_ php-fpm: pool pool_name
...

不管你的php是否在使用,这50个子进程将运行着。

Ondemand Process Manager

在我不断的摸索中,对每一个pm进行测试后,发现ondemand的模式,是最好的。可惜的是,关于这方面的文档实在太少了。为什么要推荐?根据字面意思,ondemand就是按需加载,是根据你的需求来调用的。而且配置起来也是相当的简单。

[pool_name]
...
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s
pm.max_requests = 500

需要启用’ondemand’需要在PHP5.3.8之后,改后配置,重启php,在进程列表中是这样的。

root 3986 4704 ? Ss 19:04 0:00 php-fpm: master process (/etc/php-fpm.conf)

只有一个PHP-FPM的主进程运行着,不会预先载入很多个子进程,当有调用的时候,它会自动启用,最多会启用50个子进程(是根据pm.max_children)。因此当有2个请求的时候,进程列表中会这样显示:

...
root 3986 4704 ? Ss 19:04 0:00 php-fpm: master process (/etc/php-fpm.conf)
www 3987 4504 ? S 19:04 0:00 \_ php-fpm: pool pool_name
www 3987 4504 ? S 19:04 0:00 \_ php-fpm: pool pool_name

而配置中的”pm.process_idle_timeout”,当你的进程空闲挂起,没有再被请求的时候,它将会被自动回收。

当然这里需要说明的是,如果你的站点是时时运行在高请求模式下,’ondemand’可能不太适合于你。因为预先启动最大PHP-FPM子进程,可以让所有的请求直接进行处理,而不需要等待进程的启动。而90%的站点,可能选择’ondemand’会比’static’或者’dynamic’要好很多。

Leave a Comment

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

%d bloggers like this: