토큰 사용량 집계, 대시보드에 뭘 담아야 쓸모 있을까요

결론부터 말씀드리면, 토큰 사용량 집계 대시보드는 총 토큰 수 하나만 보여줘서는 쓸모가 없습니다. 모델별, 입력·출력 방향별, 캐시 히트 여부별로 쪼개서 쌓아야 비용 분석이 가능해지고 이상 징후도 잡아낼 수 있습니다. 이 글에서는 어떤 필드를 어떤 단위로 모아야 하는지, 그리고 실시간 집계가 오히려 방해가 되는 상황은 언제인지까지 구체적으로 짚어보겠습니다. 토큰 사용량 집계, 범위를 어디까지 잡아야 할까요 가장 … Read more

LLM 비용 급증, 그 원인을 찾아가는 추적 순서

어느 날 API 청구서 금액이 평소보다 두세 배로 찍혀 있으면 제일 먼저 뭘 봐야 할까요? 로그를 무작정 뒤지기보다 최근 배포 내역, 날짜·모델별 토큰 사용량 분해, 재시도·루프 여부, 조용히 바뀐 설정, 캐싱 적용 여부 순서로 짚어보면 원인이 훨씬 빨리 좁혀집니다. LLM 비용 급증은 대부분 한 가지 원인이 아니라 이 중 두 지점 이상이 겹쳐서 일어나기 때문에, … Read more

헬스체크 설계가 허술하면 200 OK인데도 서비스는 죽어 있습니다

새벽에 알람이 울려서 확인해보니 /health는 계속 200을 뱉고 있는데, 정작 사용자는 로그인도 안 되고 결제도 막혀 있던 경험, 한 번쯤 있으실 겁니다. 이런 상황이 반복된다면 원인은 대부분 헬스체크 설계 자체에 있습니다. 프로세스가 살아있는지만 보는 체크와, 실제로 요청을 처리할 수 있는지 보는 체크를 구분하지 않았기 때문입니다. 이 글은 쿠버네티스 환경에서 HTTP GET 방식의 프로브를 쓰는 경우를 … Read more

UTC 저장 원칙, 서버 시간과 DB 시간이 다를 때 확인할 것

서버 애플리케이션에서 시간을 다룰 때는 DB에 UTC로 저장하고, 화면에 보여줄 때만 사용자 타임존으로 변환하는 것이 원칙입니다. 이 원칙을 지키지 않으면 서버 시간과 DB 시간이 몇 시간씩 어긋나는 버그가 배포 후에야 드러납니다. 다만 반복 일정이나 법적 기록처럼 UTC 저장이 오히려 불리해지는 예외도 분명히 있어서, 이번 글에서는 그 경계선을 실제 설정값 기준으로 짚어보겠습니다. 서버 시간과 DB 시간이 … Read more

작업 스케줄러 환경변수가 안 보이는 이유, SYSTEM 계정의 함정

로컬에서 python job.py로 돌리면 멀쩡하던 스크립트가, 작업 스케줄러에 등록하고 나면 API 키를 못 찾겠다며 죽어버리는 경우가 있습니다. 결론부터 말씀드리면 이건 코드 문제가 아니라 작업 스케줄러가 어떤 계정으로 프로세스를 띄우느냐의 문제입니다. 작업을 SYSTEM 계정으로 등록하면 로그인 사용자가 설정한 환경변수를 파이썬이 아예 읽지 못하는 구조이기 때문입니다. 이 글은 Windows 10/11의 작업 스케줄러(Task Scheduler)와 schtasks 명령, 그리고 파이썬 … Read more

의존성 락 파일, 배포할 때마다 버전이 바뀌는 문제 해결하기

배포할 때마다 프로덕션 서버에 깔리는 패키지 버전이 로컬과 미묘하게 달라지는 이유가 뭘까요? 대부분은 package.json에 적힌 ^1.2.0, ~1.2.0 같은 버전 범위가 설치 시점마다 다른 최신 패치·마이너 버전을 끌어오기 때문이고, 이 문제는 의존성 락 파일을 정확히 커밋하고 npm ci 같은 설치 명령을 쓰면 대부분 해결됩니다. 락 파일만 있다고 끝나는 건 아니고, 어떻게 만들고 어떻게 설치하느냐에 따라 재현 … Read more

컨테이너가 OOMKilled로 죽을 때 — 원인을 좁히는 점검 순서

결론부터 말씀드리면, 컨테이너가 OOMKilled로 죽었을 때 무작정 리밋부터 올리는 건 순서가 틀렸습니다. 진짜 메모리 부족 때문에 죽은 게 맞는지, 그 순간 컨테이너 메모리 제한이 얼마로 걸려 있었는지를 docker inspect와 kubectl describe로 먼저 확인해야 같은 장애가 사이즈만 커져서 재발하는 걸 막을 수 있습니다. 이 글에서는 그 확인 순서를, 실제 명령어와 출력 예시를 곁들여 정리해 드립니다. OOMKilled인지부터 … Read more

로그가 하루 수 GB, 구조화 로깅과 샘플링으로 잡는 법

이 글을 읽으시면 로그가 왜 하루 만에 수 GB씩 쌓이는지, 그리고 구조화 로깅과 로그 샘플링·로테이션을 어떤 기준으로 조합해야 디스크와 조회 성능을 동시에 지킬 수 있는지 감을 잡으실 수 있습니다. 결론부터 말씀드리면, 모든 로그를 JSON 같은 구조화 형식으로 남기되 INFO 이하는 샘플링으로 걸러내고 WARNING 이상은 무조건 전량 기록한 뒤, 보관 기간을 정해 로테이션하는 조합이 실무에서 가장 … Read more

파이썬 타임존 오류로 예약이 한 시간씩 밀리는 이유

이 글을 읽으면 예약 시스템에서 시간이 한 시간씩 어긋나는 문제의 정확한 원인과, aware·naive 두 객체의 경계를 코드로 확인하는 방법을 알 수 있습니다. 결론부터 말씀드리면, 파이썬 타임존 문제로 인한 1시간 오차는 대부분 naive datetime과 aware datetime을 섞어 쓰거나, 서머타임(DST)이 있는 지역에 고정 오프셋을 하드코딩했을 때 생깁니다. 아래에서 실제 코드로 재현하고, 어디를 고치면 되는지 짚어 드리겠습니다. 예약 … Read more

FastAPI 파일 업로드, 대용량은 스트리밍과 임시파일로 처리하세요

FastAPI에서 UploadFile로 받은 파일은 일정 크기까지만 메모리에 머물다가, 그 이상은 자동으로 디스크의 임시파일로 넘어갑니다. FastAPI 파일 업로드 코드를 대용량 파일에 그대로 쓰면, 이 전환 시점과 임시파일 정리 시점을 모른 채 서버 메모리나 디스크를 순식간에 채우는 경우가 많습니다. 이 글에서는 스트리밍 방식으로 파일을 받아 임시파일로 안전하게 저장하는 실제 코드와, 이 방식이 통하지 않는 상황까지 함께 짚어드립니다. … Read more