Skip to content

4. Apache Benchmarking


1. Mission

  • Apach Benchmarking 툴을 이용하여 각 서버의 스트레스 테스트를 한다.


2. Apach Benchmarking(AB)

1) AB 설치

  • 다음과 같이 AB를 설치한다.


$(torchserve) sudo apt-get install apache2-utils


2) 자동 실행 코드 작성

  • AB 실행에 필요한 파일을 만들기 전에 source 디렉터리를 생성한다.


$(torchserve) mkdir source && touch ./source/result.py


  • 다음과 같이 client.txt를 작성한다.


$(torchserve) echo '{"src_lang": "ko", "src_text": "오늘 하루도 하나님의 은총과 평안과 기쁨과 축복과 행복이 가정과 일터에 가득하길 소망합니다.", "tgt_lang": "en"}' > ./source/client.txt


  • 다음과 같이 result.py를 작성한다.


import sys
import pandas as pd

class Server:
    def __init__(self, name: str, req: str, time: str):
        self.name = name
        self.read_path = "/root/Project/ab/result/result_" + self.name + "_r" + req + "_" + time + ".txt"
        self.write_path = "/root/Project/ab/summary/summary_" + self.name + "_r" + req + "_" + time + ".txt"
        self.content, self.df = None, None
        self.req, self.con, self.fail, self.time, self.rps, self.tpr = [], [], [], [], [], []

    def read(self):
        with open(self.read_path, "r") as file:
            self.content = file.readlines()

    def parse(self, msg: dict):
        for line in self.content:
            if msg["req"] in line:
                self.req.append(line[len(msg["req"]):].strip())
            elif msg["con"] in line:
                self.con.append(line[len(msg["con"]):].strip())
            elif msg["fail"] in line:
                self.fail.append(line[len(msg["fail"]):].strip())
            elif msg["time"] in line:
                self.time.append(line[len(msg["time"]):].strip().split("seconds")[0].strip())
            elif msg["rps"] in line:
                self.rps.append(line[len(msg["rps"]):].strip().split("[#/sec]")[0].strip())
            elif msg["tpr_1"] in line and msg["tpr_2"] not in line:
                self.tpr.append(line[len(msg["tpr_1"]):].strip().split("[ms]")[0].strip())

    def write(self):
        self.df = pd.DataFrame({"Requests": self.req, "Concurrency": self.con, "Failed": self.fail, "Total Time (sec.)": self.time, "Requests Per Second": self.rps, "Time Per Request (msec.)": self.tpr})
        self.df.to_csv(self.write_path)
        print(f"\n<<< {self.name.upper()} >>>\n{self.df}\n")

def main(req, time):
    msg = {\
            "req": "Complete requests:",\
            "con": "Concurrency Level:",\
            "fail": "Failed requests:",\
            "time": "Time taken for tests:",\
            "rps": "Requests per second:",\
            "tpr_1": "Time per request:",\
            "tpr_2": "across all concurrent requests"\
            }

    for name in ("gunicorn", "torchserve"):
       server = Server(name, req, time)
       server.read()
       server.parse(msg)
       server.write()

if __name__ == "__main__":
    req, time = sys.argv[1:]

    main(req, time)


  • 다음과 같이 ab.sh를 작성하여 간단하게 실행할 수 있도록 한다.


#!/bin/bash

starttime=$(date +%s)
time=$(date "+%Y%m%d%H%M")
echo $time

if [ ! -f ./source/client.txt ]; then
        echo
        echo Need ./source/client.txt!!!
        echo '{"src_lang": "ko", "src_text": "오늘 하루도 하나님의 은총과 평안과 기쁨과 축복과 행복이 가정과 일터에 가득하길 소망합니다.", "tgt_lang": "en"}' > ./source/client.txt
        echo ./source/client.txt Made!!!
        echo

fi

req=10000
cons="1 10 50 100 200 300 400 500 600 700 800 900 1000"

echo
echo Requests=$req / Concurrency=$cons
echo

if [ ! -d ./result ]; then
        mkdir ./result
        echo Directory ./result Made!!!
fi

if [ ! -d ./summary ]; then
        mkdir ./summary
        echo Directory ./summary Made!!!
fi

if [ -f ./result/result_gunicorn_r$req"_"$time.txt ]; then
        rm ./result/result_gunicorn_r$req"_"$time.txt
        echo ./result/result_gunicorn_r$req"_"$time.txt Removed!!!
fi

if [ -f ./result/result_torchserve_r$req"_"$time.txt ]; then
        rm ./result/result_torchserve_r$req"_"$time.txt
        echo ./result/result_torchserve_r$req"_"$time.txt Removed!!!
fi

for con in $cons
do
        echo
        echo Gunicorn Start... Requests: $req / Concurrency: $con
        ab -p ./source/client.txt -T application/json -s 86400 -n $req -c $con http://127.0.0.1:7777/gunicorn >> ./result/result_gunicorn_r$req"_"$time.txt
        echo Gunicorn Done...
        echo

        echo
        echo TorchServe Start... Requests: $req / Concurrency: $con
        ab -p ./source/client.txt -T application/json -s 86400 -n $req -c $con http://127.0.0.1:7777/torchserve >> ./result/result_torchserve_r$req"_"$time.txt
        echo TorchServe Done...
        echo
done

python ./source/result.py $req $time

endtime=$(date +%s)

echo
echo Finished... $(($endtime - $starttime)) sec.
echo


3) AB 테스트

  • 다음과 같이 실행하면 AB 테스트가 진행된다.


$(torchserve) bash ab.sh


  • 테스트가 종료되면 내용을 확인할 수 있다.


001