기본 콘텐츠로 건너뛰기

GPU A100 동시 처리 측정을 위한 부하 테스트 후기 (엘리스 클라우드)

생성형 AI가 GPU 서버 위에서 돈다는 건 알고 있었다. 그런데 "이 GPU 한 장이 동시에 몇 명까지 받아주느냐"고 물으면 아무도 숫자로 답을 못 했다. 나도 못 했고.

그래서 직접 재봤다. 엘리스 클라우드에서 GPU를 시간당 빌려 모델을 하나 띄우고, 파이썬으로 요청을 한꺼번에 때려봤다. 결과가 생각과 많이 달라서 정리해 둔다.

먼저 테스트 환경부터

엘리스 클라우드의 ML API에서 엔드포인트를 하나 만들었다. 모델을 고르고 GPU 사양을 고르면 호출할 수 있는 주소를 주는 방식이다. 톰캣에 WAR 올려서 서비스 URL 받던 것과 구조가 비슷하다.

  • GPU: A100 80GB PCIe (시간당 2,500원)
  • 모델: Gemma 4 E4B (구글 공개 모델, 메모리 약 18GB 사용)
  • 호출 방식: OpenAI 호환 API (/v1/chat/completions)
  • 조건: 출력 300토큰 고정, temperature 0

temperature를 0으로 고정한 게 중요하다. 이 값이 높으면 매번 답이 달라지고 길이도 들쭉날쭉해진다. 그러면 "GPU가 느린 건지 답이 길어진 건지" 구분이 안 된다. 성능을 재려면 매번 같은 답이 나오게 묶어둬야 한다.

GPU 부하 테스트 구성도 - 파이썬 스크립트에서 게이트웨이를 거쳐 GPU 인스턴스로 요청이 전달되는 흐름

파이썬 25줄이면 부하 테스트가 된다

동시 요청을 보내려면 스레드가 필요하다. 자바로 치면 ExecutorService에 작업을 던지는 것과 같다. 파이썬은 ThreadPoolExecutor 한 줄이면 된다.

import json, sys, time, urllib.request
from concurrent.futures import ThreadPoolExecutor

URL, KEY = sys.argv[1], sys.argv[2]
N = int(sys.argv[3])          # 동시 요청 수

def one(i):
    body = json.dumps({
        "model": "google/gemma-4-e4b-it",
        "messages": [{"role": "user", "content": f"클라우드 컴퓨팅을 세 문장으로 설명해주세요. ({i})"}],
        "max_tokens": 300, "temperature": 0,
    }).encode()
    req = urllib.request.Request(URL + "/v1/chat/completions", data=body,
        headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"})
    t0 = time.time()
    try:
        with urllib.request.urlopen(req, timeout=300) as r:
            d = json.load(r)
        return i, round(time.time()-t0, 2), d["usage"]["completion_tokens"], "OK"
    except Exception as e:
        return i, round(time.time()-t0, 2), 0, str(e)[:40]

call("안녕")                   # 예열용 1건, 측정에서 제외
t0 = time.time()
with ThreadPoolExecutor(max_workers=N) as ex:
    rows = list(ex.map(one, range(1, N+1)))
total = time.time() - t0

중요한 건 예열 호출이다. 첫 요청은 항상 느리다. 그걸 측정에 넣으면 숫자가 망가진다. 톰캣 띄우고 첫 페이지 호출이 느린 것과 같은 이치다.

숫자로 보니 생각과 달랐다

동시 요청 수를 올려가며 돌렸다. 출력 토큰은 전부 300으로 같다.

동시 요청성공평균 소요처리량
5건5/53.72초390 토큰/초
9건9/93.57초698 토큰/초
13건12/133.63초872 토큰/초
20건15/203.52초실패 5건

처음엔 이게 이상했다. 동시 요청을 2배, 3배로 올렸는데 한 건당 걸리는 시간이 거의 안 늘었다. 3.5초에서 3.7초 사이에 머물렀다.

이유는 LLM 서버가 들어온 요청을 묶어서 한꺼번에 처리하기 때문이다. 13건이 들어오면 13건을 한 묶음으로 GPU에 태운다. 그래서 전체 처리량은 390에서 872 토큰/초로 늘었는데, 각자 기다린 시간은 그대로였다. 자바에서 쿼리를 한 건씩 날리지 않고 묶어서 날리는 것과 비슷한 셈이다.

대신 20건부터는 5건이 실패했다. 실패한 요청은 전부 120초를 기다리다 503을 받았다. 성공한 건 3.5초에 끝났는데, 실패한 건 2분을 버티다 떨어졌다.

동시 요청 수에 따른 처리량 측정 결과 막대 그래프 - 5건 390, 9건 698, 13건 872 토큰 매초

그런데 처음 측정했을 때는 이 표가 전혀 다르게 나왔다.

처음 측정했을 때는 숫자가 엉망이었다. 5건에서 345 토큰/초가 나왔는데 9건에서 704, 20건에서 다시 346. 올라갔다 내려갔다 했다.

원인은 간단했다. 테스트 사이에 쉬지 않았다. 실패한 요청이 120초 뒤에 떨어지니까, 앞 테스트의 실패 대기분이 다음 테스트와 겹쳐서 돌아간 거다. 테스트마다 150초씩 쉬고 다시 재니 그제야 깔끔한 곡선이 나왔다.

부하 테스트를 하는 분들은 이거 꼭 챙기시길. 타임아웃 시간보다 길게 쉬어야 한다.

인스턴스를 2개로 늘렸는데 그대로였다

동시 20건에서 5건이 떨어지니 당연히 이렇게 생각했다. "GPU가 모자라구나. 하나 더 띄우면 되겠네."

인스턴스를 2개로 올렸다. 시간당 5,000원이 됐다. 그리고 같은 테스트를 돌렸다.

동시 요청인스턴스 1개인스턴스 2개
13건12건 성공8건 성공
20건15건 성공15건 성공

똑같았다. GPU 값을 두 배로 내고 있는데 처리 건수는 그대로다. 13건에서는 오히려 줄었다.

그래서 의심이 갔다. 두 대가 정말 같이 일하고 있나? 서버 이중화를 해본 사람이면 떠오르는 구분이 있다.

  • Active-Standby: 한 대만 일하고 나머지는 대기. 주 서버가 죽을 때만 투입된다.
  • Active-Active: 두 대가 동시에 일하고 요청을 나눠 받는다.

Active-Active라면 나누는 규칙이 또 있다. 1번, 2번, 1번, 2번 순으로 기계적으로 돌리는 라운드 로빈, 지금 일이 제일 적은 쪽에 주는 최소 연결 같은 것들. LLM처럼 요청마다 처리 시간이 들쭉날쭉한 경우엔 라운드 로빈보다 최소 연결이 맞다. 긴 요청이 한쪽에 몰리면 그쪽만 밀리니까.

만약 Standby 구성이거나 분배가 한쪽으로 쏠린다면, 돈만 두 배 내고 효과는 없는 셈이다. 확인할 방법은 하나뿐이었다. 로그를 열어보는 것.

로그를 열어보고 알았다

인스턴스 두 개의 로그를 각각 받아서, 같은 시각에 들어온 요청 수를 세어봤다. 리눅스 명령 두 줄이면 된다.

# 인스턴스별로 처리한 요청 건수 세기
grep -c 'POST /v1/chat/completions' 인스턴스_1.txt
grep -c 'POST /v1/chat/completions' 인스턴스_2.txt

# 특정 시각대만 보기
grep '06:16' 인스턴스_1.txt | grep 'POST /v1/chat/completions'

동시 10건을 보낸 시각의 결과다.

  • 인스턴스 1번이 처리한 요청: 5건
  • 인스턴스 2번이 처리한 요청: 2건
  • 합계 7건 — 그리고 테스트 성공 건수도 정확히 7건

우선 Active-Standby는 아니었다. 두 대 다 요청을 받고 있었다. 그런데 분배가 고르지 않았다. 다른 테스트들까지 같은 방식으로 세어보니 이랬다.

테스트1번2번합계 = 성공 건수
13건 요청538
20건 요청51015
10건 요청527

5:3, 5:10, 5:2. 라운드 로빈이면 반반에 가까워야 하는데 그렇지 않다. Active-Active는 맞지만 분배가 고르지 않았다.

그런데 더 중요한 건 따로 있었다. 실패한 요청은 어느 로그에도 없었다. 두 로그의 합계가 매번 성공 건수와 정확히 같다. 실패한 요청은 인스턴스까지 오지도 못한 거다. 그 앞 어딘가에서 사라졌다.

같은 시각 GPU 쪽 상태를 보면 더 분명하다. 모델 서버 로그에 이런 줄이 주기적으로 찍힌다.

Avg generation throughput: 150.0 tokens/s, Running: 0 reqs,
Waiting: 0 reqs, GPU KV cache usage: 0.0%

대기 중인 요청 0건, 메모리 사용률 0%. GPU는 받은 일을 다 끝내고 놀고 있었다. 밀린 게 아니라 들어오질 않았다.

자바로 치면 WAS 스레드풀은 텅 비어 있는데 앞단 웹서버 커넥션 수에서 막혀 있는 상황이다. 톰캣 maxThreads를 아무리 올려도 아파치 쪽에서 막히면 소용없는 것처럼.

실제로 인스턴스 로그 한쪽에 이런 흔적도 남아 있었다. 모델 앞에 요청을 중계하는 프록시 프로그램이 있는데, 거기서 전달에 실패한 기록이다.

proxy.py, line 74, in _forward
    TimeoutError
proxy.py, line 76, in _forward
    self.send_error(502, f"Bad Gateway: {exc}")
    BrokenPipeError: [Errno 32] Broken pipe

프록시가 전달에 실패해서 502를 돌려주려 했는데, 클라이언트는 이미 2분을 기다리다 끊은 뒤라 그마저 못 보냈다는 뜻이다. 내부 구조를 다 볼 수는 없으니 어디까지나 추정이지만, 병목은 GPU가 아니라 그 앞의 프록시 단으로 보인다.

요청 유실 지점 도식 - 동시 20건 중 5건이 게이트웨이에서 유실되고 GPU는 유휴 상태

여기까지 재보고 정리한 게 이렇다.

  • GPU 성능과 서비스 처리량은 다른 문제다. GPU가 멀쩡해도 앞단에서 막히면 사용자는 오류를 본다.
  • 돈으로 해결 안 되는 구간이 있다. 인스턴스를 두 배로 늘려도 한도가 그대로였다. 분배도 5:2처럼 고르지 않았다.
  • 실패는 조용히 일어난다. 성공한 요청은 3.5초 만에 멀쩡히 돌아온다. 중간에 끼어 떨어진 요청만 2분을 기다리다 죽는다. 모니터링을 안 하면 모른다.
  • 그래서 호출하는 쪽에 재시도 로직이 필요하다. 503을 받으면 잠깐 쉬었다 다시 보내는 것. 이게 없으면 사용자한테는 그냥 "AI가 응답하지 않습니다"로 보인다.

다음에 같은 걸 해보실 분은 순서만 기억하면 된다. 예열 1건 → 동시 요청 수를 5, 9, 13, 20으로 올리며 측정 → 테스트 사이 150초 휴식 → 실패가 나오면 서버 로그에서 그 요청이 도달했는지 확인. 이 네 가지면 "우리 환경의 한계는 어디인가"가 숫자로 나온다.

GPU 빌려서 모델 띄우는 건 클라우드를 이용하니 생각보다 쉬웠다. 아울러 애매하긴 하지만 실제로 몇 명을 받아주는지 대략적인 감은 잡은거 같다. 동접 처리도 중요하고 건당 처리 속도도 중요하고... 아직은 오리무중 진행중이라는것으로 결론낸다.

이상 GPU 부하 테스트 끝!

댓글

이 블로그의 인기 게시물

싱가포르 여행 필수 준비물: G타입 변환 어댑터 (돼지코 전기 플러그)

조만간 우리 아이들이 싱가포르로 여행을 간다. 핸드폰 충전은 물론이고 다른 전기 제품 사용 때문에 어댑터가 꼭 필요하다. 해외여행 갈 때 어댑터 하나 잘못 챙겨가면 충전도 못 하고 전기 사용도 못 해서 낭패 보는 경우가 많다. 10년 전에 내가 싱가포르에 출장 갈 일이 있었는데 그때는 멀티 어댑터를 누군가에게 빌려갔었다. 이번 기회에 아이들 여행 준비물 중에 하나인 변환 플러그 검색하면서 알게 된 싱가포르 사용하는 전압과 플러그 타입, 어떤 어댑터를 챙겨야 하는지를 공유하려 한다. 싱가포르 여행을 계획하는 사람들을게 도움이 되겠지?  내 자식들 챙겨주는 마음으로 꼼꼼하게 설명해 줄 테니, 싱가포르 여행 준비물 리스트에 어댑터 관련 정보가 필요한 사람들은 꼭 참고했으면 한다. 1. 싱가포르 전기 환경 (전압과 플러그 타입) 해외여행 시 현지 전기 환경을 파악하는 것은 필수적인 여행 준비물 점검 사항이다. 싱가포르는 한국과 다른 전압 및 플러그 타입을 사용한다. 1.1 싱가포르 전압 (Voltage) 싱가포르는 230V(볼트) 전압을 사용한다. 한국은 220V를 사용하므로 전압 자체는 큰 차이가 없다. 대부분의 최신 전자기기(휴대폰 충전기, 노트북 충전기 등)는 100~240V의 프리볼트(Free Voltage)를 지원하므로, 전압 변환기(변압기)는 별도로 필요하지 않다. 1.2 싱가포르 플러그 타입 (Plug Type) 및 사용 국가 싱가포르는 Type G 플러그를 사용한다. 이는 영국식 3핀(세 발) 플러그 형태로, 한국(Type C, F)과는 모양이 완전히 다르다. 따라서 한국에서 사용하는 전자기기를 싱가포르에서 사용하려면 반드시 Type G 형태의 어댑터가 필요하다. Type G 플러그를 사용하는 주요 국가   아시아: 싱가포르, 홍콩, 말레이시아, 아랍에미리트(UAE) 등 유럽: 영국, 아일랜드, 몰타, 키프로스 등 기타: 사우디아라비아, 카리브해 일부 국가 등 이러한 국가들을 여행할 때도 Type G 어댑터 하나만 있으면 전기 ...

제주도 탐나는전 결제 사용 후기 (실물카드 미소지로 사용 실패)

제주도 여행을 앞두고 지역화폐인 '탐나는전'을 신청했다. 평소 성남사랑상품권을 잘 쓰고 있어서 제주도에서도 비슷하게 편리하게 쓸 수 있을 거라 생각했거든. 그런데... 결론부터 말하면 한 번도 써보지 못하고 환불하게 됐다. 탐나는전 신청과 설정 제주 출발 전에 미리 탐나는전을 신청했어. 신청 후 1주일 이내에 집에 도착.. 안내 브로셔를 보니 꽤 체계적으로 되어있더라고. 캐시백 혜택부터 시작해서 카드 등록, 사용법까지 자세히 나와있었어. 특히 소득공제 혜택도 있고, 한도상향 완료라는 문구도 보이니 더욱 기대가 됐어. 성남사랑상품권처럼 잘 활용할 수 있을 거라 생각했거든. 카드 등록 카드 등록을 진행했어. 인터페이스도 깔끔하고 사용하기 편해 보였어. "탐나는전 사용 가능한 카드를 신청 또는 등록해주세요!"라는 안내 문구를 보며 설레었지. 카드 정보를 직접 입력하거나 바코드로 인식할 수 있게 되어있어서 편리했어. 성남사랑상품권 앱과 비슷한 느낌이었거든. 난 바코드로 한큐에 등록.. 출발 전날인 6월 24일에 10만원을 충전했어. 탐나는전 선불카드로 등록도 완료하고, 제주도에서 맛있는 것도 사고 기념품도 살 생각에 들떠있었지. 그런데... 현실은? 제주도에 도착해서 탐나는전을 써보려고 했는데, 큰 문제가 있었어. 성남사랑상품권처럼 QR코드나 바코드로 간편하게 결제할 수 있을 거라 생각하고 실물카드를 안 가져갔거든. 그런데 제주도 매장들은 대부분 실물카드만 받더라고! QR코드나 바코드 결제를 지원하는 곳이 거의 없어서 당황했어. 성남에서는 거의 모든 곳에서 앱으로 간편결제가 되니까 당연히 제주도에서도 될 거라 생각했는데... 완전 오산이었어 😢 결국 환불... 여행 내내 한 번도 써보지 못하고, 마지막 날인 6월 29일에 결국 10만원 전액 환불했어. 충전 수수료나 환불 수수료 같은 건 없어서 다행이었지만, 뭔가 허무한 기분이었어. 후기와 조언 탐나는전 자체는 나쁘지 않은 시스템인 것 같아. 소득공제 혜택도 있고, 앱도 사용하기 편해...

미국 주식 투자 환전 수수료 비교 (증권사 환율우대 100% 찾는 법)

나는 달러 환테크와 미국 주식 투자를 병행하고 있다. 단순히 달러를 사고파는 것을 넘어, 환전한 달러로 바로 미국 주식을 매매할 수 있어야 하므로 증권사 환전 서비스를 이용하는 것은 필수다. 혹시 미국 주식을 아직도 한번도 매매 못한 사람을 위해 일반적인 프로세스는 아래와 같다. 이때 가장 중요한 것이 바로 '환전수수료' , 즉 환율우대 혜택이다. 1%, 0.1%의 수수료 차이가 투자 수익률에 큰 영향을 미치기 때문이다. 오늘은 미국 주식 투자를 위한 증권사별 환전 서비스를  비교하고, 환율우대 혜택을 가장 많이 받을 수 있는 곳이 어디인지 직접 정리해 본다.  1. 들어가기 전: 환전수수료와 환율우대란? 우리가 달러를 살 때, 기준이 되는 '매매기준율'에 증권사가 수수료를 붙여서 판매한다. 이 수수료를 '환전 스프레드' 라고 하며, 보통 1달러당 5원~10원 정도다. '환율우대' 란 이 환전 스프레드를 깎아주는 것을 의미한다. 예를 들어, 환율우대 95% 는 내가 내야 할 환전수수료의 95%를 할인해준다는 뜻이다. 당연히 우대율이 높을수록 우리에게 유리하며, 환율우대 100%는 환전수수료가 0원 이라는 의미다. 2. 증권사별 환전 우대율 및 이용 시간 비교 (우대율 높은 순) ※ 중요: 아래 정보는 신규 또는 휴면 고객 대상 이벤트 기준으로, 2025년 8월 말 현재 시점으로 재확인한 내용이다. 이벤트 기간이나 조건은 언제든 변경될 수 있으니, 거래 전 반드시 해당 증권사에 직접 확인해야 한다. 참고로 난 한투로 미국 주식을 하고 있는데 90% 우대를 받고 있다. 아직은 작은 금액이라 무시하고 있지만 억단위로 넘어가면 위 증권사 계좌로 넘어갈 계획이다. 3. 서비스별 심층 분석 및 투자 전략 3.1 조건부 최강자: NH투자증권 (나무증권)  NH투자증권은 '원화주문' 이라는 독특한 서비스를 통해 차별점을 가진다. 핵심 장점: 24시간 100% 자동 환율우대: 미국 주식 시장이 열리...