AOF Rewrite effect

Redis Server 教育
Redis Server Course
Redis 定期点検/技術支援
Redis Technical Support
Redis エンタープライズサーバ
Redis Enterprise Server

AOF Rewrite effect

개요 槪要 Outline

AOF Rewrite 시 메모리 사용량, CPU 사용률, 명령 실행에 미치는 영향을 분석합니다.


📚<1번 이미지>
  • 00:10경 AOF Rewrite가 시작되었고, 00:11:30에 완료(종료)되었습니다.
    해당 기간동안 CPU 사용률이 약 2배 증가했고, 메모리도 12GB에서 18GB까지 5GB 증가했다가 떨어졌습니다.
  • 아래 이미지는 해당 시간대를 자세히 본 것입니다.

CPU, 메모리, AOF Rewrite 자세한 분석


📚<2번 이미지>
  • AOF Rewrite 작업은 Child process를 fork(생성)하면서 시작됩니다.   Parent(main) process CPU 사용률은 그대로이고, Child process가 거의 100% CPU를 사용하므로 CPU 사용률이 높게 나오는 것입니다.   📚<4번 이미지> "Child CPU" 참조
  • 메모리 사용량이 증가하는 이유는 AOF Rewrite 시작 시점 기준으로 Child process가 메모리에 lock을 걸어서 더 이상 변경할 수 없게 합니다. Parent process는 추가 메모리를 할당받아 입력/수정/삭제되는 데이터를 저장합니다. (사실 이 부분은 Linux OS가 COW(Copy on Write) 방식으로 처리합니다) 그리고 Parent process는 변경된 데이터를 별도 버퍼에 저장했다가 AOF Rewrite가 완료되는 시점에 AOF 파일에 추가합니다.
  • 이러한 이유로 AOF Rewrite 시 평소보다 메모리를 더 사용하게 됩니다.
    레디스 메모리 사용량이 몇백MB, 몇GB 일 때는 AOF Rewrite 시간이 길지 않기 때문에 큰 문제가 되지 않습니다.   하지만 수십GB 또는 수백GB 일 때는 AOF Rewrite 시간이 길어지므로 그만큼 추가 메모리가 더 필요합니다. (500GB일 경우 30분 이상 소요)  따라서 메모리가 부족할 경우 AOF Rewrite 실패하거나 레디스(Parent) process가 'kill'되는 큰 문제가 발생할 수 있습니다.
  • AOF Rewrite 실패 시 Parent process는 다시 AOF Rewrite를 시도합니다. 이 경우도 대부분 실패하게되고 이 과정이 반복됩니다.
  • 메인 메모리를 다 사용하면 Linux OS는 해당 process를 kill 시킵니다.   여유 메모리를 충분히 확보해야 하고, 만약의 사태에 대비해서 Swap 역영도 어느 정도 잡아야 합니다.

명령 처리 일시 중단, CPU 사용률 분석


📚<3번 이미지>
  • AOF Rewrite를 시작하는 시점 명령 처리가 뚝 떨어지는 것을 볼 수 있습니다.   실제로는 처리 건수가 '0'입니다.   이유는 AOF Rewrite용 Child process를 fork(생성)하는 동안, 명령을 처리할 수 없습니다.  
  • fork()가 짧게는 수ms(millisecond)~수십sec까지 걸립니다.   레디스 사용 메모리가 적으면(1GB 이하) 수ms에 처리되지만, 크면 수십sec까지 걸릴 수 있습니다. 예를 들어 레디스 사용 메모리가 500GB라면 10sec 이상 걸립니다.
  • 메모리를 많이 사용하면 AOF Rewrite 시점을 자동(임의)으로 하지 말고(auto-aof-rewrite-percentage 0), 시점을 정해서 사용하세요.
    📍auto-aof-rewrite-percentage 100 -> aof 파일이 2배 증가하면 Rewrite를 시작함.
    📍auto-aof-rewrite-percentage 0 -> disabel
    특히 입력이 많을 때 일 수록 aof 파일이 급격히 증가하므로 바쁜 시간대에 AOF Rewrite가 시작될 확률이 높습니다.
  • redisGate Enterprise에서는 redis.conf에 "auto-aof-rewrite-spec-time" 지시자를 제공해서 특정 시간에 실행할 수 있습니다.
    📍 auto-aof-rewrite-spec-time "03:00" -> (사용률이 적은) 03시 00분에 시작.
  • 마지막으로, 명령 처리를 못하다가 한꺼번에 처리하므로 해당 시간대에 CPU 사용률도 튀는 것을 볼 수 있습니다.

AOF Rewrite Child process 분석


📚<4번 이미지>
  • Child Write: AOF Rewrite 동안 Child process는 약 120MB/sec로 disk에 write합니다.
    가능한 빠르게 완료하기 위해서 가능한 대역폭을 모두 사용합니다.   그러므로 Disk I/O(write)가 100%에 도달할 수 있습니다. (아래 📚<4-1번 이미지> 참조)
    운영 중 또는 부하 테스트 시 담당자로 부터 이슈가 제기될 수 있습니다.   이 경우 레디스 AOF Rewrite 특성을 잘 설명하고 문제가 되지 않는다는 것을 잘 설명해 주세요. 😊

    📚<4-1번 이미지> 레디스 서버 10대를 모니터링한 것입니다.
  • Child Memory(RSS): 메모리 12GB를 사용합니다.   이것은 추가로 사용하는 것이 아니고 Parent(main) process와 공유합니다.
  • Child CPU: AOF Rewrite 기간 동안 거의 100%를 사용합니다.   그래서 📚<2번 이미지>에서 보는 것과 같이 CPU 사용률이 크게 증가합니다.
    📍 Parent(main) process는 평상시와 같이 명령 처리를 합니다.

다른 예


📚<5번 이미지>
  • 02:42:30 시작 ~ 02:43:30 종료: 입력이 계속 들어오는 중에 AOF Rewrite가 실행되어 메모리 사용량이 증가했습니다.
  • 02:43:30 시점 메모리 차트(떨어지는 부분)를 보면, Rewrite 기간 동안 입력으로 약 500MB 정도 추가 사용했음을 알 수 있습니다.

정리 整理 Summary

  • 대규모 메모리 환경에서 충분한 메모리와 적절한 실행 시점 관리가 필요합니다.


<< AOF Functions RDB Save >>

Email 返事がかかってなれば、メールでお知らせします。