Actix-webパフォーマンス

webアプリとRustに興味を持ちまして、せっかくなのでどの程度早く動作するのかwebフレームワークのパフォーマンスを比較してみました。

```windows:環境
windows 10 pro
Intel(R) Core(TM) i5-7300U CPU @ 2.60GHz 2.71GHz
RAM: 8.00 GB
system 64bit
```
#webサーバ作成
使用するwebフレームワーク
Rust: Actix-web
Python: Flask
Julia: Genie

Hello Worldアプリ作成
先ずは、Actix

```Rust:コマンド
cargo new hello-world
cd hello-world
```

\hello-world\srcのmain.rsを編集する。

```Rust:main.rs
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};

#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {
    HttpResponse::Ok().body(req_body)
}

async fn manual_hello() -> impl Responder {
    HttpResponse::Ok().body("Hey there!")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .service(hello)
            .service(echo)
            .route("/hey", web::get().to(manual_hello))
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await
}
```

Flask

適当なフォルダにserver.pyを作成。

```python:server.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'


if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8001)
```

GenieはJuliaの中で作成

```julia:コマンド
julia
using Genie
Genie.newapp("hello_world")
```

ファイルセットが自動で作成されるので、juliaから抜けて、routes.jlファイルを編集する。

```julia:routes.jl
using Genie.Router

route("/") do
  "Hello - Welcome to Genie!"
end

Genie.AppServer.startup(8000, "0.0.0.0")
```

今思えば、ファイルセットを作らずにjuliaの中で以下を実行するだけでよかったかも。。。。
```route("/") do
"Hello - Welcome to Genie!"
end
Genie.AppServer.startup(8000, "0.0.0.0")```

３つのwebアプリを起動させたままにしておいて、別のPC(ubuntu20.04)を利用してパフォーマンス測定をやる。

#パフォーマンス測定

wrk2を使用する。
https://github.com/giltene/wrk2

```ubuntu:コマンド
sudo apt-get install -y build-essential libssl-dev git zlib1g-dev
git clone https://github.com/giltene/wrk2.git
cd wrk2
make
sudo cp wrk /usr/local/bin
wrk -v
wrk 4.0.0 [epoll] Copyright (C) 2012 Will Glozer
Usage: wrk <options> <url>                            
  Options:                                            
    -c, --connections <N>  Connections to keep open   
    -d, --duration    <T>  Duration of test           
    -t, --threads     <N>  Number of threads to use   
                                                      
    -s, --script      <S>  Load Lua script file       
    -H, --header      <H>  Add header to request      
    -L  --latency          Print latency statistics   
    -U  --u_latency        Print uncorrected latency statistics
        --timeout     <T>  Socket/request timeout     
    -B, --batch_latency    Measure latency of whole   
                           batches of pipelined ops   
                           (as opposed to each op)    
    -v, --version          Print version details      
    -R, --rate        <T>  work rate (throughput)     
                           in requests/sec (total)    
                           [Required Parameter]       
                                                      
                                                      
  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)
```

グラフの表示にwrk2imgを使用する。
https://github.com/PPACI/wrk2img

```ubuntu:コマンド
pip3 install wrk2img
# うまくいかなかったのでぼくはsudoつけました
```

測定していきます。使い方と見方は以下参考。
https://qiita.com/RyujiKawazoe/items/1da4342d8854543ca4cc

```wrk2:コマンド
wrk -U -d 30 -c 100 -R 1000 --latency http://192.168.1.95:8080/ | wrk2img actix_100.png
wrk -U -d 30 -c 100 -R 1000 --latency http://192.168.1.95:8001/ | wrk2img flask_100.png
wrk -U -d 30 -c 100 -R 1000 --latency http://192.168.1.95:8000/ | wrk2img genie_100.png
```

###actixの結果
![actix_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570009/89f40037-2ef6-75d1-3eef-e9d084069ba9.png)

###Flaskの結果
![flask_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570009/70bbc10a-eb35-aefa-53f2-257a58fd6ec0.png)

###Genieの結果
![genie_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570009/887d0f37-67c2-96cd-1bc7-f6417bcdd897.png)

Flask < Genie < actixということで、actixのパフォーマンスが優れているようです。

最後にactixの接続数を増やしたときのグラフ（10,100,1000,10000）
![actix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570009/8ca7e008-73c6-fa5b-b59b-1a448cd3deb8.png)

100までは負荷がかかっていないですが、1000になると影響が出るようです。

以上