PHP7+Swoole/Nginx/Golang性能对比

QPS对比

使用apache bench工具对Nginx静态页、Golang Http程序、PHP7+Swoole Http程序进行压力测试。在同一台机器上,进行并发100共100万次Http请求的基准测试中,QPS对比如下:

软件 QPS 软件版本
Nginx164489.92nginx/1.4.6 (Ubuntu)
Golang166838.68go version go1.5.2 linux/amd64
PHP7+Swoole287104.12 swoole-1.7.22-alpha
Nginx-1.9.9245058.70nginx/1.9.9

注:Nginx-1.9.9的测试中,已关闭access_log,启用open_file_cache缓存静态文件到内存

测试环境

  • CPU:Intel® Core™ i5-4590 CPU @ 3.30GHz × 4
  • 内存:16G
  • 磁盘:128G SSD
  • 操作系统:Ubuntu14.04 (Linux 3.16.0-55-generic)

压测工具

ab -c 100 -n 1000000 -k http://127.0.0.1:8080/

VHOST配置
server {
    listen 80 default_server;
    root /data/webroot;
    index index.html;
}
测试页面

Hello World!

进程数量

Nginx开启了4个Worker进程

htf@htf-All-Series:~/soft/php-7.0.0$ ps aux|grep nginx
root      1221  0.0  0.0  86300  3304 ?        Ss   12月07   0:00 nginx: master process /usr/sbin/nginx
www-data  1222  0.0  0.0  87316  5440 ?        S    12月07   0:44 nginx: worker process
www-data  1223  0.0  0.0  87184  5388 ?        S    12月07   0:36 nginx: worker process
www-data  1224  0.0  0.0  87000  5520 ?        S    12月07   0:40 nginx: worker process
www-data  1225  0.0  0.0  87524  5516 ?        S    12月07   0:45 nginx: worker process

Golang

测试代码
package main

import (
    "log"
    "net/http"
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU() - 1)

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Add("Last-Modified", "Thu, 18 Jun 2015 10:24:27 GMT")
        w.Header().Add("Accept-Ranges", "bytes")
        w.Header().Add("E-Tag", "55829c5b-17")
        w.Header().Add("Server", "golang-http-server")
        w.Write([]byte("

\nHello world!\n

\n")) }) log.Printf("Go http Server listen on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }

PHP7+Swoole

PHP7已启用OpCache加速器。

PHP版本
htf@htf-All-Series:~/soft/php-7.0.0$ php -v
PHP 7.0.0 (cli) (built: Dec 10 2015 14:36:26) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
测试代码
$http = new swoole_http_server("127.0.0.1", 9501, SWOOLE_BASE);

$http->set([
    'worker_num' => 4,
]);

$http->on('request', function ($request, swoole_http_response $response) {
    $response->header('Last-Modified', 'Thu, 18 Jun 2015 10:24:27 GMT');
    $response->header('E-Tag', '55829c5b-17');
    $response->header('Accept-Ranges', 'bytes');    
    $response->end("<h1>\nHello Swoole.\n</h1>");
});

$http->start();


  • 郝多

    【ab -c 100 -n 1000000 -k http://127.0.0.1:8080/】-k :keep alive,这是让ab保持长连接进行压测啊,无法代表http短连接的环境

  • 打酱油的程序员

    swoole能像nginx一样配置域名吗

  • 郝多

    域名设置,还是交给nginx做吧。swoole不是要替代nginx

  • 郝多

    用-k,测试结果没意义,比nginx高也没意义的。去掉-k,再试试看结果,足以颠覆本文的测试结果。

  • 孙赛波

    我觉的相反,既然是web测试,就应该带k,不带反而没意义。

  • Rango-韩天峰

    不使用keepalive,整个程序全部耗时在connect/close TCP连接的创建和销毁上。无法体现不同软件的性能差异。因此要增加-k参数。

  • 尘缘

    1,如果测试目标,只定位于“server的响应能力”,那不加K是可以理解的,生产中也确实有很多长连接的业务场景,游戏聊天室什么的 2,其它web 业务,就是反反复复建连请求响应断开的过程,测试结果性能有下降也能理解。但出现性能比其它平台要差就说明哪里有问题了。

  • 虎岛和夫d

    root@dkv-All-Series:~# cat /etc/issue Ubuntu 14.04.3 LTS \n \l 补上操作系统

  • colin

    在100的并发下对比不出什么结果吧。执行流上PHP的optcode也应该在第一次就转换好了,读的静态文件本身也会有IO缓存。应该在较高的并发,如10W的并发TCP连接数下,看内存的使用,两个软件维护连接、处理各种切换的机制是否有差异。

  • 头像刷不出来

    测试带-k和不带差别很大,但是 使用 不使用链接池测试的结果都一样

  • 寻路记

    为何我的压测结果相差甚远 , 4核8G,8个worker,使用-k,结果才3W多,不加-k也才1W多 qps