本文为原创,转载请注明: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之轻进程的更多相关文章

  1. linux c/c++

    string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...

  2. linux的<pthread.h>

    转自:http://blog.sina.com.cn/s/blog_66cc44d00100in5b.html Linux系统下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多 ...

  3. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  4. linux实现c多进程

    线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process)中只允许 ...

  5. 线程属性pthread_attr_t

    转:http://blog.sina.com.cn/s/blog_6dc9e4cf0100xcvk.html1.    线程属性:             使用pthread_attr_t类型表示,我 ...

  6. 【转】 Linux下的多线程编程

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...

  7. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  8. Linux系统编程@多线程编程(二)

    线程的操作 线程标识 线程的ID表示数据类型:pthread_t (内核中的实现是unsigned long/unsigned int/指向pthread结构的指针(不可移植)几种类型) 1.对两个线 ...

  9. Linux下多线程编程

    一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...

随机推荐

  1. Openwrt 编译报错:rootfs image is too big解决方法

    修改: tools/firmware-utils/src/mktplinkfw2.c static struct flash_layout layouts[] = { { .id = "8M ...

  2. [转]CSS3 Media Query实现响应布局

    讲到响应式布局, 相信大家都有一定的了解,响应式布局是今年很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果, 设计师提出了响应式布局的设计方案.今 ...

  3. 利用Cayley-Hamilton theorem 优化矩阵线性递推

    平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...

  4. linux操作命令

    cd / 回到跟目录 cd ..  返回上一层目录 tomcat 的logs目录执行tail -f catalina.out查看日志 ps -ef|grep tomcat 查看tomcat进程 kil ...

  5. 面试复习(C++)之冒泡排序

    第一次写技术博客,先只贴代码吧. #include <iostream> using namespace std; void Bubble(int *arr,int len) { int ...

  6. windows7 64位系统pl/sql 客户端的安装

    解压将下载到的将其解压,如我解压到了 E:\app\instantclient_11_2 3.设置PLSQL Developer在tools-prefrences,conncetion,OCI lib ...

  7. 【转】关于Oracle将小于1的数字to_char后丢掉0的解决办法

    SQL代码如下: select rtrim(to_char(0.11, 'fm9990.99'), '.') from dual; 其中0.11为需要to_char的数字fm去掉字符串前面的空格999 ...

  8. linux下打包工具

    InstallAnyWhere  IzPack  InstallJammer; installshield 也支持rpm打包 Advanced Installer

  9. Tapestry

    Tapestry1)概述:Tapestry 是一个全面web application 框架,是使用JAVA 写的.Tapestry 不是一个application server,Tapestry 是一 ...

  10. Apache多站点配置(ubuntu)

      1,先进入Apaches2的目录下 cd /etc/apache2   2,进入sites-available中 cd sites-available vi 000-default.conf   ...