카테고리 없음

Windows 환경에서 Flask + Gunicorn + MongoDB 커넥션 풀 설정 및 성능 테스트 방법

idea9329 2025. 3. 2. 16:55
반응형

 

Windows에서 Flask + Gunicorn + MongoDB를 사용하여 최대 연결 풀(maxPoolSize)을 설정하고, 성능 테스트를 수행하는 방법을 정리했습니다.
이 가이드를 따르면 MongoDB의 연결 풀을 최적화하여 웹 애플리케이션의 처리 속도를 높이고, 동시 요청을 효과적으로 관리할 수 있습니다.


1. 기본 환경

  • 운영체제: Windows 10/11
  • Python 버전: 3.x
  • MongoDB: 로컬(27017 포트)에서 실행 중
  • PyCharm 설치 완료
  • Gunicorn: Windows에서는 gevent를 사용하여 실행

2. 필수 패키지 설치

먼저, pip을 사용하여 필요한 패키지를 설치합니다.

pip install flask pymongo gunicorn gevent waitress

패키지 설명

패키지설명

flask 경량 웹 프레임워크
pymongo MongoDB 연결 및 조작 라이브러리
gunicorn WSGI 서버 (Windows에서는 gevent 필요)
gevent Gunicorn이 Windows에서 동작하도록 지원
waitress Windows에서 Flask 서버를 실행할 대체 방법

3. Flask + MongoDB 커넥션 풀 설정

다음 코드(app.py)를 작성하여 Flask 서버에서 MongoDB 연결 풀(maxPoolSize)을 설정하고, 데이터를 삽입/조회할 수 있도록 구성합니다.

📌 app.py (Flask + MongoDB)

from flask import Flask, jsonify
from pymongo import MongoClient

app = Flask(__name__)

# MongoDB 연결 (최대 연결 풀 설정)
client = MongoClient("mongodb://localhost:27017/", maxPoolSize=200)
db = client["test_db"]
collection = db["test_collection"]

@app.route("/")
def home():
    return "Flask + MongoDB Connection Pool Test"

@app.route("/insert")
def insert_data():
    """MongoDB에 샘플 데이터 삽입"""
    data = {"name": "Test", "value": "MongoDB Connection Pool"}
    collection.insert_one(data)
    return jsonify({"message": "Data inserted successfully"})

@app.route("/fetch")
def fetch_data():
    """MongoDB에서 데이터 조회"""
    data = list(collection.find({}, {"_id": 0}))
    return jsonify({"data": data})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

🔹 주요 설정

  • maxPoolSize=200 → 최대 200개의 커넥션을 유지하도록 설정
  • /insert → MongoDB에 테스트 데이터 삽입
  • /fetch → MongoDB에서 데이터 조회

4. Gunicorn + Gevent로 서버 실행

Gunicorn은 기본적으로 Windows에서 실행되지 않지만, gevent를 사용하면 실행 가능합니다.

gunicorn -w 4 -k gevent -b 0.0.0.0:5000 app:app

🔹 옵션 설명

옵션설명

-w 4 워커 프로세스를 4개 실행
-k gevent 비동기 이벤트 기반 처리
-b 0.0.0.0:5000 5000번 포트에서 실행

5. Gunicorn이 Windows에서 실행되지 않을 경우

Gunicorn은 Linux 기반이므로, Windows에서 실행되지 않을 수도 있습니다.
이 경우 Waitress를 사용하여 실행할 수 있습니다.

waitress-serve --host 0.0.0.0 --port 5000 app:app

🔹 Waitress의 장점

  • Windows에서도 WSGI 서버로 안정적으로 실행 가능
  • Gunicorn이 필요 없이 바로 실행 가능
  • Flask 앱을 프로덕션 환경에서 사용할 수 있도록 최적화

6. 성능 테스트 (MongoDB 커넥션 풀 테스트)

MongoDB의 maxPoolSize 설정이 제대로 적용되었는지 확인하려면, 부하 테스트를 진행해야 합니다.

(1) 현재 MongoDB 연결 수 확인

MongoDB 쉘에서 실행:

mongo --eval "db.serverStatus().connections"

또는 Flask 엔드포인트로 확인:

http://localhost:5000/fetch

(2) wrk를 사용한 부하 테스트

Windows에서 지원되는 부하 테스트 도구 wrk를 사용하여 MongoDB 연결 풀을 테스트할 수 있습니다.

설치 방법

wrk 다운로드:
👉 https://github.com/wg/wrk/releases
Windows용 wrk.exe 다운로드 후, 실행 폴더에 저장하세요.

테스트 실행

wrk -t4 -c100 -d30s http://localhost:5000/fetch

🔹 옵션 설명

옵션설명

-t4 4개의 쓰레드 사용
-c100 100개의 동시 연결 유지
-d30s 30초 동안 테스트 실행

테스트가 정상적으로 실행되면, MongoDB 커넥션 풀 설정이 적용된 것을 확인할 수 있습니다.


7. 성능 최적화 팁

MongoDB 성능을 극대화하려면 다음 설정을 고려해야 합니다.

(1) maxPoolSize 값 조정

  • 기본값: 100
  • 테스트 후 적절한 값으로 변경 (200~500 추천)

(2) 워커 수 조정 (-w)

  • CPU 코어 수에 맞춰 워커 수 조절
  • -w 값을 CPU 코어 수 * 2로 설정

(3) MongoDB 인덱스 추가

대량의 데이터가 삽입될 경우, 인덱스를 추가하여 성능을 최적화할 수 있습니다.

collection.create_index([("name", 1)])

(4) gunicorn.conf.py 설정 (Linux용)

Gunicorn을 리눅스에서 실행할 경우, gunicorn.conf.py를 사용하여 최적화할 수 있습니다.

workers = 4
worker_class = "gevent"
bind = "0.0.0.0:5000"
timeout = 120
max_requests = 1000

8. 결론

  • Windows에서도 Flask + Gunicorn + MongoDB 커넥션 풀 설정 가능
  • Gunicorn은 gevent를 사용하여 Windows에서 실행
  • maxPoolSize=200으로 설정하여 성능 최적화
  • wrk 도구를 활용하여 MongoDB 커넥션 풀 부하 테스트 가능
  • Gunicorn이 실행되지 않을 경우 Waitress 사용 가능

이제 Windows 환경에서도 MongoDB 연결 풀을 최적화하여 Flask 애플리케이션의 성능을 극대화할 수 있습니다! 🚀

🔹 관련 키워드:
Windows Flask Gunicorn MongoDB, MongoDB maxPoolSize 설정, Flask MongoDB 연결 최적화, Gunicorn Windows 실행, Waitress Flask 서버, MongoDB 부하 테스트, Flask 성능 튜닝

반응형