php-fpm可以通过配置worker进程的数量等信息避免内存泄露。那我们该当如何去作出最优的配置呢。
观点
内存溢出
内存溢出便是用户进程向操作系统申请了一块内存,但是写入的内容却大于内存的大小。便是我们常见的OOM(out of memory)。
内存泄露
内存泄露便是用户进程向操作系统申请了一块内存,利用完成之后并不会开释该内存,造成该内存无法被操作系统回收再次被利用。便是我们常见的 Memory Leak。如果内存泄露长期堆积一定会耗尽内存,造成内存溢出。
php中内存溢出的场景整型越界
测试代码
<?php$i = 9223372036854775807;$j = $i + 1;var_dump($i,$j);
运行结果
php整型内存溢出
可以看到整型内存泄露,php并不会报错,只是将int类型转化为了float类型。
php-fpm内存泄露
测试代码
<?phpini_set("memory_limit", "4M");var_dump(ini_get("memory_limit"));$arr = [];while (true) { $arr[] = "hello world";}
运行结果
php-fpm设置的最大内存被耗尽
可以看到php-fpm许可的内存已经被花费殆尽 ,此时该php-fpm进程会被kill。
掌握php-fpm OOM的方法
php.ini配置文件内的 memory_limit 配置可以限定单个 php-fpm内利用内存的大小。
常日来说只要程序员开拓中把稳内存的花费,再加上 php-fpm 本身的 kill & fork 机制,很少会涌现内存溢出。
php-fpm的配置文件可以掌握 php-fpm 进程的数量。
php-fpm不仅仅只是掌握 worker 进程数量,还有 worker 进程的 kill & fork。如果一个 worker 进程一贯在运行,一定会涌现泄露,进而导致内存溢出。以是php-fpm进程通过一定的策略,kill worker进程,开释内存,内存重新被操作系统回收,然后 fork worker进程,操作系统重新分配内存给新的 worker 进程,这样就有效地防止了内存的溢出。
通过对 memory_limit 、php-fpm进程数量的掌握,就可以掌握 php-fpm 利用全体主机的内存大小。
php-fpm参数先容
php-fpm配置文件max_children掌握 worker 进程的最大数量。
php-fpm配置文件max_requests 最大处理多少要求就 kill & fork php-fpm。
php-fpm配置max_spare_children掌握最大空闲php-fpm数量。
php-fpm配置min_spare_children掌握最小空闲 php-fpm 数量。
php-fpm配置start_servers 启动是 php-fpm 进程数量。
php-fpm配置process_idel_timeout 空闲进程超时时间。