本文为原创,转载请注明: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. ROS语音交互(四)接入图灵语义理解

    首先程序中会用到Json,curl 安装相应的库 $ sudo apt-get install libcurl3 libcurl4-openssl-dev$ sudo apt-get install ...

  2. iOS 支付宝第三方使用步骤

    使用支付宝进行一个完整的支付功能,大致有以下步骤: 1 与支付宝进行签约,获得商户ID(partner)和账号ID(seller) 2 下载相应的公钥私钥文件(加密签名用) 3 下载支付宝SDK 4 ...

  3. node模块系统常用命令

    node模块系统常用命令 命令 示例 备注 安装模块 npm install commander 最新版本 npm install commander@1.0.0 指定版本 npm install c ...

  4. C++重载流运算符,将存储结构体的vector直接写入文件

    我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...

  5. JS 跑马灯

    利用jquery 来实现图片切换.文字转换移动的工具. MSClass 连接 http://www.popub.net/script/MSClass.html Mark 用

  6. Visual Studio 下C#编译器在解析属性名时如果增加一个get_[您的另一个已经包含在类中属性名]的属性会报错,微软大哥这是什么鬼?

    假设在在我们的vs环境新建一个类 copy以下代码,表面看好像一切都没有问题. using System; using System.Collections.Generic; using System ...

  7. 'java'不是内部或外部命令,另一个解决办法

    我知道环境变量,也知道搞系统变量.别给我粘那些教程了,我的java路程是C:\Program Files\Java\jdk1.6.0_05谁弄好了把那三个变量和值发出来.... JAVA_HOME=C ...

  8. 了解JavaScript

    JavaScript是什么? JavaScript是一种可以用来给网页增加交互性的编程语言. JavaScript是一种面向对象的语言. JavaScript和Java之间没有太大的关系. JavaS ...

  9. css:writing-mode属性

    writing-mode属性 实现文字垂直排版 下面是css3语法: /* 关键字值 */ writing-mode: horizontal-tb; /* 默认值 */ writing-mode: v ...

  10. how-to-add-global-asp-net-web-api-filters

    要实现给mvc 和api 接口全局添加日志统计,web api添加的方式有些不同 FilterConfig.cs 页面 public class FilterConfig { public stati ...