13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] 자원 사용량

  • [OpenStack] 오픈스택 비용 분석: 프로젝트별 자원 사용량 기반 차지백 모델

    [OpenStack] 오픈스택 비용 분석: 프로젝트별 자원 사용량 기반 차지백 모델

    [OpenStack] 오픈스택 비용 분석: 프로젝트별 자원 사용량 기반 차지백 모델

    오픈스택 비용 분석 이야기는 결국 운영팀과 서비스팀이 같은 숫자를 보느냐의 문제로 이어집니다. OpenStack(오픈스택)을 오래 만지다 보면 CPU는 누가 얼마나 썼는지, Block Storage(블록 스토리지)는 어느 프로젝트가 계속 늘리는지, 떠 있는 인스턴스는 왜 줄지 않는지 같은 질문이 계속 나오거든요. 저도 처음엔 단순히 Quota(쿼터)만 잘 걸면 되겠지 싶었는데, 실제로 운영해보니 그걸로는 안 되더라고요. **프로젝트 테넌트(Project/Tenant)별 자원 사용량을 근거로 한 차지백(Chargeback, 비용 청구) 모델**이 있어야 각 팀이 자기 사용량을 이해하고, 운영팀도 클라우드 비용 관리를 설득력 있게 할 수 있더라고요.

    특히 내부 프라이빗 클라우드에서는 퍼블릭 클라우드처럼 자동 청구서가 나오지 않으니, 오픈스택 비용 분석 체계를 직접 설계해야 합니다. 오늘은 제가 실제로 많이 부딪혔던 기준으로, 무엇을 측정할지, 어떻게 집계할지, 프로젝트별로 어떤 방식으로 금액화할지를 정리해보겠습니다. 복잡하게 시작하면 오래 못 갑니다. 그래서 이번 글은 작동하는 최소 모델부터 시작하는 방향으로 설명드릴게요.

    Keystone, Nova, Cinder, Glance, Ceilometer, Gnocchi, CloudKitty가 어떻게 연결되어 프로젝트별 비용 집계로 이어지는지 보여주는 개요 이미지입니다.

    왜 오픈스택 차지백이 필요한가

    쉽게 말해, 차지백은 "누가 얼마나 썼는지 보이고, 그에 맞게 비용을 배분하는 방식"입니다. Showback(쇼백, 사용량 공개만 하는 방식)에서 시작해 Chargeback(실제 비용 배분)으로 가는 경우가 많습니다.

    • 운영팀 입장: 증설 요청이 들어왔을 때 근거가 생깁니다.
    • 서비스팀 입장: 유휴 자원(idle resources)을 줄일 유인이 생깁니다.
    • 경영/관리 입장: 클라우드 비용 관리가 숫자로 보입니다.

    제가 처음 차지백 모델을 설계할 때 가장 많이 들었던 말이 "우린 그냥 공용 클라우드인데 굳이 계산해야 하나요?"였는데요, 몇 달만 지나면 분위기가 달라집니다. 누군가는 항상 더 많이 쓰고, 누군가는 자기가 손해 본다고 느끼거든요. 여기서 중요한 포인트! 차지백의 핵심은 완벽한 회계가 아니라, 합의 가능한 기준입니다.

    프로젝트 테넌트와 자원 사용량, 어디까지 볼 것인가

    OpenStack Identity(아이덴티티) 서비스인 Keystone(키스톤) 기준으로 Project(프로젝트)는 예전 표현으로 Tenant(테넌트)와 거의 같은 의미로 쓰입니다. 실제 운영 현장에서도 아직 프로젝트 테넌트라는 말을 섞어서 많이 쓰죠. 비용 배분의 기준 단위는 보통 이 프로젝트예요.

    그다음은 어떤 자원을 과금 대상으로 볼지 정해야 합니다. 저는 처음부터 너무 넓게 잡지 않는 걸 추천하는 편입니다.

    자원 영역 대표 서비스 과금 기준 예시 초기 적용 난이도
    Compute(컴퓨트) Nova vCPU, RAM, 인스턴스 가동 시간 낮음
    Block Storage(블록 스토리지) Cinder 볼륨 용량 GB, 스냅샷 용량 낮음
    Image(이미지) Glance 이미지 저장 용량 보통
    Object Storage(오브젝트 스토리지) Swift 저장 용량, 요청 수 보통
    Network(네트워크) Neutron Floating IP, LB, 트래픽 높음

    보통 처음에는 Compute + Volume만으로도 충분하거든요. 왜냐하면 이 두 항목이 가장 설명하기 쉽고, 프로젝트별 자원 사용량 변화가 잘 보이기 때문입니다. 반대로 Network egress(외부 송신 트래픽) 같은 항목은 측정과 합의가 조금 더 까다로워요.

    오픈스택 비용 분석의 기본 구조

    OpenStack Telemetry(텔레메트리) 쪽을 보면 Ceilometer(실로미터)가 미터(meter)와 샘플을 수집하고, 환경에 따라 Gnocchi(그노치) 같은 시계열 저장소와 함께 사용합니다. 그리고 CloudKitty(클라우드키티)는 공식 문서 기준으로 Rating-as-a-Service(과금/평가 서비스) 역할을 하는 프로젝트입니다. 즉, 사용량 수집과 요금 규칙 적용을 분리해서 생각하면 구조가 훨씬 명확해져요.

    1. Keystone에서 프로젝트 식별
    2. Nova, Cinder, Glance 등에서 자원 메타데이터 확인
    3. Ceilometer/Gnocchi로 사용량 데이터 수집
    4. CloudKitty 또는 별도 스크립트로 단가(rule) 적용
    5. 프로젝트별 월간 리포트 생성

    여기서 꼭 기억하실 부분이 있습니다. 사용량 데이터가 있다고 바로 비용 청구가 되는 게 아니더라고요. 측정값(Meter)과 과금 항목(Billable item)은 다르거든요. 예를 들어 CPU 사용률 자체보다는, 실제 운영에서는 할당된 vCPU 수와 인스턴스 실행 시간을 곱해서 보는 편이 훨씬 설명하기 쉽더라고요.

    오픈스택 차지백을 위한 Ceilometer와 CloudKitty 기반 비용 집계 파이프라인 이미지

    Telemetry 수집부터 프로젝트별 요금 계산, 리포트 생성까지 이어지는 파이프라인을 단계별로 표현한 이미지입니다.

    실전 구현 1: 최소 차지백 기준부터 정하기

    제가 직접 해보니 제일 먼저 해야 하는 건 도구 설치가 아니라 과금 기준표를 문서로 박는 일이었어요. 기준이 없으면 숫자가 나와도 싸움만 납니다 ㅎㅎ

    예를 들면 이런 식입니다.

    항목 과금 단위 설명
    vCPU vCPU-hour 인스턴스에 할당된 vCPU 수 x 실행 시간
    RAM GB-hour 할당 메모리 GB x 실행 시간
    Volume GB-month 볼륨 크기 기준 월간 보유량
    Snapshot GB-month 스냅샷 저장량 기준
    Floating IP 개수/월 예약 자원으로 단순화 가능

    이 모델의 장점은 간단해요.

    • 프로젝트 테넌트별 설명이 쉽습니다.
    • 월별 추세 비교가 가능합니다.
    • Idle VM(유휴 가상머신) 정리에 바로 효과가 납니다.

    반대로 단점도 물론 있어요.

    • 실사용 CPU와 할당 CPU가 다를 수 있습니다.
    • Overcommit(오버커밋) 환경을 100% 반영하지 못합니다.
    • 네트워크 사용량까지 정밀하게 포함하긴 어렵습니다.

    그래도 첫 버전은 이 정도가 딱 좋더라고요. 처음부터 완벽한 원가 계산으로 들어가면 운영팀만 지쳐요.

    실전 구현 2: OpenStack CLI로 프로젝트와 자원 목록 뽑기

    이제 실무적으로 데이터를 뽑아보겠습니다. OpenStackClient(오픈스택 클라이언트)가 있다는 전제입니다.

    1. 프로젝트 목록 확인

    openstack project list -f value -c ID -c Name

    이 명령으로 프로젝트 ID와 이름을 간단히 가져와요. 나중에 리포트에서 사람이 읽기 좋은 이름을 붙일 때 필요합니다.

    2. 인스턴스 목록 확인

    openstack server list --all-projects -f json

    기본 목록은 여기까지인데, 실제 비용 계산에서는 Flavor(플레이버) 정보가 꼭 필요하더라고요. vCPU와 RAM이 여기 들어 있으니까요.

    3. 볼륨 목록 확인

    openstack volume list --all-projects -f json

    볼륨은 생각보다 누수 포인트가 많아요. 인스턴스는 지워졌는데 볼륨은 남아 있는 경우, 스냅샷만 계속 쌓이는 경우 정말 흔하거든요.

    4. 사용량 통계 확인

    openstack usage list --start 2026-08-01 --end 2026-08-31

    환경에 따라 제공 정보가 제한적일 수 있지만, 월간 사용량 감을 잡는 데는 꽤 유용하더라고요.

    실전 구현 3: 간단한 비용 계산 스크립트 예시

    처음부터 CloudKitty를 붙이지 않고, CSV 또는 JSON 기반으로 먼저 검증하는 방식을 추천드립니다. 저도 실제로 써보니까 이 단계가 있어야 과금 로직을 눈으로 검산할 수 있어서 훨씬 편하더라고요.

    from decimal import Decimal
    
    RATES = {
        "vcpu_hour": Decimal("15"),
        "ram_gb_hour": Decimal("5"),
        "volume_gb_month": Decimal("1000"),
    }
    
    project_usage = {
        "team-a": {
            "vcpu_hours": Decimal("240"),
            "ram_gb_hours": Decimal("960"),
            "volume_gb_month": Decimal("500"),
        },
        "team-b": {
            "vcpu_hours": Decimal("120"),
            "ram_gb_hours": Decimal("480"),
            "volume_gb_month": Decimal("1200"),
        },
    }
    
    for project, usage in project_usage.items():
        total = (
            usage["vcpu_hours"] * RATES["vcpu_hour"]
            + usage["ram_gb_hours"] * RATES["ram_gb_hour"]
            + usage["volume_gb_month"] * RATES["volume_gb_month"]
        )
        print(project, total)

    숫자 자체는 예시입니다. 여기서 중요한 건 요금 규칙과 사용량 데이터를 분리하는 구조예요. 그러면 나중에 단가 조정, 할인 정책, 특정 프로젝트 예외 처리가 훨씬 쉬워져요.

    실제 운영에서는 보통 아래 흐름으로 갑니다.

    1. OpenStack API나 리포트로 원천 데이터 추출
    2. 프로젝트 ID 기준으로 그룹화
    3. vCPU-hour, GB-hour, GB-month 같은 과금 단위로 변환
    4. 단가 테이블 적용
    5. 월간 리포트 CSV/HTML/PDF 생성

    실전 구현 4: CloudKitty를 붙일 때 보는 포인트

    CloudKitty는 OpenStack용 차지백/레이팅에 특화된 프로젝트더라고요. 규모가 커지면 검토할 가치가 있어요. 공식 문서 기준으로 hashmap(해시맵) 방식의 rating module(평가 모듈)을 사용해 규칙 기반 요금 계산을 구성할 수 있거든요.

    cloudkitty module list

    이런 식으로 모듈 상태를 먼저 확인하고, 어떤 rating module을 쓸지 정합니다. 다만 여기서 한 가지. CloudKitty를 도입한다고 해서 비용 모델 설계가 자동으로 해결되는 건 아니더라고요. 오히려 내부 단가 기준과 메타데이터 정합성이 훨씬 더 중요해요.

    제가 삽질했던 포인트는 딱 세 가지더라고요.

    • 프로젝트명 변경 이력 관리가 안 되어 과거 리포트와 현재 명칭이 안 맞음
    • 삭제된 인스턴스의 사용 이력을 어디까지 반영할지 기준이 없음
    • Volume과 Snapshot의 집계 시점을 월말 기준으로 볼지 평균 보유량으로 볼지 합의가 안 됨

    이런 건 기술 문제가 아니라 운영 기준 문제예요. 그래서 저는 항상 먼저 문서화해요.

    프로젝트별 자원 사용량과 오픈스택 비용 분석 결과를 보여주는 대시보드 이미지

    프로젝트별 vCPU, 메모리, 볼륨 사용량과 월간 비용이 한눈에 보이는 내부 대시보드 예시 이미지입니다.

    ⚠️ 주의사항: 실제로 자주 터지는 문제들

    여기서부터는 정말 현업 냄새 나는 구간입니다. 저도 처음엔 이게 뭔가 싶었는데, 몇 번 월말 정산을 돌려보면 패턴이 보이더라고요.

    1. Meter와 Billing Unit을 혼동하는 문제

    Ceilometer에서 수집한 meter(미터)는 정말 많아요. 하지만 다 과금에 쓸 수 있는 건 아니더라고요. 예를 들어 CPU 누적 시간, 메모리 사용률 같은 값은 관제에는 좋은데, 비용 청구 기준으로는 오히려 설명하기가 어려워요.

    해결법: 운영팀이 설명 가능한 단위로 단순화하세요. vCPU-hour, GB-hour, GB-month가 시작점으로 좋습니다.

    2. 삭제 자원 누락 문제

    월중에 생성됐다가 삭제된 인스턴스는 목록 조회만으로는 빠질 수 있거든요. 이 때문에 "분명 썼는데 왜 청구가 안 됐지?" 또는 반대로 "왜 이 숫자가 나오지?"가 생깁니다.

    해결법: 상태 스냅샷만 보지 말고, 사용량 기록 또는 이벤트 이력을 기준으로 월간 집계하세요.

    3. 프로젝트 메타데이터 불일치

    프로젝트명, 비용 센터(cost center), 담당 조직 정보가 제각각이면 리포트가 엉망이 되더라고요.

    해결법: Keystone 프로젝트에 연결되는 관리용 메타데이터 체계를 따로 두고, 리포트 생성 전에 매핑 테이블을 정리하세요.

    4. 스토리지 과금 시점 논쟁

    볼륨 용량은 월말 시점만 볼지, 일평균 보유량을 볼지에 따라 결과가 달라지더라고요. 둘 다 틀린 건 아닌데, 기준이 매달 바뀌면 신뢰를 잃어요.

    해결법: 정책을 먼저 고정하고, 월별로 동일하게 적용하세요.

    검증: 리포트가 맞는지 어떻게 확인할까

    완성된 차지백 모델은 반드시 검증 단계를 거쳐야 하더라고요. 저는 보통 아래 3단계로 확인하는 편이에요.

    1. 샘플 프로젝트 1개를 골라 수작업으로 계산해 보기
    2. OpenStack CLI 결과와 리포트 결과를 대조하기
    3. 운영팀과 서비스팀이 함께 숫자를 리뷰하기

    예를 들면 이런 검증표를 만들어두면 좋습니다.

    검증 항목 원천 데이터 리포트 값 확인 포인트
    인스턴스 수 server list 월간 집계 수 삭제 자원 포함 여부
    vCPU 총합 flavor 매핑 vCPU-hour 가동 시간 반영 여부
    볼륨 총합 volume list GB-month Detached volume 포함 여부
    프로젝트명 project list 청구서 표기명 매핑 테이블 일치 여부

    이 과정을 지나면 드디어 “아, 이제 숫자가 말이 된다” 싶은 순간이 와요. 그때부터는 Showback 보고서만 돌려도 팀들이 먼저 반응하더라고요. 어떤 팀은 오래된 테스트 인스턴스를 지우고, 어떤 팀은 Snapshot 정리를 하더라고요. 이거 진짜 편합니다. 비용 청구 이전에 자원 최적화 효과가 먼저 나타나거든요.

    오픈스택 차지백 적용 전후의 비용 가시성 개선을 보여주는 인포그래픽

    유휴 자원 감소, 프로젝트별 비용 가시성 향상, 월간 리포트 정착 전후를 비교하는 요약 인포그래픽입니다.

    정리: 오픈스택 비용 분석은 완벽함보다 지속 가능성이 중요합니다

    오늘 정리한 내용을 한 문장으로 요약하면 이래요. 오픈스택 비용 분석은 Telemetry(텔레메트리) 수집보다, 프로젝트 테넌트 기준의 합의 가능한 과금 모델을 만드는 일이 훨씬 더 중요하더라고요.

    제가 여러 번 해보니 가장 현실적인 순서는 아래와 같더라고요.

    1. Compute와 Volume만으로 시작
    2. 프로젝트별 자원 사용량 리포트부터 정착
    3. Showback으로 1~2개월 운영
    4. 이후 Chargeback으로 확대
    5. 필요하면 CloudKitty 같은 전용 도구 도입

    혹시 지금 오픈스택 차지백을 준비 중이신가요? 그렇다면 처음부터 거대한 과금 엔진을 만들기보다, 설명 가능한 숫자를 먼저 만드는 걸 강력 추천해요. 그게 결국 오래 갑니다. 다음 글에서는 프로젝트별 태깅 전략과 비용 센터 매핑, 그리고 리포트 자동화 파이프라인을 더 깊게 다뤄볼 생각입니다. 이전 글에서 다뤘던 OpenStack 운영 표준화 이야기도 같이 보시면 흐름 잡는 데 도움이 되실 거예요.

    FAQ: 현장에서 자주 받는 질문

    Q1. 오픈스택 비용 분석은 반드시 CloudKitty가 있어야 하나요?

    아니에요. 초기에는 OpenStack API 결과와 간단한 스크립트만으로도 충분히 시작할 수 있어요. 다만 규모가 커지고 규칙이 복잡해지면 전용 도구 검토 가치가 있더라고요.

    Q2. 프로젝트 테넌트 기준이 항상 맞나요?

    대부분의 내부 차지백에서는 가장 관리하기 쉬운 기준이에요. 다만 조직 구조와 다르면 프로젝트와 비용 센터 매핑 테이블을 별도로 두는 편이 좋아요.

    Q3. CPU 사용률 기반 과금이 더 정확한 것 아닌가요?

    정확성만 보면 일리가 있지만, 실제 운영에서는 설명 가능성과 재현 가능성이 훨씬 더 중요하더라고요. 그래서 할당량 기반의 vCPU-hour 모델이 출발점으로 많이 쓰여요.

  • [Linux] systemd timer vs Cron: 리눅스 작업 스케줄러 성능 및 자원 비교

    [Linux] systemd timer vs Cron: 리눅스 작업 스케줄러 성능 및 자원 비교

    [리눅스] systemd timer vs Cron 비교: 작업 스케줄러 성능 및 자원 사용량

    리눅스 서버를 오래 굴리다 보면 결국 한 번은 붙잡게 되는 주제가 있습니다. 바로 systemd timer Cron 비교입니다. 백업, 로그 정리, 캐시 삭제, 인증서 갱신 같은 작업 자동화는 작아 보여도 장애를 막는 핵심 축이거든요. 저도 처음엔 Cron(크론, 전통적인 작업 스케줄러)만 익숙해서 그냥 crontab부터 열었었는데, systemd timer(시스템디 타이머, systemd 기반 스케줄링)는 또 다른 장점이 분명하더라고요. 특히 서비스 단위 관리, 로그 추적, 의존성 처리에서 차이가 꽤 크거든요.

    이번 글은 단순 기능 소개가 아니라, 리눅스 스케줄러를 실제 운영 관점에서 어떻게 비교해야 하는지, 그리고 성능 벤치마크를 할 때 무엇을 봐야 하는지에 초점을 맞췄습니다. 숫자를 억지로 꾸며 넣는 대신, 제가 홈랩에서 비교할 때 사용한 방식과 해석 포인트를 정리해보겠습니다. 혹시 스케줄러 바꿨다가 로그 찾느라 삽질해보신 적 있으신가요? 그 마음 제가 잘 압니다 ㅎㅎ

    systemd timer Cron 비교를 보여주는 리눅스 스케줄링 개요 다이어그램

    systemd timer와 Cron이 각각 어떤 흐름으로 작업을 실행하는지 보여주는 개요 이미지입니다.

    1. 왜 systemd timer vs Cron 비교가 중요한가

    쉽게 말해 Cron은 시간이 되면 명령어를 실행하는 데 특화되어 있고, systemd timer는 서비스 단위로 작업을 관리하는 데 강하죠. 둘 다 예약 실행은 되지만, 운영에서 중요한 건 그 다음입니다. 실패했을 때 어디서 로그를 볼지, 부팅 직후 누락된 작업을 보정할지, 프로세스 제한을 걸 수 있는지, 다른 서비스가 올라온 뒤에만 실행할지 같은 부분이요.

    • Cron: 단순하고 가볍고 쓰기 편하죠.
    • systemd timer: 추적성과 제어성이 좋거든요.
    • 운영 포인트: 성능 차이보다 관리 편의성 차이가 더 크게 느껴지는 경우가 많습니다.

    여기서 중요한 포인트! 많은 분들이 systemd가 무조건 무겁다고 생각하시는데, 실제로는 작업 자체의 비용보다 어떻게 프로세스를 감싸고 기록하느냐의 차이예요. 이 부분을 제대로 이해하면 선택이 훨씬 쉬워집니다.

    2. 개념 설명: Cron과 systemd timer를 쉽게 말해보면

    Cron은 오래된 표준입니다. <code>* * * * * 같은 표현으로 시간을 적고 명령을 실행하죠. 반면 systemd timer는 .service 파일과 .timer 파일을 분리해서 써요. 처음엔 이게 뭔가 싶었는데, 실제로 써보니까 역할이 나뉘어 있어서 나중에 유지보수할 때 편하더라고요.

    항목 Cron systemd timer
    설정 방식 crontab 한 줄 .service + .timer 파일
    로그 확인 메일 또는 리다이렉션 필요 journalctl(저널ctl, systemd 로그 조회)로 추적 가능
    의존성 처리 제한적 After=, Wants= 등으로 제어 가능
    누락 실행 보정 기본적으로 약함 Persistent=true 지원
    리소스 제어 쉘 수준 처리 위주 CPUQuota=, MemoryMax= 등 cgroup 기반 제어 가능
    진입 장벽 낮음 초반 학습 필요

    systemd timer Cron 비교를 할 때 핵심은 “무엇이 더 빠른가” 하나만 보면 안 된다는 점입니다. 실행 지연(latency, 지연 시간), 프로세스 생성 오버헤드, 로그 추적성, 실패 복구성까지 같이 봐야 제대로 판단할 수 있거든요.

    3. 벤치마크 기준: 성능 및 자원 비교는 무엇을 봐야 하나

    성능 벤치마크라고 하면 보통 처리량부터 떠올리는데, 스케줄러는 조금 달라요. 작업 자동화에서는 아래 기준이 더 실무적입니다.

    1. 실행 정확성: 예약한 시점에 얼마나 정확하게 시작되는가
    2. 오버헤드: 짧은 작업을 실행할 때 추가 비용이 얼마나 붙는가
    3. 로그 가시성: 실패 원인을 얼마나 빨리 찾을 수 있는가
    4. 자원 사용량: 메모리, 프로세스 수, cgroup 제어 가능 여부
    5. 운영 편의성: 배포, 수정, 재시작, 권한 관리가 쉬운가

    제가 직접 체크할 때는 아주 짧은 작업 하나와, 조금 긴 백업성 작업 하나를 나눠서 봅니다. 왜냐하면 짧은 작업에서는 스케줄러 자체의 오버헤드가 더 눈에 띄고, 긴 작업에서는 스케줄러보다 실제 작업 로직이 훨씬 큰 비중을 차지하거든요.

    💡 팁: 성능 벤치마크를 한다면 숫자 하나만 보지 말고 time, journalctl, systemctl status, ps, /usr/bin/time -v를 같이 보는 게 좋아요.

    4. 실전 구현: Cron 방식으로 작업 자동화 구성하기

    먼저 Cron 예시입니다. 가장 익숙한 방식이죠. 예제 작업은 매 5분마다 타임스탬프를 남기는 간단한 스크립트로 잡아보겠습니다.

    mkdir -p ~/scheduler-test
    cat > ~/scheduler-test/job.sh <<'EOF'
    #!/usr/bin/env bash
    set -eu
    printf '%s cron job executed\n' "$(date --iso-8601=seconds)" >> /tmp/scheduler-test.log
    EOF
    chmod +x ~/scheduler-test/job.sh

    이제 crontab에 등록합니다.

    crontab -e
    */5 * * * * /home/USER/scheduler-test/job.sh

    여기서 흔한 삽질이 하나 있어요. Cron은 로그인 셸(login shell)이 아니기 때문에 환경 변수(Environment Variable, 환경 변수)가 생각보다 비어 있습니다. PATH가 달라서 명령을 못 찾는 경우가 진짜 자주 나와요. 저도 처음엔 스크립트는 잘 도는데 Cron에서만 실패해서 한참 봤었네요.

    • 명령어는 가능하면 절대 경로를 써요.
    • 로그 파일 리다이렉션을 명시합니다.
    • 실패 시 메일 설정 또는 별도 알림을 붙여야 해요.
    systemd timer Cron 비교 글의 Cron 설정 예시 이미지

    Cron 작업 등록과 기본 실행 흐름을 이해하기 쉽게 보여주는 예시 이미지입니다.

    5. 실전 구현: systemd timer 방식으로 구성하기

    이번엔 같은 작업을 systemd timer로 옮겨보겠습니다. 파일이 둘로 나뉘니까 복잡해 보이지만, 한 번 패턴 잡히면 오히려 정리가 잘 되거든요.

    5-1. service 파일 작성

    # /etc/systemd/system/scheduler-test.service
    [Unit]
    Description=Scheduler test job
    
    [Service]
    Type=oneshot
    ExecStart=/home/USER/scheduler-test/job.sh
    User=USER
    Group=USER

    5-2. timer 파일 작성

    # /etc/systemd/system/scheduler-test.timer
    [Unit]
    Description=Run scheduler test every 5 minutes
    
    [Timer]
    OnCalendar=*:0/5
    Persistent=true
    Unit=scheduler-test.service
    
    [Install]
    WantedBy=timers.target

    5-3. 활성화 및 확인

    sudo systemctl daemon-reload
    sudo systemctl enable --now scheduler-test.timer
    systemctl list-timers --all | grep scheduler-test
    systemctl status scheduler-test.timer

    실제로 써보니까 여기서 편한 건 딱 세 가지였어요. 첫째, 로그 추적이 쉽거든요. 둘째, 서비스 단위 재실행이 쉽고요. 셋째, 리소스 제한을 붙이기 좋아요. 예를 들어 아래처럼 제어할 수 있거든요.

    [Service]
    Type=oneshot
    ExecStart=/home/USER/scheduler-test/job.sh
    CPUQuota=20%
    MemoryMax=128M
    NoNewPrivileges=true

    이 부분은 Cron보다 systemd 쪽이 확실히 운영 친화적이에요. 특히 여러 작업이 섞이는 서버에서는 누가 언제 뭘 실행했는지 보기가 훨씬 수월합니다.

    6. ⚠️ 주의사항과 트러블슈팅: 제가 자주 겪었던 문제들

    여기서부터가 진짜 실전입니다. 문서만 보면 쉬워 보이는데, 현장에서는 자잘한 문제들이 계속 나와요.

    6-1. Cron은 환경 변수가 다릅니다

    문제: 터미널에서는 되는데 Cron에서 실패합니다.

    원인: PATH, HOME, locale(로케일, 지역화 설정)이 다를 수 있어요.

    해결: 스크립트 상단에 필요한 환경을 명시하고, 명령어 절대 경로를 사용합니다.

    #!/usr/bin/env bash
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    set -eu

    6-2. systemd timer는 service 파일과 짝이 맞아야 합니다

    문제: 타이머는 살아 있는데 작업이 실행되지 않아요.

    원인: Unit= 이름이 다르거나 ExecStart 경로가 틀린 경우가 많거든요.

    해결: systemctl status와 journalctl -u scheduler-test.service를 같이 봐요.

    6-3. 부팅 중 누락 작업은 해석이 다릅니다

    Cron은 시스템이 꺼져 있던 동안의 스케줄을 기본적으로 보정하지 않아요. 반면 systemd timer의 Persistent=true는 누락된 실행을 어느 정도 메워줍니다. 백업이나 동기화 작업처럼 “한 번은 꼭 돌아야 하는” 작업이면 이 차이가 꽤 크거든요.

    • Cron 적합: 단순 정리 작업, 개인 계정 배치
    • systemd 적합: 서비스와 연동된 운영 작업, 추적이 중요한 작업
    systemd timer Cron 비교에서 systemd timer 구성과 로그 흐름을 보여주는 다이어그램

    systemd timer 구성 요소와 로그 확인 포인트를 한 번에 보여주는 다이어그램입니다.

    7. 검증 및 결과: 무엇을 확인하면 비교가 되는가

    이제 결과를 봐야겠죠. 다만 여기서 조심할 점이 있어요. 자원 사용량과 실행 지연은 배포판, systemd 버전, 파일시스템 상태, CPU 절전 정책에 따라 달라집니다. 그래서 저는 특정 숫자를 일반화하기보다, 아래 체크리스트 기준으로 해석하는 편을 권해요.

    1. 스케줄 등록 확인: crontab -l, systemctl list-timers
    2. 실행 이력 확인: 로그 파일, journalctl -u 서비스명
    3. 실행 시간 측정: /usr/bin/time -v로 스크립트 자체 비용 확인
    4. 프로세스 추적: ps -ef, systemd-cgls로 실행 구조 확인
    journalctl -u scheduler-test.service --since today
    systemctl status scheduler-test.service
    /usr/bin/time -v /home/USER/scheduler-test/job.sh

    제가 실무에서 해석하는 기준은 이렇습니다.

    비교 포인트 보통 유리한 쪽 해석
    초기 설정 단순함 Cron 한 줄로 끝나는 작업은 여전히 편해요.
    장애 분석 속도 systemd timer journalctl 기반 추적이 강하죠.
    리소스 제어 systemd timer cgroup 정책을 붙이기 좋거든요.
    짧은 개인 작업 Cron 학습 비용이 낮은 편입니다.
    운영 표준화 systemd timer 서비스 단위 관리가 깔끔해요.

    🎉 정리하면, systemd timer Cron 비교에서 절대적인 승자는 없습니다. 대신 운영 규모가 커질수록 systemd timer 쪽의 장점이 더 또렷하게 보여요. 반대로 가벼운 서버나 개인 계정 자동화라면 Cron이 아직도 충분히 실용적입니다.

    systemd timer Cron 비교의 성능 벤치마크 검증 결과를 표현한 대시보드 이미지

    실행 상태, 로그, 자원 사용량 확인 포인트를 대시보드 형태로 정리한 결과 이미지입니다.

    8. 정리 및 FAQ: 어떤 기준으로 선택하면 되나

    마지막으로 제가 멘토링할 때 가장 많이 드리는 기준을 남겨보겠습니다. 저도 처음엔 Cron만 썼는데, 서비스 운영 범위가 넓어지면서 systemd timer로 조금씩 옮겼거든요. 드디어 기준이 잡히고 나니까 선택이 쉬워졌어요.

    • 단순한 작업 자동화가 필요하면 Cron으로 시작해도 됩니다.
    • 로그 추적, 실패 복구, 의존성 관리가 중요하면 systemd timer가 나아요.
    • 리눅스 스케줄러를 팀 표준으로 맞춘다면 systemd 방식이 문서화하기 편합니다.
    • 성능 벤치마크는 숫자 경쟁보다 운영 관찰 가능성까지 함께 봐야 하고요.

    자주 묻는 질문

    Q. Cron이 systemd timer보다 항상 가볍나요?
    꼭 그렇진 않아요. 짧은 작업에서는 체감 차이가 있을 수 있지만, 대부분은 실제 작업 로직이 더 큰 비중을 차지합니다.

    Q. 기존 Cron을 전부 systemd timer로 바꿔야 하나요?
    아니에요. 운영상 이점이 큰 작업부터 옮기면 돼요. 예를 들면 백업, 동기화, 서비스 연계 배치처럼요.

    Q. 둘을 같이 써도 되나요?
    물론이죠. 저도 실제로는 혼용하는 편입니다. 다만 동일한 작업이 중복 실행되지 않게 기준은 분명히 잡아야 해요.

    다음 글에서는 systemd service 하드닝(hardening, 보안 강화)이나 백업 배치 표준화 쪽을 따로 다뤄볼 예정입니다. 이전 글에서 다뤘던 로그 관리와 묶어서 보면 더 이해가 잘 될 거예요. 혹시 지금 운영 중인 서버에서 어느 쪽이 맞을지 고민된다면, 먼저 “실패했을 때 얼마나 빨리 원인을 찾을 수 있나”부터 따져보세요. 그 질문 하나가 생각보다 방향을 잘 잡아줍니다.

    systemd timer Cron 비교의 선택 기준과 장단점을 정리한 인포그래픽

    Cron과 systemd timer 선택 기준을 빠르게 판단할 수 있도록 요약한 인포그래픽입니다.