BLOG

Python 버전이 Amazon DynamoDB 스캔 성능에 미치는 영향 분석
작성일: 2019-10-10

Amazon DynamoDB는 유연한 스키마를 가능하게 하는 NoSQL 데이터베이스입니다. 이는 동일한 표의 항목이 각 항목에 대해 어떤 속성이 있는지에 따라 서로 다를 수 있음을 의미합니다.

 

이전 AWS 블로그 게시 글에서는 항목당 속성 수의 성능 영향을 살펴보았습니다. 최근 고객이 Python 애플리케이션의 저속 스캔을 해결하도록 도와줄 때, 다른 버전의 Python 인터프리터를 검사하여 Python 버전을 업그레이드하면 성능에 도움이 되는지 확인했습니다.

오늘은 데이터를 분석하여 Python 인터프리터 버전이 스캔 성능에 미치는 영향을 보여드리겠습니다.

 

방법론

간단한 구조로 파티션 키와 정렬 키 (둘 다 문자열)로 구성된 기본 키로 하나의 DynamoDB 테이블을 생성했습니다. 또한 각각 7자 키 이름 (“field01”, “field10″등)을 포함하는 24개의 개별 6자 문자열 속성 (총 6 x 24 = 144자)으로 다른 DynamoDB 테이블을 생성했습니다.

 

DynamoDB에는 단일 요청에서 검색하는 데이터양이 1MB로 제한되어 있습니다. 10,000개의 임의 데이터 항목으로 테이블을 시드 한 후 1MB 제한에 맞는 많은 항목을 검색하는 단일 스캔을 실행합니다. 그런 다음 클라이언트 측에서 해당 항목을 검색하고 비 정렬 화하는 데 걸리는 시간을 측정합니다.

 

연습

다음은 Python 버전을 비교하기 위한 몇 가지 일반적인 질문입니다.

  • 한 버전의 Python과 다른 버전의 Python을 사용하면 성능이 어떻게 달라 집니까?
  • 속성이 20개이고 속성이 5개 밖에 없는 경우에 비해 20개의 속성이 있는 경우 성능은 어떻게 달라집니까?
  • 속성 이름을 “thisIsAnEnterpriseAppWithLongAttributeNames”와 같은 긴 이름에서 “foo”또는 “x”로 바꾸면 성능이 어떻게 달라집니까?

 

벤치마킹 도구

우리는 이 테스트에 사용했던 작은 벤치마킹 도구를 공개했습니다. 이 도구를 사용하면 다음을 수행 할 수 있습니다.

  • 자신의 환경에서 이러한 테스트를 재현합니다.
  • 테이블 구조에 대한 사용자 정의를 제공합니다.

테이블의 각 속성의 이름과 해당 속성의 데이터 크기를 지정할 수 있습니다. 결과를 통해 앞에서 설명한 것과 같은 질문에 대답 할 수 있습니다.

 

자세한 내용은 dynamodb-python-query-speed-test GitHub 저장소를 참조하십시오.

 

실증 결과

다음 표는 결과를 요약한 것입니다.

 

파이썬 버전 1MB 스캔 시간 50,000개의 항목을 스캔하는 시간
2.7.16 1,112ms 20초
3.7.2 618ms 12초

 

6자 속성 이름과 6자 문자열 값으로 구성된 24개의 속성을 사용하여 1MB 스캔 응답 제한에서 2,819개의 항목을 검색하고 비 정렬화할 수 있었습니다. Python 2.7.16을 사용하면 5라운드에서 1MB의 항목을 검색하는 데 평균 1페이지당 1112ms가 걸리고 50,000개의 전체 항목을 검색하는 데 약 20초가 걸렸습니다.

 

# pyenv local 2.7.16

# python run.py –table dynamodb-speed-test-blog –region us-east-2 –query 10000 –rounds 5 –rcu 100000 –wcu 100000 –schema schemas/24_attributes_7_char_names_6_byte_data.schema

GRAND TOTALS:

Items queried: 50000

Elapsed time: 19754.6 ms

Avg. time per item: 0.395 ms

 

Python 3.7.2에서는 동일한 2,819개의 항목을 검색하고 비 정렬 화하는 데 평균 618ms가 걸렸으며, 전체 50,000개의 항목을 검색하는 데 약 12초가 걸렸습니다.

 

# pyenv local 3.7.2

# python run.py –table dynamodb-speed-test-blog –region us-east-2 –query 10000 –rounds 5 –rcu 100000 –wcu 100000 –schema

schemas/24_attributes_7_char_names_6_byte_data.schema

GRAND TOTALS:

Items queried: 50000

Elapsed time: 11875.6 ms

Avg. time per item: 0.238 ms

 

결론

결과는 Python 3.7.2가 몇 가지 방법으로 Python 2.7.16보다 약 40% 더 효율적이라는 것을 보여줍니다.

  • 클라이언트와 DynamoDB 간의 네트워크 트래픽 처리
  • DynamoDB API 응답을 Python 사전으로 비 정렬 화하는 데 필요한 문자열 구문 분석의 경우

 

그렇지만, 속성 이름을 줄이는 것을 고려하십시오. 또한 사용 사례의 인덱싱 및 쿼리 요구 사항을 충족하는 데 필요한 최소한의 속성이 필요합니다.

 

그러나 이전 버전의 Python을 사용하는 경우, 최신 버전의 Python 3으로 업그레이드하면 성능이 크게 향상됩니다. 대규모 코드 기반을 Python 3으로 업그레이드하는 데 약간의 작업이 필요하지만 도움이 되는 도구와 문서를 찾는 것이 좋습니다. 코드를 Python 3으로 전환하려면 ‘Python 2 코드를 Python 3으로 옮기기’를 참고해 주십시오.

 

원문 URL: https://aws.amazon.com/ko/blogs/database/analyzing-the-impact-of-python-version-on-amazon-dynamodb-scan-performance/

 

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.