hhvm之轻进程
本文为原创,转载请注明:http://www.cnblogs.com/gistao/
背景
我们在aws上部署了hhvm,高峰段发现cpu idle降的比较低,只有10-20%,而使用php-fpm的另外一台机器的cpu idle在40-60%,这与hhvm的性能明显不符。
hhvm的cpu截图

分析
使用gperftools和xhprof工具分析函数的CPU耗时分布
gperf截图

xhprof截图

分析发现_addSysInfo函数内竟然调用了一个exec函数,触发了多线程下fork的坑。不过hhvm也已经提供了相应的避免方法:轻进程
HHVM的轻进程
背景
hhvm支持exec函数对应的底层调用是popen,此函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程
由于hhvm是多线程的,为了避免fork引起的大量内存copy带来的开销,hhvm设计了轻进程模式,轻进程也就是只有一个线程的意思
设计思路
1.在hhvm启动的时候,此时只有一个线程即主线程,就fork出配置项LightProcessCount个子进程
2.当php脚本执行exec的时候,hhvm主进程不会执行fork
3.hhvm会根据当前worker的线程id %LightProcessCount 得到相应的”子进程标识“,“子进程标识”用于和先前fork出的子进程打交道
4.“子进程标识”传递命令到对应的子进程,继而在子进程里完成exec相应的功能
5.注意每个”子进程标识“有一把锁,如果锁未释放,则当前worker线程会阻塞
6.在子进程完成exec之前,当前worker线程会阻塞
配置
Server {
# Light process has very little forking cost, because they are pre-forked
# Recommend to turn it on for faster shell command execution.
#LightProcessFilePrefix = ./lightprocess
#LightProcessCount =
}
LightProcessCount默认是0,hhvm根据此值建立相应数量的轻进程,如需要,建议和ThreadCount保持以致
LightProcessFilePrefix用于子进程和主进程的通信,即Unix domain socket
例子
配置如下
Server {
#LightProcessFilePrefix = ./light_process
#LightProcessCount =
}
hhvm启动后,会启动10个轻进程
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
gistao 0.0 0.0 ? Ss : : hhvm-HHVM-2.2/hphp/hhvm/hhvm -vServer.LightProcessFilePrefix=./light_process -vServer.LightProcessCount= -m server -vEval.Jit=true -p
同时,在当前运行目录下生成
srwxr-xr-x gistao hhvm Jan : light_process.10470.0
srwxr-xr-x gistao hhvm Jan : light_process.10470.1
srwxr-xr-x gistao hhvm Jan : light_process.10470.2
srwxr-xr-x gistao hhvm Jan : light_process.10470.3
srwxr-xr-x gistao hhvm Jan : light_process.10470.4
srwxr-xr-x gistao hhvm Jan : light_process.10470.5
srwxr-xr-x gistao hhvm Jan : light_process.10470.6
srwxr-xr-x gistao hhvm Jan : light_process.10470.7
srwxr-xr-x gistao hhvm Jan : light_process.10470.8
srwxr-xr-x gistao hhvm Jan : light_process.10470.9
hhvm之轻进程的更多相关文章
- linux c/c++
string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...
- linux的<pthread.h>
转自:http://blog.sina.com.cn/s/blog_66cc44d00100in5b.html Linux系统下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多 ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- linux实现c多进程
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process)中只允许 ...
- 线程属性pthread_attr_t
转:http://blog.sina.com.cn/s/blog_6dc9e4cf0100xcvk.html1. 线程属性: 使用pthread_attr_t类型表示,我 ...
- 【转】 Linux下的多线程编程
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...
- Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...
- Linux系统编程@多线程编程(二)
线程的操作 线程标识 线程的ID表示数据类型:pthread_t (内核中的实现是unsigned long/unsigned int/指向pthread结构的指针(不可移植)几种类型) 1.对两个线 ...
- Linux下多线程编程
一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...
随机推荐
- iOS系统网络抓包方法
转到自己的博客收藏. 1. 网络共享 + 可视化抓包工具 基本原理 原理比较简单,ios设备通过代理方式共享连接mac电脑的无线网卡,使用抓包工具抓包,然后进行分析(我们推荐使用Wireshark,在 ...
- 使用keytool生产jks证书
使用JDK中的keytool生成服务器证书 1.创建服务器KeyStorekeytool -genkey -alias server_jks_cennavi -keyalg RSA -keystor ...
- c语言操作一维数组-3
C语言选择题#includemain(){double a[15],k;k=fun(a);} 则以下选项中错误的fun函数首部是 ( D)A.double fun(double a[15]) B.do ...
- c语言调用函数打印一维数组-2-指针
方法一(规范): #include <stdio.h> #include <math.h> #include <stdlib.h> //函数预声明 ], int m ...
- Dotspatial 创建面状图层
using DotSpatial.Controls;using DotSpatial.Data;using DotSpatial.Data.Forms;using DotSpatial.Plugins ...
- webstorm 10 更改默认端口
快捷键 ctrl + Alt + s :打开配置 如图下可以更改 默认端口.快捷键可能跟qq的快捷键冲突,可以关闭qq来设置端口
- ReactJS实现的通用分页组件
大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果 ...
- python时间时分秒与秒数的互相转换
受到Unix时间戳的启发,我发现时间转成秒数后会非常好处理,在程序当中不再是以字符串的形式处理,不管时间的加减还是获取随机的时间点都变得非常方便, 如果有需要,也很容易转换成需要的时间格式. 一:时间 ...
- Mvc api HelpPage 与注释
一.添加包Microsoft.AspNet.WebApi.HelpPage可以自动给api生成帮助页面,url:/help 二.help加注释: 1. 2. public static class H ...
- 安全协议系列(三)----CCMP与WPA-PSK
本节讨论 CCM 在 WiFi 中的实际应用 -- CCMP 协议 根据 RFC 3610,完成 CCMP 报文的加解密,需要提供:分组密钥(K).随机数(Nonce).附加认证数据(AAD),这三个 ...