ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이코에코(Eco) ext-authz 추가 테스트: Redis 병렬 연결 활성화 (vCPU 2, io-threads 2)
    이코에코(Eco²)/Auth Offloading (ext-authz) 2025. 12. 17. 04:32

    추가 테스트: Redis io-threads 활성화

    Client 1 ──┐
    Client 2 ──┼──→ [ Command Queue ] ──→ [ Main Thread ] ──→ 순차 실행
    Client 3 ──┘         (FIFO)            (싱글 스레드)

     
    앞서 ext-authz 성능 튜닝에서 Redis 싱글 스레드의 한계를 언급했다.
    Redis 6.0+부터 io-threads를 지원하므로, I/O 병렬화로 성능 개선이 가능한지 테스트했다.
    그렇다고 Command Queue가 병렬로 쌓이진 않는다. 명령 실행은 단일 스레드에서 순차실행이 되는 걸 유의하고 진행하자.
    io-threads가 CPU 경합없이 동작하더라도 네트워크/직렬화 병목까지만 완화가 가능하다.
     


    테스트 환경

    Redis 노드 t3.medium (2 vCPU, 4GB RAM)
    Redis 버전 7.4.1 (Bitnami Helm Chart)
    io-threads 2  (vCPU 수와 동일)
    io-threads-do-reads yes
    Memory 4 GB
    Architecture  Sentinel (1 Master + 2 Replica)

     

    변경 설정

    commonConfiguration: |-
      maxclients 50000
      tcp-keepalive 20      # 300 → 20
      timeout 40            # 0 → 40
      io-threads 2          # NEW
      io-threads-do-reads yes  # NEW

    결과: p99 Latency 급증

    p99 Latency 0.2-0.4s 0.92-1.47s +365% 증가

    실측 데이터 분석

    1. Redis 공식 권장 요건 미충족

    Redis 공식 redis.conf에는 다음과 같이 명시되어 있다:

    By default threading is disabled, we suggest enabling it only in machines that have at least 4 or more cores, leaving at least one spare core.
    Using more than 8 threads is unlikely to help much.

    So for instance if you have a four cores boxes, try to use 2 or 3 I/O threads, if you have a 8 cores, try to use 6 threads.

    redis.conf (Redis 7.4)

    최소 CPU 4코어 이상 2 vCPU
    Spare Core 1개 이상 0개
    io-threads 수 (4코어 기준) 2~3개 2개 (2 vCPU에서)

     

    2 vCPU 환경은 io-threads 최소 요건(4코어)을 충족하지 못한다.


    2. io-threads 처리 비율 저조

    $ kubectl exec -n redis dev-redis-node-0 -c redis -- redis-cli INFO stats
    total_reads_processed:1120822
    total_writes_processed:1107636
    io_threaded_reads_processed:146975
    io_threaded_writes_processed:243342
    instantaneous_ops_per_sec:1289
    Read 병렬화율 146,975 / 1,120,822 13.1% ⚠️ 낮음
    Write 병렬화율 243,342 / 1,107,636 22.0% ⚠️ 낮음
    처리량 1,289 ops/sec - -

     

    전체 I/O의 13-22%만 io-threads가 처리: 병렬화 효과 미미, 오버헤드만 발생


    3. CPU 오버헤드 (컨텍스트 스위칭)

    $ kubectl exec -n redis dev-redis-node-0 -c redis -- redis-cli INFO cpu
    used_cpu_sys:36.814051
    used_cpu_user:97.827366
    used_cpu_sys_main_thread:32.615280
    used_cpu_user_main_thread:41.064764
    메인 스레드 CPU 32.62 + 41.06 73.68 CPU초
    전체 CPU 36.81 + 97.83 134.64 CPU초
    io-threads 오버헤드 134.64 - 73.68 60.96 CPU초 (+45.2%)

     

    2 vCPU에서 3개 스레드(메인 + io-thread × 2)가 경쟁하며 컨텍스트 스위칭 폭증


    4. Slowlog 증거

    $ kubectl exec -n redis dev-redis-node-0 -c redis -- redis-cli SLOWLOG GET 20
    # 명령어 실행 시간 클라이언트 정상 기대값
    3 hello 17.1ms 127.0.0.6:51771 <1ms
    2 hello 34.3ms 127.0.0.6:57513 <1ms
    1 exists blacklist:6e0abda9-... 11.3ms 127.0.0.6:58923 <1ms
    0 INFO 53.2ms sentinel-ddb60715-cmd <1ms

     
    단순 명령들이 10-53ms 지연 → io-threads 스케줄링 병목으로 메인 스레드 대기 시간 증가

     

    5. 연결 상태

    $ kubectl exec -n redis dev-redis-node-0 -c redis -- redis-cli INFO clients
    connected_clients:773
    maxclients:50000
    blocked_clients:0
    연결된 클라이언트 773
    최대 클라이언트 50,000
    차단된 클라이언트 0

    6. 추가 통계

    keyspace_misses:1021798
    total_connections_received:55473
    rejected_connections:0
    Keyspace Miss 1,021,798 Blacklist 조회 (대부분 miss = 정상 토큰)
    총 연결 수신 55,473 -
    거부된 연결 0 연결 제한 없음

     

    io-threads 활성화 조건

    최소 4 vCPU Redis 공식 권장
    Spare Core 1개 이상 메인 스레드 전용 코어 확보

    권장 io-threads 수

    4 2~3
    8 6
    8+ 최대 8

     
    2 vCPU 환경에서는 io-threads 비활성화(default)를 유지하기로 결정했다.
    싱글 스레드 Redis가 오히려 컨텍스트 스위칭 없이 안정적인 성능을 제공한다.

    Reference

    댓글

ABOUT ME

🎓 부산대학교 정보컴퓨터공학과 학사: 2017.03 - 2023.08
☁️ Rakuten Symphony Jr. Cloud Engineer: 2024.12.09 - 2025.08.31
🏆 2025 AI 새싹톤 우수상 수상: 2025.10.30 - 2025.12.02
🌏 이코에코(Eco²) 백엔드/인프라 고도화 중: 2025.12 - Present

Designed by Mango