寻觅生命中的那一片浅草......

文章属于类别 Others

PHP的master与worker进程关系的一点纠结

纠结的起点

同事发了一篇文档,里面提及

  1. FPM 的 master 进程接收到请求
  2. master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502错误比较多的原因。

全文请参考: Nginx 与 FPM 的工作机制

我曾经认为Nginx也是由master负责派发请求给worker,但同事那边马上发了篇文档出来打脸,文章提到master只负责管理worker,如重启,重新加载配置文件,并不会派发请求。祥见:nginx平台初探

纠结过程

为什么我会纠结呢?

  1. 上面提到的Nginx
  2. fpm一开始其实是一个第三方管理软件,类似spawn-cgi,说白了就是负责启动php-cgi进程的,那PHP官方把它整合进来作为官方的php-cgi管理工具后,会委以「派发请求」这样的重任吗?

早上和同事一起纠结了一下,纠结过程如下:

  1. strace对比master和worker的行为,同事把Nginx和fpm都设置成了1个worker进程观察,得出结论是不会经过fpm的master进程
strace -e network -p fpm_master_pid
strace -e network -p fpm_worker_pid
  1. 放狗,发现另外一种说法,见:关于fastcgi和php-fpm的疑惑,引用如下

master进程并不接收和分发请求,而是worker进程直接accpet请求后poll处理.

master进程不断调用epoll_wait和getsockopt是用来异步处理信号事件和定时器事件.

这里提一下,Nginx也类似,master进程并不处理请求,而是worker进程直接处理, 不过区别在于Nginx的worker进程是epoll异步处理请求,而PHP-FPM仍然是poll.

  1. 把master干掉,看请求是否可以正常处理,经实际测试,master干掉后,worker依然在,请求也可以正常处理。
kill -HUP fpm_master_pid

其他

  1. worker进程数量不够的时候,显然是manager启动了更多进程,这个时候是manager怎么知道的

答:PHP源码分析 – PHP-FPM运行模式详解,看起来就是满足下面的条件就会执行 fpm_children_make

1. idle < pm_min_spare_servers
2. running_children < pm_max_children
3. MIN(MIN(idle_spawn_rate, pm_min_spare_servers - idle), pm_max_children - running_children) > 0
  1. nginx中配置的fastcgi_pass默认是fastcgi的监听端口,这个配置的意义是什么?

答:浅谈多进程程序的进程控制和管理方式,主要看「多进程下的套接字」,这段文字解释了为什么多进程不需要派发,因为它socket是多进程共享的

纠结论

fpm的master并不承担派发请求的角色。

特别鸣谢纠结侠:郑导(C好厉害)

其他资料

MegaCli64在线做RAID

Hadoop集群的2台机,分别有一个盘坏了

第一台机的raid卡是6/IR,直接换盘,开机做分区,格式化即可,而另外一台机是H700,需要对该盘做raid0,机房人员的技术水平实在不敢恭维,所以决定自己进系统后做raid。

换盘

主要是如何确定系统上的盘如何对应物理盘位,如果是sdc,则是从左到右第三块盘。

注意点:

  1. 开机后通过硬盘的uuid(/etc/fstab里有些所有盘的uuid)确认换走的是坏掉的盘
  2. 如果可以,通过MegaCli64得到硬盘序列号,从而告诉机房是哪个盘坏

开机

如果是H700,换盘后会有如下提示:

raid_error

此时按任意键继续就会进系统

找出新加的盘

对比下面2条的输出就可以找出新加的盘

cd /opt/MegaRAID/MegaCli
# 所有物理盘
sudo ./MegaCli64 -PDList -a0|grep 'Inquiry Data'
# 所有在线的虚拟盘
sudo /usr/local/bin/megasasctl -cfgdsply -aAll -NoLog|grep "Inquiry Data"

做raid

根据网上的文章,做raid需要新加盘的2个信息:

  • Enclosure Device ID,网上看到是一个数字,但我们的是 N/A,我们在实际使用中留空即可
  • Slot Number:本例中是6
# 查看物理盘信息,再次确认
sudo ./MegaCli64 -pdInfo -PhysDrv[:6] -aALL
# 创建raid0
sudo ./MegaCli64 -CfgLdAdd -r0[:6] WB Direct -a0

参考资料

近期败的MAC配件

 

自从入了Mac这个坑,首先是买了一些软件,早2个月开始败硬件。

以前用Thinkpad时,喜欢加多一个外显,左边看,右边码字,爽。而换了RMBP后,发现普通外显接上去后,由于不是视网膜屏,太模糊,一左一右,落差太大,只能放弃,水果家的显示器是5k的,是视网膜屏,但价格要去到7000,太过感人,只能放弃。

忘记是怎么得知Dell P2415Q的了,Google一番,发现它支持Mac的高清显示,虽然它是4K屏,但接入RMBP的时候,并不是用4K的分辨率,实际分辨率是1920 x 1080,相当于2K。本来想按照以前Thinkpad那样来用,同时使用2个屏幕,但发现15寸和24寸的差距太大,最后放弃RMPB的屏幕,改为只用P2415Q,RMBP直接合盖使用。


下面列一下败的配件:

  • Dell P2415Q,找公司的IT供应商拿的,3000元
  • Magic Trackpad 2,淘宝,428元,苹果官网查不到保修
  • Magic Mouse 2,咸鱼,350元,苹果官网查不到保修
  • CoolerMaster烈焰枪 侧刻版 红轴 87键,京东,699元
  • 键盘腕托,淘宝,49元
  • RMBP支架,淘宝,89元

设置方面

  • 虽然键盘是win版,但苹果的偏好设置-键盘里就可以修改修饰键的功能,我把AltWin键互换了位置,机械键盘本身支持拔键帽,我把键帽的位置也换了
  • 另外参考HHKB,把Caps Lock改成了Ctrl键,Ctrl + f/b/n/p等移动、删除,爽到爆。
  • 另外用Karabiner把右边的Alt改为了Caps Lock

一些感受和问题:

  1. 刚开始接外显时,休眠后,桌面会乱掉,往左或者往右,例如外显只显示了Finder的最左边的一点点,要自己拉回,现在倒不会了,也没有额外设置什么
  2. Magic Mouse 2,一开始用不习惯,移动太慢,当把移动调快后,细微的定位又会有问题,但这些在使用一段时间后消失,也不会有手酸的问题,但我觉得,有Trackpad的情况下,配一只普通鼠标就可以了,没必要用Magic Mouse 2
  3. 普通鼠标可以看看罗技的Master,600多,支持Mac的一些手势
  4. 现在想来,直接买P2715Q更好,27寸的,主要是在分屏显示的时候,可以多那么一点长度
  5. 为什么视网膜屏那么高的分辨率,显示的字体却不会小?原因就在hidpi,大概意思就是虽然分辨率高了,但Mac用4倍的像素来渲染一个字 ,这样就等于放大了字体
  6. Windows也有类似的技术,就是控制面板里的放大缩小,但部分软件支持得不好,会有锯齿,他们说win10对高分屏的支持会好些,详细资料可以Google hidpi

对了,我的RMBP是2014年中,15寸,顶配版,最后附图一张

IMG_20160625_131456

 

DevOps故障排除Linux服务器运维最佳实践

《DevOps故障排除Linux服务器运维最佳实践》,推荐下这本书,我没有仔细读,只是大概翻了下

  1. 作为入门级读物,是极好的
  2. 有指导原则,也有具体的方法
  3. 列出了常见的故障,以及排查方法,是一本手把手的教程

京东链接:DevOps故障排除Linux服务器运维最佳实践

ChatOps:Hubot和BearyChat简介

目标

快速做到任何有网的地方可以处理

背景说明

  1. 我们部分服务是内网的,也就是出了公司就无法处理,或者需要打开电脑,需要vpn,相对来说,有一点不方便
  2. 一个功能开发是需要时间的,例如一个审批流程,涉及逻辑,界面,测试
  3. 假设我们现在有个git仓库,代码提交后,我们希望做一些事情,但前提是在做之前,需要人工审核下提交的内容,如何可以做到不用开电脑,不用vpn,用一台手机就可以快速地进行处理?BearyChat就可以,如果需要更强大,更方便,可以整合Hubot

BearyChat的2个机器人

BearyChat自带了2个机器人,Incoming和Outgoing,现在让我们来看看如何用他们来把我们的审核流程串起来

  1. 注册BearyChat,进去后,添加一个讨论组,例如叫abc
  2. 去到机器人管理,添加Incoming机器人,给它一个名字,例如叫chathubot,选择发给它的内容要转发到哪里,我们选择发送到abc,这时会得到一个hook地址,还有说明文档,我们拿到hook地址
  3. 在git里部署hook,和svn一样,git钩子分2种:客户端和服务器端,本例中,比较理想是用服务器端的post-receive,但查了资料,gitbucket并不支持服务器端钩子,那本例中只能用post-commit这个本地钩子,钩子代码见下面
  4. 此时,git提交的diff内容和版本号已经发送到abc讨论组了,我们来设置Outgoing,设置名字后,设置“触发词”和“POST地址”,就是定义在聊天里发送了什么内容,触发BearyChat这个Outing机器人,向“POST地址”提交内容。我们设置触发词为「!upgit」,post地址为我们httpsqs的地址
  5. 我们安装BearyChat客户端或者在网页端,选择abc讨论组,发送「!upgit 1ae4082」,「1ae4082」为本次git提交的版本号,这时机器人就会把一段信息发送到httpsqs,发送的消息内容见下文
  6. 从httpsqs获取内容并做操作,好像没什么好说的了

post-commit

#!/usr/local/bin/python2.7
#-*- encoding:UTF-8 -*- 
# johncan 2016-04-03 17:32:17

import sys  
reload(sys)
sys.setdefaultencoding('utf8')

import commands
import requests
import json

incommint_url='https://hook.bearychat.com/xxxx'
git_ci_content = commands.getoutput('/usr/bin/git log -1 -p pre-commit')

payload = {"text":git_ci_content}

headers = {'content-type': 'application/json'}
r = requests.post(incommint_url, data=json.dumps(payload), headers=headers)
# print r.content

Outgoing机器人post的消息内容参考

{
    "channel_name": "abc",
    "subdomain": "xxxx",
    "text": "!upgit 1ae4082",
    "token": "xxxx",
    "trigger_word": "!upgit",
    "ts": 1459824707044,
    "user_name": "xxxx"
}

和Hubot整合

这个对于我们目前的需求来说,不是必须的

安装Hubot

一些说明

  1. 环境说明:CentOS 6.2 64bit
  2. Hubot很多东西都是通过环境变量来设置
# 设置debug模式
export HUBOT_LOG_LEVEL="debug"
# 设置监听端口
export EXPRESS_PORT=8081

开始安装

yum install nodejs npm redis -y
# 此处请修改redis安全配置,然后启动redis
# 网上也有资料说不用redis也可以
/etc/init.d/redis start
npm install -g coffee-script hubot yo generator-hubot
# 比较奇怪,用root初始化hubot会出错,下面用普通用户初始化hubot
useradd bchubot
su - bchubot
sudo mkdir /data/bchubot
cd /data
sudo chown bchubot.bchubot bchubot
cd bchubot
yo hubot
npm install hubot-bearychat --save

BearyChat添加Hubot

去到机器人管理,添加Hubot,这里会生产一个Token,复制Token

启动hubot

export HUBOT_BEARYCHAT_TOKENS='token_from_bearycaht'
export EXPRESS_PORT=8081
/data/bchubot/bin/hubot -a bearychat

BearyChat填写Hubot地址

http://hubot_ip:hubot_port/

此时可以测试发送消息给hubot,测试指令精选

# hubot会回PONG
ping
# 会发送一张gif的http地址
pug me

Hubot的动作是需要用coffee-sctipts写的,没有深入研究

其他

hubot的启动

网上很多资料都说可以直接运行hubot就可以跟它聊天,我测试是不行的,campfire是它的默认插件,所以,最简单的应该是这个指令

hubot -a campfire

post提交数据类型

如果data中含有换行符和&等字符,需要用这种方式发,当时在这里耗了一天的时间

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}

r = requests.post(url, data=json.dumps(payload), headers=headers)

更多可以参考Requests的文档

一个用Hubot做发布的案例

湾区日报的第一个“员工”:Slack/Hubot

2024年三月
« 5月    
 123
45678910
11121314151617
18192021222324
25262728293031