cgroup+supervistor隔离守护php-fpm

又开始讲故事了,前言部分,喝着茶水看着报纸,然后手机嗡嗡作响,不用想肯定不是美女求助,尼玛坑爹的报警。

看了下原因,由于多个小业务混跑,一个业务由于数据库读写问题导致整个php池被打满。然后所有的小业务都半死。。。 数据库读写的问题暂且不论,毕竟不是专业dba,就环境隔离搞了cgroup+supervistor。期间遇到了些问题,值得有些同学借鉴。

######################################################

cgroup 与 supervistor详细介绍省略。

为啥是这个组合:cgroup做资源隔离。supervistor做服务守护。为啥在一起,因为缘分。。。 因为一个参数的原因,下面会揭晓。

首先安装:

yum install libcgroup bcgroup-tools

yum install supervisor

如果yum源里没有,就配置个epel源 或者 阿里源  参照这个

然后说配置:

cgroup:

/etc/cgconfig.conf

group SIXTY {                                      #组名
    cpu {                                          #子系统  有哪些子系统可做隔离 参照命令 # lssubsys 
            cpu.shares = 6000;                     #cpu配额,单独配置无效,需要与其他组配额一起生效。例如本次配置share有 6000,3000,1000三个档位,分别用于不用的服务池资源。这里6000占用系统cpu的60%,或者理解为60%的cpu计算资源,当其他组占用少时可以更多的占用,竞争出现才有限制效果。
            #cpu.cfs_quota_us =  200000;           #cpu基于cfs算法的配额时间片,例如周期起100000,时间片为200000那么可以同时占用2个cpu周期。这两个配合使用,可以限制cpu计算资源的绝对值,而share是相对值
            #cpu.cfs_period_us = 100000;           #单核cpu的时间周期
    }  
    memory {
            memory.soft_limit_in_bytes=10G;        #内存软限制
            memory.limit_in_bytes=20G;             #内存硬限制
            memory.swappiness=0;                   #是否交换
            memory.oom_control=0;                  #到达内存硬限制是否oom kill,0表示kill,1表示等待内存释放,期间其他进程阻塞。在组内的表现为夯住。 这就是上面说的缘分参数,设置了oom kill,又要保证服务只能引入守护。
            
            }   
             }
             group THIRTY {    
    cpu {  
            cpu.shares = 3000;
    }  
    memory {    
            memory.soft_limit_in_bytes=5G;    
            memory.limit_in_bytes=10G;  
            memory.swappiness=0;  
            memory.oom_control=0;  
            } 
                        }
group TEN {    
    cpu {  
            cpu.shares = 1000;
    }  
    memory {    
            memory.soft_limit_in_bytes=1G;    
            memory.limit_in_bytes=2G;  
            memory.swappiness=0;  
            memory.oom_control=0;  
            } 
                        }

supervistor配置:

/etc/supervisord.d/php-fpm.ini

[program:php-fpm]
directory=/var/supervisord/
stdout_logfile=/var/supervisord/php-fpm.log
command=/etc/init.d/php-fpm start               #脚本启动
#command= /usr/local/sbin/php-fpm  --fpm-config /etc/php-fpm9000.conf --pid /var/run/php-fpm9000.pid   #命令启动 跟脚本启动有区别
autostart=true                                  #随supervistor自动启动
autorestart=true                                #服务挂了释放重启服务
startsecs=5                                     #启动成功判断周期
priority=1                                      #启动优先级  低者优先
user=root
#stopasgroup=true
killasgroup=true                                #重启的时是否kill被守护进程的子进程,如果不,这些进程会变成孤儿进程被init接管。例如守护php-fpm,其实只是守护master进程。如果退出不kill 子进程,会出现重启失败的问题。
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20

php-fpm启动命令 或者脚本修改,不能后台deam运行:

php-fpm.conf 中 daemonize = no  必须是no

如果命令启动  不能用 --daemonize  supervistor的cmd可以配置为:/usr/local/sbin/php-fpm  --fpm-config /etc/php-fpm9000.conf --pid /var/run/php-fpm9000.pid  

脚本启动需要修改启动命令为:

                cgexec -g memory:GROUP1 -g cpu:GROUP1 exec $php_fpm_BIN   $php_opts
                #exec $php_fpm_BIN   $php_opts
                #$php_fpm_BIN --daemonize $php_opts

注意exec 这个是必须的,最下面的详解中不用exec启动的现象,欢迎尝试,至于为什么请大家看下exec运行命令的特点,欢迎留言区讨论哈。

不能用守护进程启动的原因:

deamonize参数,表示master进程以守护进程启动。根据supervistor的文档:被守护的进程(php-fpm),不能以守护进程(deamon)的形式运行。这是由于守护进程通常在fork子进程后会终结父进程,也就是supervistor创建的父进程退出,此时,supervistor无法再健康已经退出的进程fork的子进程。关于deamon,可以参考Linux Daemon Writing HOWTO

配置说完,就是启动了:

service cgconfig restart

service cgred restart

service supervisord start

当然 还会涉及php分池的问题,也就是启动多个php-fpm master  监听多个端口,然后就是修改nginx配置, 这应该都不是事。所以我也懒得写啦 理解下哈。

######################################################

然后说下其中遇到的一些问题:

查看status,退出太快了。。:

php-fpm    FATAL   Exited too quickly (process log may have details)

supervistor重启php-fpm报错 异常终止:

php-fpm:ERROR (abnormal termination)

原因:

exit quickly是由于脚本启动,使用--deamon参数。启动后直接退出导致pid存在。在supervistor的包活周期内检测到退出然后报错。

restart 发现php-fpm未正常退出,也就是上面说的deamon的问题。注意这里master进程的PPID是1 父进程也就是脚本已经退出。

解决办法:

最上面已经说了  不使用--deamon    然后脚本启动要使用exec


supervistor 的killasgroup 参数可以kill被守护进程的子进程,但是子进程的子进程是无能为力的


######################################################

然后是cgroup的一些实验 以及一些其他截图

一个申请内存的简单的程序:

#vim  oom.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    int max = -1;
    int mb = 0;
    char *buffer;
    int i;
#define SIZE 100
    unsigned int *p = malloc(1024 * 1024 * SIZE);
    printf("malloc buffer: %p\n", p);
    for (i = 0; i < 1024 * 1024 * (SIZE/sizeof(int)); i++) {
        p[i] = 123;
        if ((i & 0xFFFFF) == 0) {
            printf("%dMB written\n", i >> 18);
            usleep(100000);
        }
    }
    pause();
    return 0;
}

注意编译下:

gcc oom.c

然后运行就是这样的了:

申请占用100M内存

修改了下程序中size  然后编译 能够申请500M

简单的cgroup隔离了下内存 这里申请内存失败 然后夯住了 也就是上面说到的oom kill是否开启的问题。如果不开启这里不能进行操作。完全夯死。

这是share  2000:1000的对比图

这是php启动脚本中修改后命令:

最后是已经搞定的图,重启是好用的:

####################################################

感谢看到最后,打铁到24:00   我要去补觉 !!!!!!!!!!!

原文地址:http://blog.51cto.com/welcomeweb/2136875

时间: 2024-10-04 07:14:41

cgroup+supervistor隔离守护php-fpm的相关文章

jstorm的cgroup资源隔离机制

本文研究一下jstorm使用cgroup做资源隔离的情况,github有文档: https://github.com/alibaba/jstorm/wiki/%E8%B5%84%E6%BA%90%E7%A1%AC%E9%9A%94%E7%A6%BB 这个文档告诉你怎么开启cgroup,但对于不太了解cgroup和jstorm细节的同学可能更有兴趣看一下到底是怎么隔离的. 废话少说,你不是告诉我cgroup做资源隔离吗?你回答我两个问题: 1.什么是cgroup 2.jstorm怎么用cgroup

【转载】Linux cgroup资源隔离各个击破之 - cpu隔离1

Linux cgroup 有两个子系统支持CPU隔离.一个是cpu子系统,另一个是cpuset子系统. cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法 .1. 完全公平调度 Completely Fair Scheduler (CFS)原理详见https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txtCFS用于处理以下几种进程调度策略SCHED_OTHERSCHED_BATCHSCHED_IDL

【转载】Linux cgroup资源隔离各个击破之 - io隔离

Linux Cgroup blkio子系统的用法.   blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重分配IO处理的时间片,从而达到IO在各资源组直接的调度和限制的目的,权重取值范围100-1000.通过以下两个文件进行配置. blkio.weight 默认值 blkio.weight_device 块设备级的值 (major:minor weight) (优先级高于blkio.weight) 例子

[转]Greenplum 资源隔离的原理与源码分析

摘要: 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的硬件资源,所以并发一多的话,query相互之间的资源争抢就比较严重. Greenplum资源隔 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的硬件资源,所

CGroup 介绍、应用实例及原理描述(已发表于IBM开发者论坛)

原文请查看:http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制.2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离

centos6 cgroup及cgred简介和简单使用

一.cgroup简介 Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers).在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.

[翻译和注解]Kafka Streams简介: 让流处理变得更简单

Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Kafka Streams还没有正式发布,所以具体的API和功能和0.10.0.0版(2016年6月发布)有所区别.但是Jay Krpes在这简文章里介绍了很多Kafka Streams在设计方面的考虑,还是很值得一看的. 以下的并不会完全按照原文翻译,因为那么搞太累了……这篇文件的确很长,而且Jay

电商峰值系统架构设计--转载

1.1 系统架构设计目录 摘要:双11来临之际,<程序员>以“电商峰值系统架构设计”为主题,力邀京东.当当.小米.1号店.海尔商城.唯品会.蘑菇街.麦包包等电商企业,及商派.基调网络等服务公司,分享电商峰值系统架构设计的最佳技术实践. 自2009年11月11日,淘宝商城(现名天猫)拉开网购狂欢节的序幕,各大电商的促销浪潮此起彼伏.此时的电商大战不仅是价格之争,更是技术的较量.如何设计电商峰值系统来更好地满足用户蜂拥而至的访问,如何在海量数据处理中实时发现有效信息并转化为商机,成为众多电商企业密

Docker虚拟化实战学习——基础篇(转)

Docker虚拟化实战学习--基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker Docker虚拟化实战和企业案例演练 深入剖析虚拟化技术概念和应用场景 虚拟化,一是项技术--,是一种资源解决方案. 虚拟化技术是将物理资源转变为逻辑上可以管理的资源,以打破物理结构之间的壁垒,使计算元件运行在虚拟的基础上,而不是真实的物理资源上. 通过虚拟化技术,可以将物理资源转变为逻辑资源(虚拟机),应用程序服务运行在虚拟资源上,而不是真实的物理机上.