存档

2013年12月 的存档

Yii/Yaf/Swoole3个框架的压测性能对比

2013年12月18日 1 条评论

本次压测使用的是一台4核I5 CPU,8G内存的笔记本。使用的版本是:

swoole_framework github最新版
Yaf 2.2.9
Yii-1.1.14

php-fpm和swoole应用服务器均启用了8个进程,因为仅比较hello world,不存在阻塞,8进程足以压满CPU。php5-fpm中已经启用了apc对所有PHP进行缓存。

压测使用ab工具,参数为:

 ab -c 100 -n 10000

Yaf

Server Software: nginx/1.2.6
 Server Hostname: localhost
 Server Port: 80
 Document Path: /yafapp/
 Document Length: 11 bytes
 Concurrency Level: 100
 Time taken for tests: 1.336 seconds
 Complete requests: 10000
 Failed requests: 0
 Write errors: 0
 Total transferred: 1770000 bytes
 HTML transferred: 110000 bytes
 Requests per second: 7486.03 [#/sec] (mean)
 Time per request: 13.358 [ms] (mean)
 Time per request: 0.134 [ms] (mean, across all concurrent requests)
 Transfer rate: 1293.97 [Kbytes/sec] received

Yii

Server Software: nginx/1.2.6
 Server Hostname: localhost
 Server Port: 80
 Document Path: /yiiapp/
 Document Length: 11 bytes
 Concurrency Level: 100
 Time taken for tests: 8.016 seconds
 Complete requests: 10000
 Failed requests: 0
 Write errors: 0
 Total transferred: 1770000 bytes
 HTML transferred: 110000 bytes
 Requests per second: 1247.55 [#/sec] (mean)

SwooleFramework

 Server Software: Swoole
 Server Hostname: 127.0.0.1
 Server Port: 8888
 Document Path: /hello/index
 Document Length: 11 bytes 
 Concurrency Level: 100
 Time taken for tests: 1.470 seconds
 Complete requests: 10000
 Failed requests: 0
 Write errors: 0
 Total transferred: 2750000 bytes
 HTML transferred: 110000 bytes
 Requests per second: 6801.78 [#/sec] (mean)
 Time per request: 14.702 [ms] (mean)
 Time per request: 0.147 [ms] (mean, across all concurrent requests)
 Transfer rate: 1826.65 [Kbytes/sec] receive

结果评价

有些人说框架的消耗和业务逻辑相比不算什么,这句话在你的QPS不到10个时是完全正确的。但如果你的网站访问量很大,机器负载很高,那么框架的性能消耗就会很明显的体现出来了。

Yii压测只有1200QPS,假设网站的平均QPS为200,因为框架的消耗是纯CPU消耗,也就是光Yii就会带来(200/1200)*100%=16.7%的CPU消耗。而Yaf/Swoole的QPS可达7000,200qps仅占用

(200/7000)*100%=2.8%的CPU消耗。当然200QPS对于一个巨型网站来说只是一个小数目,框架的CPU消耗会随着QPS增加而直线上升。

Swoole框架的早期版本可达9000QPS,swoole框架本身还是很复杂的,因为全部是PHP的代码实现,仅底层使用了swoole扩展,如果做了足够的精简和优化,还是有很大的上升空间。

压测证明Yaf的性能非常好。如果你希望使用PHP应用服务器可以选择Swoole,如果是LAMP/LNMP架构可以使用Yaf框架。

分类: PHP, Swoole扩展, Swoole框架 标签:

swoole的worker进程之间如何共享数据

2013年12月9日 2 条评论

swoole的TCP连接都是以数字的方式提供给PHP端的,在PHP代码中只需要保存fd/from_id这2个数字,即可向对应的连接发送数据。swoole本身也提供了可以遍历所有连接的函数接口(swoole_connection_list/swoole_connection_info)。这两个函数在EventWorker/TaskWorker均可调用。
但只能保存与网络服务相关的数据,如来源端口,客户端IP,客户端port等信息。swoole本身没有提供操作共享内存的接口,如果业务代码中希望保存额外的信息,或在worker进程之间共享数据,可以使用第三方的工具库。

单机环境单应用

可以使用apc扩展提供的apc_store/apc_fetch/apc_delete来保存数据,使用APCIterator来遍历数据,APCIterator可以使用正则来匹配key,功能还是很强大的。
apc是使用锁+共享内存实现的,性能很好。但只能用于单个Swoole的服务器实例,并且数据是非持久化的,Server结束时数据会被清空。如果想要保存APC中的数据可以使用 apc_bin_dumpfile 和 apc_bin_loadfile 。


if(pcntl_fork() > 0)
{
    apc_store("hello", "swoole");
    sleep(10000);
}
else
{
    usleep(1000);
    echo "Child:",apc_fetch("hello2");
}

读写内存文件

Linux/FreeBSD下都提供了tmpfs,基于内存的虚拟文件系统。Linux下是/dev/shm,读写这个目录下的文件没有磁盘IO,只是内存操作,性能非常高。Oracle数据库中就用到了它。

Swoole的应用中可以使用/dev/shm + swoole_lock来存储/共享运行时的数据。

单机跨应用

levelDB/rocksdb或者读写文件。文件读写时应当加锁,可以使用swoole提供的swoole_lock类。当然也可以直接使用分布式的存储,如memcache/mysql/redis等。

分布式环境

使用memcache/mysql/redis/ttserver等存储服务。

 

分类: Swoole扩展 标签: