본문 바로가기
-----ETC-----/C++ 고급 프로그래밍과 응용 프로젝트 시리즈

[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 20: 프로젝트 1 - 최적화 및 성능 테스트

by cogito21_cpp 2024. 8. 1.
반응형

최적화 및 성능 테스트

웹 서버의 성능을 최적화하고, 성능 테스트를 통해 서버의 처리 능력을 평가하는 것이 중요합니다. 오늘은 웹 서버의 성능을 최적화하고, 성능 테스트를 수행하는 방법에 대해 학습하겠습니다.


성능 최적화

성능 최적화를 위해 다음과 같은 기법을 사용할 수 있습니다.

  1. 입출력 버퍼링: 파일 입출력 시 버퍼링을 사용하여 성능을 향상시킬 수 있습니다.
  2. 네트워크 최적화: 네트워크 입출력 시 버퍼링을 사용하여 성능을 향상시킬 수 있습니다.
  3. 스레드 풀: 스레드 풀을 사용하여 스레드 생성 및 소멸의 오버헤드를 줄일 수 있습니다.
  4. 메모리 관리: 메모리 할당과 해제를 최소화하여 성능을 향상시킬 수 있습니다.

 

1. 입출력 버퍼링

파일 입출력 시 버퍼링을 사용하여 성능을 향상시킬 수 있습니다.

 

response.h 수정

#ifndef RESPONSE_H
#define RESPONSE_H

#include <string>
#include <unordered_map>

class Response {
public:
    Response(int statusCode);

    void setHeader(const std::string& name, const std::string& value);
    void setBody(const std::string& body);
    std::string toString() const;

private:
    int statusCode_;
    std::unordered_map<std::string, std::string> headers_;
    std::string body_;
    std::string statusMessage_;
    std::string getStatusMessage() const;
};

#endif // RESPONSE_H

 

response.cpp 수정

#include "response.h"
#include <sstream>

Response::Response(int statusCode) : statusCode_(statusCode) {
    statusMessage_ = getStatusMessage();
}

void Response::setHeader(const std::string& name, const std::string& value) {
    headers_[name] = value;
}

void Response::setBody(const std::string& body) {
    body_ = body;
}

std::string Response::toString() const {
    std::ostringstream response;
    response << "HTTP/1.1 " << statusCode_ << " " << statusMessage_ << "\r\n";
    for (const auto& header : headers_) {
        response << header.first << ": " << header.second << "\r\n";
    }
    response << "\r\n" << body_;
    return response.str();
}

std::string Response::getStatusMessage() const {
    switch (statusCode_) {
        case 200: return "OK";
        case 400: return "Bad Request";
        case 404: return "Not Found";
        case 500: return "Internal Server Error";
        default: return "Unknown Status";
    }
}

 

 

성능 테스트

성능 테스트는 서버의 처리 능력을 평가하는 과정입니다. 다양한 성능 테스트 도구를 사용하여 서버의 성능을 측정할 수 있습니다.

 

1. ApacheBench (ab) 사용

ApacheBench는 Apache HTTP 서버 프로젝트에서 제공하는 성능 테스트 도구입니다. 이를 사용하여 웹 서버의 성능을 테스트할 수 있습니다.

 

ApacheBench 설치

리눅스 환경에서 다음 명령어를 사용하여 ApacheBench를 설치할 수 있습니다.

sudo apt-get install apache2-utils

 

성능 테스트 수행

다음 명령어를 사용하여 성능 테스트를 수행할 수 있습니다.

ab -n 1000 -c 10 http://localhost:8080/

 

이 명령어는 1000개의 요청을 10개의 동시 연결로 수행합니다.

 

2. JMeter 사용

JMeter는 Apache 소프트웨어 재단에서 제공하는 성능 테스트 도구입니다. GUI 기반의 성능 테스트 도구로, 다양한 시나리오를 설정하여 테스트할 수 있습니다.

 

JMeter 다운로드 및 실행

JMeter는 다음 링크에서 다운로드할 수 있습니다.

JMeter 다운로드

 

다운로드 후 다음 명령어를 사용하여 JMeter를 실행할 수 있습니다.

./bin/jmeter

 

JMeter를 사용하여 성능 테스트 시나리오를 설정하고 테스트를 수행할 수 있습니다.

 

성능 최적화 및 테스트 예제

이제 웹 서버의 성능을 최적화하고, 성능 테스트를 수행하는 예제를 작성하겠습니다.

 

main.cpp

#include "server.h"
#include "response.h"

void handleRoot(int clientSocket) {
    Response response(200);
    response.setHeader("Content-Type", "text/html");
    response.setBody("<html><body><h1>Welcome to the Home Page!</h1></body></html>");

    std::string responseStr = response.toString();
    send(clientSocket, responseStr.c_str(), responseStr.size(), 0);
}

void handleAbout(int clientSocket) {
    Response response(200);
    response.setHeader("Content-Type", "text/html");
    response.setBody("<html><body><h1>About Us</h1></body></html>");

    std::string responseStr = response.toString();
    send(clientSocket, responseStr.c_str(), responseStr.size(), 0);
}

int main() {
    try {
        Server server("127.0.0.1", 8080, 4);  // 4개의 스레드를 가진 스레드 풀 사용
        server.addRoute("/", handleRoot);
        server.addRoute("/about", handleAbout);
        server.start();
    } catch (const std::exception& e) {
        Logger::getInstance().log("Error: " + std::string(e.what()));
    }

    return 0;
}

 

이제 서버를 실행하고 성능 테스트 도구를 사용하여 서버의 성능을 측정해봅니다. 테스트 결과를 분석하여 성능을 최적화할 수 있는 방법을 찾습니다.

 

 

이제 20일차의 학습을 마쳤습니다. 웹 서버의 성능을 최적화하고 성능 테스트를 수행하는 방법에 대해 학습하고 구현해보았습니다.

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "배포 및 유지보수"에 대해 학습하고 구현하겠습니다.

반응형