13년차의 서버실

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

[태그:] Ceph 최적화

  • [OpenStack] OpenStack Ceph 성능 병목과 실전 해결 방안

    [OpenStack] OpenStack Ceph 성능 병목과 실전 해결 방안

    OpenStack Ceph 성능 병목과 실전 해결 방안

    OpenStack Ceph 성능 문제는 대부분 느린 디스크처럼만 보이지 않습니다

    OpenStack Ceph 성능 장애는 보통 아주 평범한 증상으로 시작합니다. 인스턴스 부팅이 길어지고, 볼륨 attach가 가끔 멈칫하고, Glance 이미지 업로드가 어느 날부터 오래 걸리죠. 사용자 입장에서는 전부 VM 디스크가 느리다고 느끼지만, 운영자 입장에서는 Ceph OSD가 느린지, OpenStack 서비스가 RBD를 제대로 쓰는지, compute node 네트워크가 막히는지, recovery/backfill이 정상적으로 자원을 쓰는지까지 같이 봐야 합니다.

    저는 OpenStack과 Ceph를 같이 볼 때 튜닝값을 먼저 만지지 않는다는 원칙을 꽤 강하게 지킵니다. 특히 운영 환경에서는 osd_max_backfills, osd_recovery_max_active, rbd_cache 같은 값을 감으로 바꾸면 일시적으로 숫자는 좋아져도 장애 반경이 넓어질 수 있거든요. 먼저 병목 위치를 좁히고, 그다음에 설정을 조정해야 합니다.

    이 글은 공식 문서식 옵션 나열이 아니라, 실제 장애 대응 순서에 가깝게 구성했습니다. 느리다는 말을 들었을 때 어떤 명령어를 먼저 치고, 어떤 로그를 같이 열고, 어떤 경우에는 Ceph가 아니라 Nova/Cinder/Glance를 의심해야 하는지에 초점을 맞춥니다.

    OpenStack Ceph 성능 분석을 위한 RBD 연동 전체 아키텍처

    OpenStack Nova, Cinder, Glance가 Ceph RBD 풀과 연결되는 구조를 한눈에 보는 개요 이미지입니다.

    OpenStack에서 Ceph 병목이 헷갈리는 이유

    OpenStack은 Ceph를 단순한 외장 스토리지처럼 쓰지 않습니다. Nova는 VM ephemeral disk를 RBD에 둘 수 있고, Cinder는 volume을 RBD image로 만들고, Glance는 base image를 Ceph pool에 저장할 수 있습니다. 이 셋이 같은 Ceph 클러스터를 쓰더라도 병목 지점은 서로 다릅니다.

    • Nova 병목: VM 생성, 부팅, live migration, libvirt secret, compute node의 RBD 접속 경로에서 드러납니다.
    • Cinder 병목: volume create/delete, snapshot, clone, flatten, attach/detach 지연으로 보입니다.
    • Glance 병목: image upload/download, image conversion, Nova의 base image clone 경로에서 나타납니다.
    • Ceph 병목: OSD latency, PG 상태, recovery/backfill, full/nearfull, 네트워크 손실, CRUSH 배치 문제로 드러납니다.

    현장에서 자주 본 실패 패턴은 HEALTH_OK니까 Ceph는 아니라고 너무 빨리 결론 내리는 경우였습니다. HEALTH_OK는 클러스터의 일관성과 위험 상태를 보는 신호에 가깝지, 모든 OSD가 빠르고 모든 클라이언트 경로가 정상이라는 보장은 아닙니다. 반대로 HEALTH_WARN이 있어도 실제 사용자 지연의 직접 원인은 libvirt secret 불일치일 수 있습니다. 그래서 Ceph와 OpenStack을 항상 나란히 봐야 합니다.

    Ceph 병목을 잡는 첫 10분: 범위를 먼저 자르세요

    처음부터 fio를 돌리거나 설정값을 바꾸지 마세요. 저는 먼저 영향을 받는 범위를 세 가지 질문으로 자릅니다.

    1. 모든 VM이 느린가, 특정 compute node의 VM만 느린가?
    2. 볼륨 작업만 느린가, 이미지 부팅과 업로드도 같이 느린가?
    3. Ceph에서 recovery/backfill/scrub 같은 내부 작업이 돌고 있는가?

    이 질문에 답하면 조사 방향이 빨라집니다. 전체 VM이 느리면 Ceph cluster, OSD, 네트워크를 봅니다. 특정 compute node만 느리면 해당 노드의 ceph.conf, keyring, libvirt secret, NIC 오류를 먼저 봅니다. 볼륨 생성만 느리면 Cinder backend와 volumes pool을 봐야지 Nova 설정부터 만지는 건 순서가 아닙니다.

    # 컨트롤러 또는 Ceph admin 노드에서 1차 확인
    ceph -s
    ceph health detail
    ceph osd tree
    ceph osd df tree
    ceph pg stat
    ceph osd perf
    ceph osd pool stats
    
    # OpenStack 관점에서 영향 범위 확인
    openstack server list --all-projects --long
    openstack volume list --all-projects --long
    openstack image list --long
    openstack hypervisor list
    openstack compute service list
    openstack volume service list
    

    ceph -s에서 recovery, backfill, degraded, undersized, peering 같은 단어가 보이면 성능 저하가 자연스럽게 따라올 수 있습니다. 이때 중요한 건 왜 그런 상태가 됐는지입니다. OSD 하나가 내려갔는지, 디스크 교체 후 재분산 중인지, full ratio에 가까운 OSD가 있는지, 네트워크가 흔들렸는지까지 연결해서 봐야 합니다.

    Ceph OSD 지연은 단독 숫자가 아니라 편차로 봅니다

    ceph osd perf는 OSD별 commit/apply latency를 보여줍니다. 여기서 가장 위험한 해석은 몇 ms 이상이면 무조건 장애처럼 외부 숫자를 그대로 가져오는 겁니다. HDD, SSD, NVMe, replication size, network, BlueStore DB/WAL 구성에 따라 정상 범위가 달라집니다. 대신 같은 장비군에서 특정 OSD만 지속적으로 튀는지, latency 상승과 iostat의 대기열 증가가 같이 움직이는지를 봐야 합니다.

    # Ceph 쪽 편차 확인
    ceph osd perf
    ceph osd df tree
    ceph osd pool stats
    
    # 특정 OSD 호스트에서만 확인합니다. admin socket이 있는 노드에서 실행해야 합니다.
    ceph daemon osd.0 perf dump | less
    
    # 운영 중 bench 명령은 부하를 만들 수 있으니 점검 창에서만 사용하세요.
    ceph tell osd.0 bench
    
    # OSD 호스트에서 디스크와 CPU 확인
    iostat -x 1
    sar -n DEV 1
    sar -u 1
    vmstat 1
    journalctl -k --since '1 hour ago'
    

    iostat -x에서는 await, aqu-sz, %util, r_await, w_await를 같이 봅니다. %util이 높고 aqu-sz가 커지면서 await도 같이 오르면 디스크 대기열이 밀리는 그림입니다. 반대로 디스크는 한가한데 Ceph latency만 높다면 네트워크, CPU, OSD 프로세스, RocksDB/WAL 장치, 또는 클라이언트 경로를 더 봐야 합니다.

    특정 OSD만 튄다면 바로 out 처리하기보다 먼저 원인을 확인하세요. 커널 로그에 I/O error가 있으면 디스크/컨트롤러 쪽 가능성이 커지고, NIC drop이 같이 보이면 네트워크 쪽입니다. OSD가 있는 호스트의 CPU steal이나 softirq가 높으면 스토리지 문제가 아니라 호스트 자원 경합일 수 있습니다.

    Ceph 병목 진단을 위해 OSD latency와 iostat 지표를 비교하는 화면

    OSD latency, iostat, 네트워크 지표를 나란히 비교하며 병목 지점을 좁히는 장면입니다.

    Nova, Cinder, Glance 설정은 같은 Ceph를 보는가부터 확인합니다

    OpenStack Ceph 연동에서 의외로 많은 문제는 Ceph 성능이 아니라 설정 일관성에서 생깁니다. Glance는 Ceph RBD에 이미지를 저장하는데 Nova는 로컬 파일 기반으로 부팅한다든지, Cinder와 Nova가 서로 다른 user/keyring을 본다든지, compute node마다 /etc/ceph/ceph.conf 내용이 다른 식입니다. 이거 진짜 자주 나옵니다.

    Cinder RBD 백엔드 예시

    [DEFAULT]
    enabled_backends = ceph
    
    [ceph]
    volume_driver = cinder.volume.drivers.rbd.RBDDriver
    volume_backend_name = ceph
    rbd_pool = volumes
    rbd_user = cinder
    rbd_ceph_conf = /etc/ceph/ceph.conf
    rbd_flatten_volume_from_snapshot = false
    rbd_max_clone_depth = 5
    rados_connect_timeout = -1
    

    rbd_flatten_volume_from_snapshot = false는 clone 기반 흐름을 살려 생성 속도를 빠르게 가져갈 수 있지만, clone depth가 깊어지면 나중에 읽기 경로가 복잡해질 수 있습니다. rbd_max_clone_depth는 그 균형점입니다. 볼륨 생성 속도가 중요하고 snapshot 계층이 잘 관리된다면 clone을 적극적으로 쓰는 편이 유리합니다. 반대로 오래된 snapshot에서 파생된 볼륨이 많이 쌓이고 삭제 정책이 느슨한 환경이라면 flatten 전략을 더 보수적으로 잡아야 합니다.

    Nova libvirt RBD 설정 예시

    [libvirt]
    images_type = rbd
    images_rbd_pool = vms
    images_rbd_ceph_conf = /etc/ceph/ceph.conf
    rbd_user = nova
    rbd_secret_uuid = 00000000-0000-0000-0000-000000000000
    
    [workarounds]
    rbd_volume_local_attach = false
    

    rbd_secret_uuid는 libvirt secret과 정확히 맞아야 합니다. 예시 UUID를 그대로 쓰면 안 됩니다. 실제 compute node에서 virsh secret-list와 virsh secret-dumpxml로 확인해야 합니다. rbd_volume_local_attach는 RBD Cinder volume을 QEMU의 native RBD 경로가 아니라 compute host의 block device로 붙이는 Nova workaround 옵션입니다. 기본값처럼 false로 두는 구성이 일반적이지만, 배포판과 암호화 볼륨 요구사항에 따라 판단해야 합니다.

    Glance RBD 저장소 예시

    [glance_store]
    stores = file,http,rbd
    default_store = rbd
    rbd_store_ceph_conf = /etc/ceph/ceph.conf
    rbd_store_user = glance
    rbd_store_pool = images
    rbd_store_chunk_size = 8
    

    Glance를 RBD에 두면 Nova가 base image를 clone하는 흐름을 만들기 쉬워집니다. 다만 이미지 변환이 필요한 포맷을 무분별하게 올리면 업로드나 부팅 경로에서 예기치 않은 지연이 생길 수 있습니다. 운영 기준으로는 Glance 이미지 포맷, Nova images_type, Cinder backend가 한 방향으로 맞아야 합니다. 이미지 저장소는 file, VM은 rbd, volume은 rbd처럼 섞인 구성이 꼭 틀린 건 아니지만, 장애 때 확인해야 할 경로가 늘어납니다.

    서비스 계정으로 직접 Ceph에 붙어보면 빠르게 걸러집니다

    운영자가 admin keyring으로 ceph -s를 쳐서 성공하는 것과 Nova/Cinder/Glance가 자기 계정으로 RBD pool에 접근하는 것은 완전히 다른 이야기입니다. 장애 대응 때는 반드시 서비스 계정으로 직접 확인해보는 편이 좋습니다.

    # compute node에서 Nova 계정 확인
    ceph -n client.nova --keyring /etc/ceph/ceph.client.nova.keyring -s
    rbd -n client.nova --keyring /etc/ceph/ceph.client.nova.keyring -p vms ls
    
    # cinder-volume 노드에서 Cinder 계정 확인
    ceph -n client.cinder --keyring /etc/ceph/ceph.client.cinder.keyring -s
    rbd -n client.cinder --keyring /etc/ceph/ceph.client.cinder.keyring -p volumes ls
    
    # glance-api 노드에서 Glance 계정 확인
    ceph -n client.glance --keyring /etc/ceph/ceph.client.glance.keyring -s
    rbd -n client.glance --keyring /etc/ceph/ceph.client.glance.keyring -p images ls
    
    # libvirt secret 확인
    virsh secret-list
    virsh secret-dumpxml 00000000-0000-0000-0000-000000000000
    

    여기서 실패하면 Ceph 튜닝은 잠시 내려놓고 인증과 권한을 봐야 합니다. 흔한 원인은 keyring 파일 경로 불일치, 파일 권한, CephX caps 부족, secret UUID 오타, 배포 자동화가 일부 노드에만 반영된 경우입니다. 특히 compute node가 여러 대일 때는 문제 없는 노드와 느린 노드의 /etc/ceph 디렉터리, Nova 설정, libvirt secret을 비교하면 빠릅니다.

    스토리지 트러블슈팅을 위한 병목 유형별 판단 기준

    아래 표는 실제 점검할 때 쓰는 분류에 가깝습니다. 한 줄짜리 정답표는 아니지만, 어디부터 볼지 정하는 데는 꽤 도움이 됩니다.

    증상 같이 볼 지표 가능성이 큰 원인 먼저 할 조치 피해야 할 대응
    전체 VM 디스크 I/O가 느림 ceph -s, ceph osd perf, iostat -x OSD 지연, recovery/backfill, 네트워크 혼잡 느린 OSD와 내부 작업 여부를 먼저 분리 Nova 설정부터 무작정 변경
    특정 compute node의 VM만 느림 sar -n DEV, journalctl -u nova-compute, virsh secret-list compute node 네트워크, keyring, libvirt secret 정상 노드와 ceph.conf/keyring/secret 비교 Ceph 클러스터 전체 재시작
    볼륨 생성·삭제가 오래 걸림 Cinder 로그, ceph osd pool stats, RBD clone depth Cinder backend 부하, snapshot/clone 누적, pool 병목 Cinder service 상태와 volumes pool I/O 확인 사용자 VM fio 테스트로만 판단
    이미지 업로드나 첫 부팅이 느림 Glance 로그, image format, Nova images_type Glance 저장소 경로, 이미지 변환, RBD clone 미사용 Glance default store와 Nova RBD 설정 일관성 확인 OSD 교체부터 검토
    평소에는 괜찮다가 특정 시간대만 느림 scrub/deep-scrub, backup, snapshot 작업 로그 예약 작업과 클라이언트 I/O 경합 작업 시간대와 Ceph 내부 작업 스케줄 조정 일시 현상으로 방치

    Ceph 최적화 튜닝값은 목적별로 다르게 접근해야 합니다

    Ceph 성능 글에서 자주 보이는 실수는 이 값을 올리면 빨라진다는 식의 단정입니다. 실제 운영에서는 값 하나가 성능, 복구 속도, 사용자 I/O 안정성을 동시에 흔듭니다. 특히 OpenStack은 사용자 VM이 계속 I/O를 내고 있으므로, 복구를 빠르게 끝내는 것과 사용자 지연을 줄이는 것 사이에서 선택해야 합니다.

    결정 지점 A를 선택할 때 B를 선택할 때 운영 판단
    recovery/backfill 속도 장애 복구를 빨리 끝내야 할 때 업무 시간 사용자 I/O를 보호해야 할 때 업무 시간에는 보수적으로, 점검 창에서는 적극적으로 조정
    Glance RBD 사용 Nova/Cinder도 Ceph를 쓰고 이미지 clone 경로를 단순화하고 싶을 때 이미지 저장소를 별도로 운영하고 Ceph 부하를 분리하고 싶을 때 Ceph 기반 OpenStack은 Glance도 RBD로 맞추면 운영이 단순해지는 경우가 많습니다
    pool 분리 images, vms, volumes의 성격과 장애 분석을 나누고 싶을 때 작은 테스트 환경이라 관리 단순성이 더 중요할 때 운영 환경에서는 최소한 images/vms/volumes는 분리하는 쪽을 권합니다
    SSD/NVMe 혼합 워크로드별 CRUSH rule과 pool을 나눌 수 있을 때 장비 수가 적고 장애 도메인이 충분하지 않을 때 빠른 디스크를 섞기만 하면 평균이 좋아지는 게 아니라 예측성이 나빠질 수 있습니다

    제가 겪은 대표 삽질: Ceph는 멀쩡한데 VM만 느린 경우

    한 번은 ceph -s가 멀쩡하고 OSD latency도 크게 튀지 않는데, 특정 compute node의 VM만 디스크가 굼뜨게 느껴진 적이 있습니다. 처음에는 Ceph 최적화 문제라고 생각했습니다. 그런데 정상 노드와 문제 노드를 비교해보니 /etc/ceph/ceph.conf 배포 시점이 달랐고, libvirt secret도 서로 맞지 않았습니다.

    이런 경우에는 Ceph dashboard만 보면 놓칩니다. Ceph는 정상인데, OpenStack 서비스 계층에서 RBD를 제대로 잡지 못하는 상태이기 때문입니다. 저는 이런 케이스 이후로 compute node 단위 문제가 나오면 아래 명령을 거의 습관처럼 칩니다.

    # 문제 compute node에서 실행
    hostname -f
    ls -l /etc/ceph/
    sha256sum /etc/ceph/ceph.conf /etc/ceph/*.keyring
    ceph -n client.nova --keyring /etc/ceph/ceph.client.nova.keyring -s
    rbd -n client.nova --keyring /etc/ceph/ceph.client.nova.keyring -p vms ls
    virsh secret-list
    journalctl -u nova-compute --since '1 hour ago'
    journalctl -u libvirtd --since '1 hour ago'
    journalctl -u virtqemud --since '1 hour ago'
    journalctl -k --since '1 hour ago'
    

    정상 노드와 문제 노드의 sha256sum이 다르면 배포 일관성부터 의심합니다. 물론 Ceph 설정 파일이 일부러 다를 수도 있지만, OpenStack compute node에서 의도치 않게 다른 MON 주소나 keyring을 보고 있다면 성능 문제가 아니라 구성 문제입니다. 이때는 튜닝보다 재배포와 서비스 재시작 순서를 차분히 잡는 게 낫습니다.

    네트워크 병목은 대역폭보다 손실과 재전송을 먼저 봅니다

    Ceph는 네트워크에 민감합니다. 그런데 운영자가 10GbE니까 괜찮겠지라고 생각하는 순간이 위험합니다. 대역폭이 충분해도 packet drop, MTU 불일치, bonding 설정 문제, 스위치 buffer 이슈가 있으면 RBD 클라이언트 입장에서는 지연으로 보입니다.

    # OSD/compute node에서 NIC 오류와 처리량 확인
    ip -s link
    netstat -s | grep -Ei 'retrans|timeout|listen|segments retransmitted'
    sar -n DEV 1
    sar -n TCP,ETCP 1
    
    # 경로와 MTU 확인
    ip route
    ip addr show
    ping -M do -s 8972 CEPH_OSD_IP
    

    MTU 9000을 쓰는 환경이라면 end-to-end로 맞아야 합니다. compute node, storage node, 스위치, bond, VLAN 어디 하나라도 다르면 큰 패킷이 깨지거나 경로에 따라 묘한 지연이 생깁니다. Jumbo frame은 제대로 맞추면 도움이 될 수 있지만, 반쯤 적용된 jumbo frame은 차라리 기본 MTU보다 나쁩니다. 저는 운영 안정성이 먼저인 환경에서는 모든 구간을 검증할 수 있을 때만 jumbo frame을 쓰는 쪽을 선호합니다.

    검증은 고쳤다가 아니라 재현 조건에서 나아졌다로 해야 합니다

    수정 후에는 단순히 HEALTH_OK만 보고 끝내지 않습니다. 같은 증상이 났던 경로를 다시 밟아야 합니다. 이미지 업로드가 문제였으면 Glance 경로를, 볼륨 attach가 문제였으면 Cinder와 Nova attach 경로를, 특정 compute node가 문제였으면 그 노드에서 새 VM을 띄워 봐야 합니다.

    # Ceph 상태 재확인
    ceph -s
    ceph health detail
    ceph osd perf
    ceph osd pool stats
    
    # RBD pool 확인
    rbd -p images ls
    rbd -p volumes ls
    rbd -p vms ls
    
    # OpenStack 리소스 흐름 확인
    openstack image list --long
    openstack volume list --all-projects --long
    openstack server list --all-projects --long
    
    # 최근 로그에서 timeout/auth/error 확인
    journalctl -u nova-compute --since '30 minutes ago' | grep -Ei 'rbd|ceph|timeout|error|auth|secret'
    journalctl -u cinder-volume --since '30 minutes ago' | grep -Ei 'rbd|ceph|timeout|error|auth'
    journalctl -u glance-api --since '30 minutes ago' | grep -Ei 'rbd|ceph|timeout|error|auth'
    

    운영 환경에서 무리한 쓰기 부하 테스트를 바로 돌리는 건 권하지 않습니다. 먼저 작은 테스트 VM과 테스트 볼륨으로 재현 경로를 확인하고, 업무 영향이 낮은 시간대에 점진적으로 부하를 올리는 편이 안전합니다. 스토리지는 한 번 흔들리면 넓게 흔들리는 영역이라서, 확인도 단계적으로 해야 합니다.

    OpenStack Ceph 성능 최적화를 위한 Nova Cinder Glance pool 매핑 구성

    Nova, Cinder, Glance 서비스가 각각 vms, volumes, images 풀을 사용하는 구성을 보여주는 이미지입니다.

    운영 체크리스트: 성능보다 먼저 무너지는 것들

    • pool 분리: 운영 환경에서는 images, vms, volumes pool을 분리해 원인 분석과 정책 적용을 쉽게 만듭니다.
    • CRUSH rule 확인: HDD, SSD, NVMe가 섞인 환경에서는 장치 class와 rule이 의도대로 적용되는지 확인합니다.
    • 시간 동기화: 모든 컨트롤러, compute, storage node에서 chrony 또는 NTP 상태를 확인합니다.
    • 네트워크 역할 분리: 가능하면 Ceph public/client traffic과 cluster replication/backfill traffic을 분리합니다.
    • 복구 작업 정책: 업무 시간과 점검 시간의 recovery/backfill 정책을 다르게 가져갈지 결정합니다.
    • 로그 보존: nova-compute, cinder-volume, glance-api, libvirt 또는 virtqemud, kernel 로그가 충분히 남도록 설정합니다.
    • 배포 일관성: ceph.conf, keyring, libvirt secret이 모든 관련 노드에 동일하게 배포되는지 검증합니다.

    여기서 제일 많이 과소평가되는 항목은 배포 일관성입니다. Ceph 자체가 아무리 튼튼해도 compute node 한 대가 오래된 ceph.conf를 보고 있으면 사용자에게는 OpenStack Ceph 성능 문제로 접수됩니다. 자동화 도구를 쓰더라도 실제 파일 checksum을 비교하는 습관이 도움이 됩니다.

    OpenStack Ceph 성능 개선 후 상태 검증 대시보드

    Ceph health, OSD latency, OpenStack 리소스 상태가 안정화된 모습을 보여주는 검증 이미지입니다.

    증상별 추천 경로: 이럴 땐 이렇게 보세요

    모든 VM이 동시에 느려졌다면 Ceph cluster 상태, OSD latency, recovery/backfill, 네트워크 손실을 먼저 봅니다. 이 경우에는 개별 VM 안에서 fio를 오래 돌리는 것보다 클러스터 전체 지표를 보는 편이 빠릅니다.

    특정 compute node의 VM만 느리다면 Ceph 전체 튜닝보다 해당 노드의 네트워크, /etc/ceph 파일, Nova 설정, libvirt secret을 먼저 비교하세요. 정상 노드와 문제 노드의 차이를 찾는 방식이 가장 빠릅니다.

    볼륨 생성·삭제·attach만 느리다면 Cinder volume 서비스와 volumes pool을 봅니다. snapshot/clone이 많이 쌓인 환경이라면 clone depth와 flatten 정책도 같이 봐야 합니다.

    이미지 업로드나 첫 부팅만 느리다면 Glance 저장소, 이미지 포맷, Nova의 RBD 사용 여부를 확인합니다. Glance와 Nova가 같은 Ceph 기반 흐름을 쓰지 않으면 불필요한 복사나 변환 경로가 끼어들 수 있습니다.

    특정 시간대만 느리다면 백업, snapshot, scrub/deep-scrub, recovery 작업 시간표를 확인하세요. 이 경우에는 하드웨어 증설보다 작업 스케줄과 우선순위 조정이 먼저일 수 있습니다.

    자주 묻는 질문

    Q. OpenStack Ceph 성능 문제는 Ceph 튜닝으로 해결되나요?

    항상 그렇지는 않습니다. 실제 현장에서는 Nova/Cinder/Glance 설정 불일치, compute node 네트워크, libvirt secret, keyring 권한 문제가 꽤 많습니다. Ceph 튜닝은 병목이 Ceph 내부에 있다는 근거를 잡은 뒤에 하는 게 안전합니다.

    Q. OSD latency가 높으면 바로 디스크 교체인가요?

    바로 교체로 가기보다는 특정 OSD만 반복적으로 튀는지, 해당 호스트의 iostat, 커널 로그, NIC 오류, recovery 상태가 같이 움직이는지 봐야 합니다. 디스크 고장일 수도 있지만 네트워크 손실이나 복구 작업 영향일 수도 있습니다.

    Q. Glance도 꼭 Ceph RBD를 써야 하나요?

    필수는 아닙니다. 다만 Nova와 Cinder가 Ceph를 쓰는 구조라면 Glance도 RBD에 두는 구성이 운영과 장애 분석 측면에서 단순해지는 경우가 많습니다. 특히 이미지 clone 경로를 활용하고 싶다면 세 서비스의 저장 경로를 함께 설계하는 편이 좋습니다.

    Q. pool을 꼭 images, vms, volumes로 나눠야 하나요?

    작은 테스트 환경에서는 하나로도 돌아갑니다. 운영 환경에서는 분리하는 쪽을 권합니다. 워크로드 성격이 다르고, 장애 분석과 용량 정책, 권한 설정, 향후 CRUSH rule 적용이 쉬워지기 때문입니다.

    관련 글로는 OpenStack Nova 트러블슈팅, Cinder 백엔드 설계, Ceph CRUSH rule 운영 가이드를 함께 연결해두면 독자가 다음 점검 단계로 이동하기 좋습니다.

    OpenStack Ceph 성능 병목 진단 흐름 요약 인포그래픽

    증상별로 Ceph, OpenStack 서비스, 네트워크, 디스크 중 어디를 먼저 확인할지 정리한 요약 이미지입니다.

    마지막 판단: 먼저 좁히고, 그다음에 바꾸세요

    OpenStack Ceph 성능 문제를 다룰 때 제 추천은 분명합니다. 전체가 느리면 Ceph cluster와 OSD부터, 특정 compute node만 느리면 해당 노드의 RBD 접속 경로부터, 볼륨만 느리면 Cinder와 volumes pool부터, 이미지 부팅만 느리면 Glance와 Nova RBD 연결부터 보세요.

    설정값 변경은 마지막 카드에 가깝습니다. ceph -s, ceph osd perf, iostat -x, 서비스 계정 RBD 접근 테스트, Nova/Cinder/Glance 로그를 통해 병목 위치를 먼저 좁히면 불필요한 튜닝을 줄일 수 있습니다. 운영에서 좋은 트러블슈팅은 멋진 한 방이 아니라, 잘못된 가능성을 빠르게 제거하는 과정에 더 가깝습니다.

  • [인프라] OpenStack Ceph 연동 실패 사례와 스토리지 성능 최적화 교훈

    [인프라] OpenStack Ceph 연동 실패 사례와 스토리지 성능 최적화 교훈

    [인프라] OpenStack Ceph 연동 실패 사례와 스토리지 성능 최적화 교훈

    OpenStack Ceph 연동은 프라이빗 클라우드를 운영할 때 한 번쯤 꼭 마주치는 주제입니다. 저도 홈랩과 실무 환경에서 OpenStack 스토리지 구성을 여러 번 만졌는데요, 처음엔 단순히 연결만 되면 끝일 줄 알았습니다. 그런데 실제로 써보니까 연동 성공과 제대로 빠르게 동작하는 상태는 완전히 다른 이야기더라고요. 특히 볼륨 생성은 되는데 체감이 느리거나, 가상머신 부팅이 들쭉날쭉하거나, 특정 시간대에 I/O가 몰리면 급격히 지연이 커지는 문제를 겪으면 그때부터 삽질이 시작됩니다. 혹시 지금 OpenStack Ceph 연동 이후 성능이 이상하게 답답하다고 느끼고 계신가요?

    여기서 중요한 포인트는, 원인이 Ceph 자체인지 OpenStack 설정인지, 아니면 둘 사이의 연결 방식인지 분리해서 봐야 한다는 점입니다. 이 글에서는 제가 직접 겪었던 OpenStack Ceph 연동 실패 패턴과 해결 방법을 정리했으니, 비슷한 상황이라면 참고하시길 바랍니다.

    OpenStack Ceph 연동 전체 아키텍처 다이어그램

    OpenStack 컴퓨트, 이미지, 블록 스토리지 서비스와 Ceph 클러스터 간 연결 구조를 한눈에 보여주는 아키텍처 이미지입니다.

    왜 OpenStack Ceph 연동에서 성능 문제가 자주 생길까

    쉽게 말해 OpenStack는 서비스를 제공하는 제어 평면(control plane)이고, Ceph는 실제 데이터를 저장하는 분산 스토리지(distributed storage) 역할을 합니다. 많이들 Cinder(신더, 블록 스토리지), Glance(글랜스, 이미지 서비스), Nova(노바, 컴퓨트)가 Ceph의 RBD(RADOS Block Device, 블록 디바이스 인터페이스)를 함께 쓰도록 구성하죠. 구조만 보면 깔끔합니다. 근데 여기서 병목이 생기는 지점이 꽤 많습니다.

    • 인증 설정은 맞는데 풀(pool) 권한이 어긋난 경우
    • 네트워크 분리가 부족해서 클라이언트 트래픽과 복제 트래픽이 섞이는 경우
    • 풀 설계가 서비스 특성과 맞지 않는 경우
    • 하이퍼바이저(hypervisor) 캐시 정책이 애매해서 지연이 커지는 경우
    • 작은 I/O가 많이 발생하는 워크로드를 고려하지 않은 경우

    저도 처음엔 Ceph 최적화라고 하면 OSD(Object Storage Daemon, 오브젝트 스토리지 데몬) 쪽만 보면 된다고 생각했었는데요, 막상 들여다보니 OpenStack 스토리지 설정에서 생기는 비효율이 꽤 컸습니다. 특히 이미지 업로드는 괜찮은데 볼륨 기반 부팅이 유독 느린 경우, 그 원인이 하나가 아니라 여러 레이어에 걸쳐 있는 경우가 많았습니다.

    구성 개념 먼저 정리해보겠습니다

    OpenStack Ceph 연동을 이해할 때는 각 서비스가 어느 풀을 쓰는지부터 정리하면 훨씬 덜 헷갈립니다.

    구성 요소 역할 Ceph 연동 포인트 체크 포인트
    Glance 이미지 저장 RBD 이미지 풀 이미지 업로드/변환 지연
    Cinder 볼륨 제공 RBD 볼륨 풀 볼륨 생성 속도, attach 지연
    Nova 가상머신 부팅 Ceph 백엔드 부트 부팅 시간, I/O 패턴
    Ceph MON/OSD 클러스터 관리/데이터 저장 스토리지 코어 복제 상태, 지연, 균형

    핵심은 이겁니다. OpenStack 스토리지 성능은 단순히 디스크가 빠르냐 느리냐로 끝나지 않습니다. 인증, 네트워크, 풀 설계, 복제 정책(replication policy), 클라이언트 설정이 다 같이 맞물립니다. 그래서 문제를 볼 때도 한 군데만 보면 안 되죠.

    제가 실제로 점검했던 사전 체크리스트

    본격적으로 손대기 전에 저는 항상 아래 순서대로 확인합니다. 이 순서를 안 지키면 괜히 OSD 튜닝만 하다가 시간을 많이 쓰게 되더라고요.

    1. Ceph 클러스터 상태가 HEALTH_OK 또는 경미한 경고 수준인지 확인합니다.
    2. Glance, Cinder, Nova가 각각 어떤 Ceph 사용자와 풀을 쓰는지 정리합니다.
    3. 스토리지 네트워크와 서비스 네트워크가 분리되어 있는지 확인합니다.
    4. 볼륨 생성, 이미지 업로드, 부팅 중 어디가 가장 느린지 구분합니다.
    5. 가상머신 내부 체감 속도와 백엔드 I/O 지표를 따로 봅니다.

    여기서 중요한 포인트! 사용자는 보통 “Ceph가 느리다”라고 말하지만, 실제로는 이미지 복사 경로가 비효율적이거나 캐시 정책이 안 맞아서 그렇게 느끼는 경우도 많습니다. 저도 예전에 이걸 구분 못 해서 하루를 날린 적이 있습니다. OpenStack Ceph 연동에서는 정말 이런 실수가 흔하거든요.

    실전 구현: OpenStack Ceph 연동 기본 점검과 설정

    아래 예시는 개념을 설명하기 위한 일반적인 형태입니다. 배포판이나 자동화 도구에 따라 파일 위치와 세부 항목은 조금 다를 수 있습니다. 그래도 큰 흐름은 비슷합니다.

    1. Ceph 클러스터 상태 확인

    ceph -s
    ceph health detail
    ceph osd tree
    ceph osd df
    rbd pool ls

    이 단계에서 저는 먼저 복제 지연이나 OSD 불균형부터 봅니다. 연동 전에 백엔드가 불안정하면 OpenStack 쪽에서 아무리 손봐도 체감이 안 좋아집니다.

    2. Ceph 사용자 권한 확인

    ceph auth list
    ceph auth get client.glance
    ceph auth get client.cinder
    ceph auth get client.nova

    권한이 과하게 넓은 것도 문제지만, 더 자주 보는 건 풀 권한이 어설프게 빠져 있는 경우입니다. 그러면 기능은 되는 것처럼 보여도 특정 작업에서만 실패하거나 지연이 생깁니다.

    3. Cinder 백엔드 확인

    [ceph]
    volume_driver = cinder.volume.drivers.rbd.RBDDriver
    volume_backend_name = ceph
    rbd_pool = volumes
    rbd_user = cinder
    rbd_ceph_conf = /etc/ceph/ceph.conf
    rbd_secret_uuid = YOUR_SECRET_UUID
    rbd_flatten_volume_from_snapshot = false
    rbd_max_clone_depth = 5
    rbd_store_chunk_size = 8

    rbd_max_clone_depth 같은 항목은 운영 방식에 따라 영향을 줄 수 있습니다. 저는 예전에 스냅샷 기반 복제가 누적된 상태를 방치했다가, 특정 볼륨 체인에서 응답이 들쭉날쭉해지는 걸 본 적이 있습니다.

    4. Glance 백엔드 확인

    [glance_store]
    default_backend = rbd
    stores = rbd
    rbd_store_pool = images
    rbd_store_user = glance
    rbd_store_ceph_conf = /etc/ceph/ceph.conf

    Glance(글랜스, 이미지 서비스)가 Ceph를 바로 쓰도록 해두면 이미지 관리가 단순해집니다. 다만 이미지 업로드와 변환 작업이 많은 환경이라면 여기서도 풀 설계와 I/O 패턴을 꼭 같이 봐야 합니다.

    OpenStack Ceph 연동 설정 흐름과 RBD 풀 구성 이미지

    OpenStack 서비스별로 어떤 Ceph 사용자와 풀을 사용하는지 보여주는 구성 다이어그램입니다.

    실패 사례: OpenStack Ceph 연동은 됐는데 성능이 안 나온 이유

    이제 제가 실제로 겪었던 전형적인 실패 패턴을 말씀드려볼게요. 처음엔 볼륨 생성도 되고 인스턴스도 뜨니까 성공한 줄 알았습니다. 그런데 실제로 써보니까 VM 부팅 시간이 일정하지 않았고, 동시에 여러 작업이 걸리면 체감 지연이 확 올라가더라고요. 여기서부터가 진짜 OpenStack Ceph 연동의 시작이었습니다.

    문제 1. 네트워크를 논리적으로만 나눠놓고 물리적으로는 섞어 썼던 경우

    Ceph는 복제와 복구 트래픽이 발생합니다. 그런데 클라이언트 액세스와 같은 대역을 공유하면 피크 시간에 지연이 커질 수 있습니다. 저도 홈랩에서 처음엔 VLAN만 나누면 충분하겠지 했었는데, 실제로는 업링크 혼잡이 생기면서 체감 성능이 꽤 흔들렸습니다.

    • 증상: 특정 시간대에 볼륨 attach와 부팅 지연 증가
    • 원인: 스토리지 트래픽과 일반 서비스 트래픽 경합
    • 대응: 스토리지 네트워크 경로를 분리하고 혼잡 구간을 줄임

    문제 2. 풀을 나누지 않고 한 곳에 몰아넣은 경우

    이미지, 볼륨, 테스트용 작업이 한 풀에 몰려 있으면 관찰도 어렵고 튜닝 포인트도 흐려집니다. Ceph 최적화는 결국 워크로드 분리가 기본이더라고요.

    • 증상: 어떤 작업이 느린지 구분이 잘 안 됨
    • 원인: 서비스별 I/O 특성 혼재
    • 대응: images, volumes 등 역할 단위로 풀을 분리해 관찰성 확보

    문제 3. 클론과 스냅샷 체인을 너무 방치한 경우

    처음엔 공간 절약 측면에서 좋아 보이는데, 운영 기간이 길어지면 관리 포인트가 늘어납니다. 특히 오래된 이미지 기반으로 파생된 체인이 많아지면, 성능과 운영 복잡도가 같이 올라갈 수 있습니다. OpenStack Ceph 연동 운영에서는 정말 흔한 문제입니다.

    문제 4. 성능 문제를 전부 Ceph 탓으로만 본 경우

    이거 정말 많이 봅니다. 근데 실제로는 하이퍼바이저 캐시 설정, 인스턴스 유형별 디스크 패턴, 백그라운드 작업 영향도 같이 봐야 하거든요. 저도 처음엔 Ceph OSD만 의심했었는데, 나중에 보니 OpenStack 스토리지 경로에서 이미지 변환과 attach 흐름이 더 큰 영향을 준 케이스가 있었습니다.

    ⚠️ 트러블슈팅: 제가 효과를 봤던 점검 순서

    문제가 생기면 아래 순서로 좁혀가면 좋습니다. 무작정 튜닝부터 하지 마세요. 저도 예전엔 그랬다가 더 꼬였습니다.

    1. Ceph 상태 확인
      클러스터 경고, 리밸런싱(rebalancing), 복구 상태를 먼저 확인합니다.
    2. 풀 단위 관찰
      어느 풀이 바쁜지, 이미지와 볼륨 중 어디서 병목이 생기는지 봅니다.
    3. OpenStack 작업별 분리
      이미지 업로드, 볼륨 생성, 인스턴스 부팅을 따로 테스트합니다.
    4. 동시 작업 테스트
      단건 테스트는 괜찮은데 동시성에서 무너지는 경우가 많습니다.
    5. 체인 정리 여부 검토
      오래된 스냅샷/클론 구조가 쌓였는지 확인합니다.
    openstack volume create --size 10 test-volume
    openstack server create --flavor m1.small --image test-image --network private test-vm
    rbd ls -p volumes
    rbd info volumes/test-volume
    ceph osd perf

    여기서 ceph osd perf 같은 기본 지표와 OpenStack 작업 시간을 같이 비교해보면 감이 옵니다. 절대적인 숫자보다 언제 느려지는지, 어떤 작업에서 흔들리는지를 보는 게 더 중요합니다.

    OpenStack Ceph 연동 장애 분석용 스토리지 성능 대시보드 이미지

    볼륨 생성과 가상머신 부팅 과정에서 지연이 발생하는 구간을 시각적으로 보여주는 대시보드 이미지입니다.

    Ceph 최적화 관점에서 배운 점

    이번 경험에서 가장 크게 느낀 건, Ceph 최적화는 단일 옵션 몇 개로 끝나는 작업이 아니라는 점이었습니다. 결국 아래 네 가지가 같이 맞아야 하더라고요.

    • 네트워크 분리: 복제와 클라이언트 경로를 명확히 구분
    • 풀 설계: 워크로드 성격에 맞춰 역할 분리
    • 운영 습관: 오래된 스냅샷/클론 체인 방치 금지
    • 관찰성: OpenStack 로그와 Ceph 상태를 함께 확인

    스토리지 성능은 숫자 하나로 판단하기 어렵습니다. 어떤 환경에서는 작은 랜덤 I/O가 문제고, 또 어떤 환경에서는 이미지 배포 흐름이 더 큰 병목이 됩니다. 그래서 저는 요즘은 성능 문제가 나오면 먼저 “이게 Ceph 문제인가, OpenStack 스토리지 경로 문제인가, 아니면 둘 다인가?”부터 구분합니다.

    검증 방법: 무엇을 확인해야 실제로 좋아졌다고 볼 수 있을까

    개선 후에는 꼭 검증이 필요합니다. 그냥 느낌상 빨라진 것 같다고 넘어가면 다음 장애 때 다시 원점으로 돌아갑니다.

    1. 동일한 이미지로 인스턴스 부팅 시간을 여러 번 비교합니다.
    2. 동시에 여러 볼륨을 생성해 지연 패턴이 안정적인지 봅니다.
    3. 이미지 업로드와 볼륨 생성이 겹칠 때도 성능 저하가 과도하지 않은지 확인합니다.
    4. Ceph 클러스터 상태가 테스트 중에도 안정적인지 체크합니다.

    제가 직접 해보니, 단건 테스트보다 동시성 테스트가 훨씬 유의미했습니다. 평소엔 괜찮다가도 작업이 몰리면 바로 티가 나거든요. 드디어 됐다! 싶은 순간도 보통 이 구간을 통과했을 때였습니다.

    openstack server list
    openstack volume list
    ceph -s
    ceph df
    rbd du -p volumes

    검증할 때는 결과만 보지 말고, 테스트 중간에 경고가 발생하지 않는지도 꼭 보세요. 여기서 안정적이면 그제야 실제 운영에 올릴 만한 상태라고 판단합니다.

    OpenStack Ceph 연동 최적화 전후 비교 요약 이미지

    최적화 이전과 이후의 지연 안정성 차이를 비교하고, 운영자가 점검해야 할 항목을 요약한 이미지입니다.

    실무적으로 정리하는 OpenStack 스토리지 운영 팁

    항목 권장 접근 피해야 할 패턴
    네트워크 스토리지 경로 분리 복제/서비스 트래픽 혼재
    풀 설계 서비스별 역할 분리 모든 워크로드를 단일 풀에 집중
    운영 관리 스냅샷/클론 주기적 점검 장기간 체인 방치
    검증 방식 동시성 포함 반복 테스트 단건 테스트만으로 판단

    이 표는 제가 나중에 운영 문서로도 정리해둔 기준입니다. 사실 OpenStack Ceph 연동은 한 번 붙이고 끝나는 프로젝트가 아니라, 붙인 뒤부터 운영 품질이 갈리는 영역입니다. 이전 글에서 다뤘던 기본 네트워크 설계와도 연결되는 부분이고, 다음 글에서는 Ceph 모니터링 포인트를 조금 더 깊게 다뤄볼 예정입니다.

    마무리: 연동 성공보다 중요한 건 안정적인 성능입니다

    오늘 정리한 실패 사례의 핵심은 단순합니다. OpenStack Ceph 연동이 되었더라도, 그 상태가 곧 최적 상태는 아니라는 점입니다. 저도 처음엔 연결만 되면 다 끝난 줄 알았는데, 실제 운영에서는 네트워크, 풀 설계, 스냅샷 체인, 작업 동시성까지 다 영향을 주더라고요. 삽질 좀 했습니다. 그래도 이런 과정을 겪고 나니 이제는 문제를 훨씬 빨리 좁힐 수 있게 됐습니다.

    혹시 지금 OpenStack 스토리지 성능 때문에 답답하셨다면, 오늘 내용처럼 어디서 느려지는지 분리해서 보는 것부터 시작해보세요. 그게 가장 현실적인 첫걸음입니다. 그리고 Ceph 최적화는 무조건 큰 튜닝보다, 구조를 바르게 잡는 쪽이 효과가 더 컸습니다. 이 부분은 정말 경험상 그렇습니다.

    연동 성공, 병목 원인 분리, 검증 절차, 운영 팁을 한 장으로 요약한 마무리 인포그래픽입니다.

    정리 FAQ

    Q. OpenStack Ceph 연동 후 가장 먼저 볼 것은 무엇인가요?

    A. Ceph 클러스터 상태와 OpenStack 서비스별 풀/사용자 매핑입니다. 이 두 가지가 기본입니다.

    Q. 스토리지 성능이 느리면 무조건 Ceph 튜닝부터 해야 하나요?

    A. 아닙니다. 네트워크 경합, 풀 분리 부족, 스냅샷 체인 누적, OpenStack 작업 흐름까지 같이 봐야 합니다.

    Q. OpenStack 스토리지 운영에서 가장 실수하기 쉬운 부분은 뭔가요?

    A. 연동 성공을 성능 검증 완료로 착각하는 부분입니다. 꼭 동시성 테스트까지 해보셔야 합니다.