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 성능 튜닝