标签归档:linux

pipe和fifo

简介

pipe称之为无名管道fifofirst in first out的缩写,称之为有名管道

pipe是最初的进程间通信IPC形式,但是由于他没有名字,所以只能局限于有亲缘关系的进程间使用(父子进程)。之后引入了fifo,就解决了这个问题。

历史上的pipe通常是指半双工管道,只允许数据单向流动。现代系统大都提供全双工管道,数据可以沿着管道双向流动。

fifo是半双工的

pipe

原型

fd[2]为两个文件描述符:fd[0]fd[1],前者打开负责读,后者打开负责写。

1、单进程内单向数据流

2、父子进程间的数据流
尽管管道是有单个进程创建的,却很少在单个进程内使用,下图将展示父子进程间的管道通信。

3、父子进程间的单向数据流
如果说父进程关闭读,子进程关闭写,那么父子进程就提供了一个单向数据流。如下图

4、*nix系统shell管道数据流

假设命令为:

fifo

原型

pathname是一个普通的路径名称,它是这个fifo的名字。
mode是指文件的权限位

fifo的模型大致与pipe类似,它的真正优势表现在服务端可以长期运行一个进程,与客户端无亲缘关系。建立一个经典的C/S架构

客户端将自己的pid告诉服务端,服务端可以通过组合找到客户端fifo名称,然后继续传出信息。

fifo需要注意一下几点

1、 fifo的写操作是原子性的,也就是说2个客户端发送消息,不会混乱在一起。
2、 fifo不支持nfs文件系统。fifo只能在单台主机上使用的IPC形式。
3、 当2个客户端几乎同时向服务端发送请求,第一台发送10M数据,需要10秒,第二台发送10字节,只需要1秒,那么第二台必须等待第一台完成发送后才能被处理。这种形式叫做迭代服务端。可以将其改造为并发服务端来解决这个问题。最常见的方式是,服务端为每一个发送数据的客户端fork一个子进程来接收数据。
4、 fifo的容量是有限的,为64K,并且不能修改。

php实现

代码已经上传到packagist.org

只需要composer require pangou/fifo 下来就可以了。

主要为2点:
1、 createFifo方法主要思路:
1) 判断fifo文件是否存在,类型是否为fifo,不是这备份后删除
2) 判断fifo文件是否存在,不存在则创建,创建失败抛异常
3) 判断文件类型是否为fifo,不是抛异常
2、 *nix系统一切皆文件的观点,所以fifo也是以文件读取写入的方式进行交互。

案例一、 单进程交互

需要注意的是read方法必须传入正好能够接收消息的长度。过长则进程进入阻塞状态,无数据写入的话永远阻塞着了。过短则,无法接受完整数据。

案例二、父子进程交互

非亲缘关系进程交互与父子进程交互类似,只是分为2个文件执行而已。

传输协议

上面2个示例中可以看到,接收数据方,必须传入节后数据大小才可以接收完成数据。但是真实环境中怎么可能知道需要接收多少字节?

这里引入了数据长度传输协议,消息体前N个字节为消息长度,那么就可以完美解决这个问题了。

重新改造fifo

使用方式

压测

曾经也做过一篇关于共享内存文件MemcacheCache的压测, 天然的memcache —— /dev/shm

由于管道也是存在于内核中的所以性能还算不错,10W次读写0.4秒左右。是/dev/shm性能的双倍。当然这个使用场景不一样,完全没有可比性 : ) 。

php7的初体验

在微博中关注了新浪鸟哥,听过phpng(php7-dev)性能提高了不少,于是趁着周末有空赶紧尝试一下。

一、安装

Github上下载安装源码:点击访问

生成配置文件

进行配置

编译安装

make编译的时候,可能会碰到报错如下:

那是因为编译的时候没抓好一些环境变数值,错误发生点在建立「-o sapi/cli/php」是出错,没給到要 link 的 iconv 函式库参数。

解决方法如下:

编辑Makefile 大约 105 行左右的地方: EXTRA_LIBS = ….. -lcrypt 在最后加上 -liconv,例如: EXTRA_LIBS = ….. -lcrypt -liconv

编辑后重新makemake install就可以了。

查看信息

测试

测试机器环境:4台虚拟机,内存4096MB
测试php版本:php7-devphp5.6.4php5.5.21php5.3.17
测试工具:httperf
测试方式: 并发2000,进行100000次请求
测试脚本:输出hello world

测试结果:

测试总结:
就QPS来说,php7-devphp5.6.4较之php5.3.175.5.21几乎翻了一倍。
从成功率来说,php7-dev100000次请求全部成功,php5.6.4的失败率较高还不知道是什么原因。

总体来说php7还是非常值得期待的。

附:
新浪鸟哥做的php7对应hhvm的测试比较

天然的memcache —— /dev/shm

首先让我们认识一下,什么是tmpfs和/dev/shm/?

tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。
它有如下2个优势 :
1. 动态文件系统的大小。
2. tmpfs 的另一个主要的好处是它闪电般的速度。
因为典型的 tmpfs 文件系统会完全驻留在内存 RAM 中,读写几乎可以是瞬间的。同时它也有一个缺点 tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

tmpfs不具备持久性,重启后数据不保留,请务必注意!!!

性能测试

分别对磁盘、/dev/shm、memcache进行10W次读、写、读写操作。

vagrant 搭建自己的开发环境(三)—— 多主机配置

有时候项目不仅仅只有一台服务器,可能会有多台服务器,比如说主从同步,负载均衡,冗余等等。
vagrant也可以配置多台服务器,每台主机都可以拥有自己的配置。

当启动时候,或者ssh链接时候,可以使用 vagrant up 主机名vagrant ssh 主机名 命令针对某一台虚拟机进行操作。

根据单主机的配置,我们可以推算出多主机的配置大致相同。

vagrant 搭建自己的开发环境(二)—— 配置 及 打包

vagrant init xxx初始化后,会生成一个名字叫Vagrantfile的配置文件。大概它,我们就可以对vagrant进行配置。

一、共享目录

vagrant初始化后的目录其实已经和虚拟机共享了。如果还想配置其他共享目录可以进行以下配置。

二、网络配置

  • 公有网络 —— 局域网下都能访问到

  • 私有网络 —— 只有本机才能访问

三、重新打包

重新打包前,需要删除一个文件

不删除的话,重新打包后,再次安装会出现网络异常的问题。

然后就可以打包了,打包命令

打包成功后,会在当前目录下,生成一个名叫package.box的box。然后以后就可以使用此镜像进行安装虚拟机。

vagrant 搭建自己的开发环境(一) —— 安装、初始化、启动

一、安装VirtualBox

官网下载,并安装。不做过多描述。

二、安装vagrant

官网下载,并安装。不做过多描述。

三、添加box

box是指某种操作系统的操作镜像文件。我们可以上vagrantcloud下载自己想要的box。

1、创建工作目录

2、下载/添加box

由于网络原因使用命令行下载太慢,我们可以是用迅雷下载完后,使用命令行添加本地box

安装完成后,我们进行初始化,就是启动,然后使用ssh链接到虚拟机。

3、初始化

4、启动

4、ssh 链接

如果windows上还没有安装openssl,可以先google一下,如何安装配置。

如果已经安装好了,可以直接使用 vagrant ssh 命令,链接到虚拟机并且操作。

在线预览word,excel,pdf

大致思路:word/excel  转换成 pdf,然后pdf转换成swf,在各个浏览器兼容显示。

一、安装环境

1、准备工作

 2、安装openoffice

 2、安装 jodconverter

 

3、转换成pdf

转换成功如下。2014-05-10_220219

 

其实如果只考虑现代浏览器(chrome、firefox等),已经可以在线预览了。

但是为了兼容低版本的IE,需要将PDF转化成SWF进行兼容。

ps:如果存在乱码问题解决方法如下

 4、安装 swftools

 5、FlexPaper浏览swf

 

测试连接:http://test.iter-cc.com/FlexPaper/1.html