Debug5出品,零基础,小白高效入手python后端视频教程:

记录一下:

nginx做反向代理,单纯测试框架。

机器配置:

Intel® Core™ i5-3470 CPU @ 3.20GHz 4核心 8G内存

test.go:

<!-- lang: cpp -->
package main
import (
"encoding/json"
"fmt"
"github.com/emicklei/go-restful"
"io"
"net/http"
"runtime"
"os"
)
var count int = 0
func main() {
    runtime.GOMAXPROCS(8)
    ws := new(restful.WebService)
    ws.Route(ws.GET("/").To(hello))
    restful.Add(ws)
    fmt.Println("Server starting on port ", os.Args[1])
     http.ListenAndServe(":"+os.Args[1], nil)
}
func hello(req *restful.Request, resp *restful.Response) {
    article := Article{"A Royal Baby", "A slow news week"}
    count++
        fmt.Println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", count)
    b, _ := json.Marshal(article)
    io.WriteString(resp, string(b))
}
type Article struct {
    Name string
    Body string
}

tornado.py

 

# !/usr/bin/env python

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def main():
    tornado.options.parse_command_line()
    application = tornado.web.Application([
        (r"/", MainHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

nginx 配置:

<!-- lang: shell -->

worker_processes  8;

events {
    worker_connections  1024;
}

    upstream tornado_online {
        server    127.0.0.1:15101;
        server    127.0.0.1:15102;
        server    127.0.0.1:15103;
        server    127.0.0.1:15104;
    }

    upstream go_online {
        server    127.0.0.1:15201;
        server    127.0.0.1:15202;
        server    127.0.0.1:15203;
        server    127.0.0.1:15204;
    }

    server {
        listen       9000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
         proxy_pass    http://tornado_online/;
         proxy_set_header    Host $host;
         proxy_set_header    X-Real-IP $remote_addr;
         proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
         client_max_body_size    10m;
         client_body_buffer_size  128k;
         proxy_connect_timeout    90;
         proxy_send_timeout            90;
         proxy_read_timeout            90;
        }
}

    server {
        listen       9001;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
         proxy_pass    http://go_online/;
         proxy_set_header    Host $host;
         proxy_set_header    X-Real-IP $remote_addr;
         proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
         client_max_body_size    10m;
         client_body_buffer_size  128k;
         proxy_connect_timeout    90;
         proxy_send_timeout            90;
         proxy_read_timeout            90;
        }
}

启动go:

nohup ./test 15201 &

nohup ./test 15202 &

nohup ./test 15203 &

nohup ./test 15204 &

启动tornado:

nohup python tornado.py –port=15101 &

nohup python tornado.py –port=15102 &

nohup python tornado.py –port=15103 &

nohup python tornado.py –port=15104 &

测试: go

 

<!-- lang: shell -->
 
$ab -c 500 -n 1000000 http://192.168.0.108:9001/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking 192.168.0.108 (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Completed 1000000 requests
Finished 1000000 requests
 
Server Software:        nginx/1.5.7
Server Hostname:        192.168.0.108
Server Port:            9001
 
Document Path:          /
Document Length:        49 bytes
 
Concurrency Level:      500
Time taken for tests:   89.459 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      206002060 bytes
HTML transferred:       49000490 bytes
Requests per second:    11178.28 [#/sec] (mean)
Time per request:       44.730 [ms] (mean)
Time per request:       0.089 [ms] (mean, across all concurrent requests)
Transfer rate:          2248.78 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   24 123.4      7    2028
Processing:     1   20  19.1     18     630
Waiting:        1   16  18.2     14     623
Total:          2   45 125.9     26    2040
 
Percentage of the requests served within a certain time (ms)
  50%     26
  66%     31
  75%     34
  80%     36
  90%     43
  95%     51
  98%    112
  99%    983
 100%   2040 (longest request)
 
➜  test  ps aux | grep test
root     25733 11.6  0.3 1739840 28812 pts/7   SNl  15:04   0:25 ./test 15201
root     25737 11.6  0.4 2140036 36104 pts/7   SNl  15:04   0:25 ./test 15202
root     25741 11.6  0.3 1697800 28472 pts/7   SNl  15:04   0:25 ./test 15203
root     25754 11.6  0.3 1738620 28892 pts/7   SNl  15:04   0:25 ./test 15204
cpu: 50%左右

测试:tornado

 

<!-- lang: shell -->
 
$ab -c 500 -n 1000000 http://192.168.0.108:9000/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking 192.168.0.108 (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Completed 1000000 requests
Finished 1000000 requests
 
Server Software:        nginx/1.5.7
Server Hostname:        192.168.0.108
Server Port:            9000
 
Document Path:          /
Document Length:        12 bytes
 
Concurrency Level:      500
Time taken for tests:   163.648 seconds
Complete requests:      1000000
Failed requests:        1
   (Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Write errors:           0
Non-2xx responses:      1
Total transferred:      218000099 bytes
HTML transferred:       12000156 bytes
Requests per second:    6110.67 [#/sec] (mean)
Time per request:       81.824 [ms] (mean)
Time per request:       0.164 [ms] (mean, across all concurrent requests)
Transfer rate:          1300.90 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    6  33.9      1    1011
Processing:     1   75 188.5     40    7108
Waiting:        1   72 188.2     37    7107
Total:          1   81 191.2     45    7110
 
Percentage of the requests served within a certain time (ms)
  50%     45
  66%     66
  75%     82
  80%     92
  90%    121
  95%    150
  98%   1027
  99%   1067
 100%   7110 (longest request)
➜  helloworld git:(master) ✗ ps aux | grep tornado
root      1747  0.0  0.1 106348 12920 pts/7    SN   15:34   0:00 python tornado.py –port=15101
root      4534  0.0  0.0  15956  1092 pts/7    S+   15:39   0:00 grep tornado
root     16785  5.0  0.2 112056 18472 pts/7    SN   14:24   3:46 python tornado.py --port=15101
root     16847  5.0  0.2 111260 18036 pts/7    SN   14:24   3:46 python tornado.py --port=15102
root     16879  5.0  0.2 111832 18396 pts/7    SN   14:24   3:47 python tornado.py --port=15103
root     16911  5.0  0.2 111272 18044 pts/7    SN   14:24   3:47 python tornado.py --port=15104
cpu: 100%


总结:

go+nginx的qps是tornado+nginx的1.4倍左右。tornado的响应时间(tpr)是go的1倍左右。tornado会使cpu跑满100%而go只需要50%左右

本博客源码Github地址:

请随手给个star,谢谢!