Actix-webパフォーマンス
webアプリとRustに興味を持ちまして、せっかくなのでどの程度早く動作するのかwebフレームワークのパフォーマンスを比較してみました。
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
cargo new hello-world
cd hello-world
\hello-world\srcの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を作成。
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
using Genie
Genie.newapp("hello_world")
ファイルセットが自動で作成されるので、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")
3つのwebアプリを起動させたままにしておいて、別のPC(ubuntu20.04)を利用してパフォーマンス測定をやる。
パフォーマンス測定
wrk2を使用する。
https://github.com/giltene/wrk2
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
pip3 install wrk2img
# うまくいかなかったのでぼくはsudoつけました
測定していきます。使い方と見方は以下参考。
https://qiita.com/RyujiKawazoe/items/1da4342d8854543ca4cc
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の結果
Flaskの結果
Genieの結果
Flask < Genie < actixということで、actixのパフォーマンスが優れているようです。
最後にactixの接続数を増やしたときのグラフ(10,100,1000,10000)
100までは負荷がかかっていないですが、1000になると影響が出るようです。
以上
Author And Source
この問題について(Actix-webパフォーマンス), 我々は、より多くの情報をここで見つけました https://qiita.com/ito-masahiro/items/0b85d5f12a3544bf4861著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .