코드 비용 최적화를 위한 권장 사항

이 Azure Well-Architected Framework 비용 최적화 검사 목록 권장 사항에 적용됩니다.

CO:11 코드 비용을 최적화합니다. 더 적거나 저렴한 리소스로 기능 및 비기능 요구 사항을 충족하도록 코드를 평가하고 수정합니다.

이 가이드에서는 코드 비용을 최적화하기 위한 권장 사항을 설명합니다. 코드 최적화는 애플리케이션 코드의 효율성, 성능 및 비용 효율성을 개선하는 프로세스입니다. 효과적인 코드 최적화에는 리소스 소비를 줄이고, 실행 시간을 최소화하고, 전반적인 성능을 개선하기 위해 코드를 변경하는 작업이 포함됩니다.

코드를 최적화하면 리소스 소비 증가 및 비용 증가로 이어질 수 있는 비효율성을 식별하고 제거할 수 있습니다. 처리 시간, 메모리 사용량 및 네트워크 오버헤드를 줄여 더 빠르고 응답성이 뛰어난 애플리케이션으로 이어질 수 있습니다. 성능이 향상되어 사용자 환경이 향상되고 시스템에서 더 큰 워크로드를 효율적으로 처리할 수 있습니다.

정의

용어 정의
코드 계측 런타임 중에 데이터를 수집하고 코드 성능을 모니터링하는 코드 조각 또는 라이브러리를 코드에 추가하는 방법입니다.
동시성 동시에 여러 프로세스를 실행합니다.
데이터 serialization 데이터 개체를 저장하거나 전송할 수 있는 형식으로 변환한 다음 필요한 경우 원래 형식으로 다시 구성하는 프로세스입니다.
핫 경로 높은 성능과 짧은 대기 시간이 필요한 프로그램의 중요 또는 자주 실행되는 섹션입니다.

주요 디자인 전략

비용 최적화 코드는 CPU 주기, 메모리 및 스토리지와 같은 instance 리소스를 줄이면서 동일한 기능을 구현하도록 코드를 개선하는 것을 의미합니다. 리소스 소비를 줄이면 애플리케이션이 대량의 데이터를 처리하거나 높은 트래픽 부하를 경험할 때 비용을 절감할 수 있습니다.

코드 개선은 크기 조정, 권한 부여, 중복성 및 제한과 관련된 다른 비용 최적화 작업을 수행할 때 가장 효과적입니다. 이러한 기본 요소를 처리한 후에는 코드 최적화를 고려할 수 있습니다.

비효율적인 코드가 있는지 알 수 없습니다. 서버리스, 자동 크기 조정 및 안정성 기능은 코드 비효율성을 마스킹할 수 있습니다. 다음 전략은 필요한 것보다 더 많은 비용이 드는 애플리케이션 코드를 식별하고 수정하는 데 도움이 될 수 있습니다.

코드 계측

코드 계측은 런타임 중에 데이터를 수집하고 코드 성능을 모니터링하는 코드 조각 또는 라이브러리를 추가하는 방법입니다. 이를 통해 개발자는 리소스 사용량(CPU 또는 메모리 사용량) 및 실행 시간과 같은 주요 메트릭에 대한 정보를 수집할 수 있습니다. 개발자는 코드를 계측하여 코드 핫 경로에 대한 인사이트를 얻고, 성능 병목 상태를 식별하고, 더 나은 효율성과 비용 효율성을 위해 코드를 최적화할 수 있습니다.

이상적인 환경에서는 소프트웨어 개발 수명 주기 초기에 코드 분석을 수행해야 합니다. 코드 문제를 더 일찍 발견할수록 더 저렴하게 해결할 수 있습니다.

이 코드 분석을 최대한 자동화합니다. 코드 분석에 동적 및 정적 도구를 사용하여 수동 작업을 줄입니다. 그러나 이 테스트는 여전히 프로덕션 시뮬레이션입니다. 프로덕션은 코드 최적화에 대한 명확한 이해를 제공합니다.

절충: 코드 모니터링 도구는 비용을 증가시킬 수 있습니다.

핫 경로 식별 및 최적화

코드를 계측하여 코드 경로의 리소스 사용량을 측정할 수 있습니다. 이러한 측정은 핫 경로를 식별하는 데 도움이 됩니다. 핫 경로는 성능 및 리소스 사용량에 상당한 영향을 줍니다. 높은 성능과 짧은 대기 시간이 필요한 프로그램의 중요하거나 자주 실행되는 섹션입니다.

핫 경로를 식별하려면 다음 작업을 고려합니다.

  • 런타임 데이터 분석: 런타임 데이터를 수집하고 분석하여 CPU, 메모리 또는 I/O 작업과 같은 중요한 리소스를 사용하는 코드 영역을 식별합니다. 자주 실행되거나 완료하는 데 시간이 오래 걸리는 코드의 패턴 또는 섹션을 찾습니다.

  • 성능 측정: 프로파일링 도구 또는 성능 테스트 프레임워크를 사용하여 코드 경로의 실행 시간과 리소스 사용량을 측정합니다. 이 측정은 병목 상태 및 개선 영역을 식별하는 데 도움이 됩니다.

  • 비즈니스 논리 및 사용자 효과 고려: 애플리케이션의 기능 또는 중요한 비즈니스 운영에 대한 관련성에 따라 코드 경로의 중요성을 평가합니다. 사용자에게 가치를 제공하거나 성능 요구 사항을 충족하는 데 중요한 코드 경로를 결정합니다.

    작업 중인 프로그래밍 언어와 관련된 성능 권장 사항을 검토합니다. 이러한 권장 사항에 대해 코드를 평가하여 개선 영역을 식별합니다. 성능에 영향을 줄 수 있는 코드 경로 내에서 불필요한 작업을 제거합니다.

  • 불필요한 함수 호출 제거: 코드를 검토합니다. 원하는 기능에 필수적이지 않고 성능에 부정적인 영향을 줄 수 있는 함수를 식별합니다. 예를 들어 함수 호출이 코드의 앞부분에서 발생한 유효성 검사를 수행하는 경우 불필요한 함수 호출을 제거할 수 있습니다.

  • 로깅 작업 최소화: 로깅은 디버깅 및 분석에 유용할 수 있지만 과도한 로깅은 성능에 영향을 줄 수 있습니다. 각 로깅 작업의 필요성을 평가하고 성능 분석에 중요하지 않은 불필요한 로깅 호출을 제거합니다.

  • 루프 및 조건부 최적화: 코드에서 루프 및 조건부를 분석합니다. 제거할 수 있는 불필요한 반복 또는 조건을 식별합니다. 이러한 구조를 단순화하고 최적화하면 코드의 성능이 향상될 수 있습니다.

  • 불필요한 데이터 처리 줄이기: 중복 계산 또는 변환과 같은 불필요한 데이터 처리 작업에 대한 코드를 검토합니다. 이러한 불필요한 작업을 제거하여 코드의 효율성을 개선합니다.

  • 네트워크 요청 최소화: 코드에서 네트워크 요청을 만드는 경우 요청 수를 최소화하고 사용량을 최적화합니다. 가능하면 요청을 일괄 처리하고 불필요한 왕복을 방지하여 성능을 향상시킵니다.

  • 할당 최소화: 과도한 메모리 할당이 발생하는 영역을 식별합니다. 불필요한 할당을 줄이고 가능하면 기존 리소스를 다시 사용하여 코드를 최적화합니다.

    할당을 최소화하면 메모리 효율성과 전반적인 성능을 향상시킬 수 있습니다. 프로그래밍 언어에 적절한 메모리 관리 및 가비지 수집 전략을 사용합니다.

  • 데이터 구조 크기 줄이기: 클래스와 같은 데이터 구조의 크기를 평가하고 감소가 가능한 영역을 식별합니다. 데이터 요구 사항을 검토하고 불필요한 필드 또는 속성을 제거합니다. 적절한 데이터 형식을 선택하고 데이터를 효율적으로 압축하여 메모리 사용량을 최적화합니다.

  • 교차 절단 구현 평가: 미들웨어 또는 토큰 검사와 같은 교차 절단 구현의 효과를 고려합니다. 성능에 부정적인 영향을 미치는지 여부를 평가합니다.

절충: 코드 및 핫 경로를 최적화하려면 코드 비효율성을 식별하는 개발자 전문 지식이 필요합니다. 이러한 고도로 숙련된 개인은 다른 작업에 시간을 할애해야 할 수도 있습니다.

동시성 사용 평가

동시성 사용을 평가하려면 비동기 처리, 다중 스레딩 또는 다중 처리가 리소스 사용률을 최대화하고 비용을 줄일 수 있는지 여부를 평가해야 합니다. 비동기 처리, 다중 스레딩 또는 다중 처리를 사용하여 동일한 리소스로 더 많은 작업을 처리할 수 있습니다. 그러나 더 많은 오버헤드를 방지하고 비용 효율성을 유지하기 위해 적절한 구현을 보장하는 것이 중요합니다.

동시성 사용이 적합한지 여부를 평가하려면 다음 지침을 따를 수 있습니다.

  • 비동기 처리: 비동기 처리는 차단 해제 실행을 허용합니다. 예를 들어 프로세스를 시작한 다음 일시 중지하여 두 번째 프로세스가 완료되도록 할 수 있습니다.

    비동기적으로 실행할 수 있는 코드 구성 요소 또는 작업을 결정합니다. 사용 중인 프로그래밍 언어 또는 프레임워크를 식별하고 지원하는 비동기 프로그래밍 모델(예: async/await .NET 또는 JavaScript의 promise)을 이해합니다.

    비동기 프로그래밍 구문을 사용하도록 코드를 재구성하려면 비동기 작업 실행을 사용하도록 설정합니다. 비동기 메서드 또는 콜백을 사용하여 장기 실행 또는 I/O 집약적 작업을 기본 실행 스레드에서 분리합니다. 프로그래밍 언어 또는 프레임워크에서 제공하는 비동기 API 또는 라이브러리를 사용하여 비동기 워크플로를 처리합니다.

  • 다중 스레딩: 다중 스레딩에서 단일 프로세스의 여러 스레드를 동시에 실행합니다.

    동시에 독립적으로 실행할 수 있는 코드 섹션을 식별합니다. 다중 스레딩 모범 사례에 사용하는 프로그래밍 언어 또는 프레임워크와 관련된 설명서 또는 지침을 읽습니다. 태스크의 병렬 실행을 처리하기 위해 여러 스레드 또는 스레드 풀을 만듭니다.

    잠금, 뮤텍스 또는 세마포와 같은 동기화 메커니즘을 구현하여 스레드 안전을 보장하고 코드가 공유 리소스에 액세스할 때 경합 상태를 방지합니다. 스레드 풀 또는 작업 기반 병렬 처리 라이브러리와 같은 상위 수준 추상화를 사용하여 여러 스레드의 관리를 간소화하고 동시성 제어를 간소화하는 것이 좋습니다.

  • 다중 처리: 다중 처리는 프로세스가 병렬로 실행되도록 할 수 있습니다. 다중 스레딩보다 여러 CPU 코어의 더 나은 사용률을 제공할 수 있습니다.

    코드의 워크로드 또는 작업이 병렬 처리에 적합한지 여부를 결정합니다. 사용 중인 프로그래밍 언어 또는 프레임워크를 식별하고 다중 처리 기능을 탐색합니다. 예를 들어 Python의 다중 처리 모듈 또는 Java의 병렬 스트림을 고려해 보세요. 동시에 처리할 수 있는 여러 독립 작업으로 워크로드를 분할하도록 코드를 디자인합니다.

    다중 처리 API 또는 라이브러리를 사용하여 병렬 프로세스를 만들고 관리합니다. 이러한 API 또는 라이브러리 간에 워크로드를 배포합니다. 여러 프로세스 간에 조정 및 데이터 공유를 사용하도록 설정하려면 프로그래밍 언어 또는 프레임워크에 따라 IPC(프로세스 간 통신), 공유 메모리 또는 메시지 전달과 같은 통신 메커니즘을 구현합니다.

올바른 SDK 사용

비용 최적화를 위해 리소스 사용을 최적화하고 성능을 향상하도록 설계된 SDK를 선택합니다. 각 SDK의 기능과 기능을 평가하는 것이 중요합니다. 프로그래밍 언어 및 개발 환경과의 호환성을 고려합니다.

워크로드에 가장 적합한 SDK를 선택하는 데 도움이 되는 지침은 다음과 같습니다.

  • 성능 테스트 수행: 성능 테스트를 통해 SDK의 리소스 사용량 및 성능을 비교합니다. 리소스 최적화 및 성능 향상 측면에서 요구 사항을 가장 잘 충족하는 SDK를 선택합니다. 제공된 설명서 및 지침에 따라 선택한 SDK를 코드베이스에 통합합니다.

  • 리소스 사용량 모니터링 및 코드 최적화: 구현된 SDK를 사용하여 리소스 사용량을 모니터링합니다. 모니터링 및 분석에서 인사이트를 수집하여 코드를 최적화합니다.

올바른 운영 체제 선택

대부분의 코딩 언어는 다양한 운영 체제에서 실행할 수 있으므로 더 저렴한 대안에 대해 운영 체제를 평가하는 것이 중요합니다. 대체 운영 체제가 더 적은 비용으로 동일하거나 유사한 기능을 지원하는 경우 고려할 가치가 있습니다. 더 저렴한 운영 체제를 선택하면 라이선스 비용 및 인프라 비용을 줄일 수 있습니다.

올바른 운영 체제는 워크로드에 대한 전반적인 비용 최적화에 기여할 수 있습니다. 워크로드에 적합한 운영 체제를 선택하려면 다음 작업을 시도해 보세요.

  • 요구 사항 평가: 사용 중인 코딩 언어 및 프레임워크를 포함하여 워크로드의 특정 요구 사항을 이해합니다. 종속성 또는 다른 시스템과의 통합을 고려합니다.

  • 호환성 고려: 선택한 운영 체제가 코딩 언어, 프레임워크 및 사용하는 타사 라이브러리 또는 도구와 호환되는지 확인합니다. 운영 체제에 대한 설명서 및 커뮤니티 지원을 확인하여 기술 스택과 호환성이 좋은지 확인합니다.

  • 기능 평가: 대체 운영 체제가 현재 운영 체제와 동일하거나 유사한 기능을 지원하는지 확인합니다. 워크로드에 필요한 기능과 기능을 제공하는지 평가합니다.

  • 비용 비교: 운영 체제와 관련된 비용을 비교합니다. 라이선스 요금, 지원 비용 및 인프라 요구 사항과 같은 요소를 고려합니다. 기능을 손상시키지 않고 워크로드 요구 사항을 충족할 수 있는 더 저렴한 대안을 찾습니다.

  • 성능 및 최적화 고려: 대체 운영 체제의 성능 및 최적화 기능을 평가합니다. 벤치마크, 사례 연구 또는 성능 비교를 찾아 실제 시나리오에서 수행하는 방식을 이해합니다.

  • 보안 및 안정성 검토: 대체 운영 체제의 보안 및 안정성을 평가합니다. 보안 업데이트, 패치 및 커뮤니티 지원을 찾아 운영 체제가 적극적으로 유지 관리되고 전반적으로 안전하고 안정적인지 확인합니다.

  • 공급업체 지원 고려: 대체 운영 체제에 사용할 수 있는 공급업체 지원 수준을 평가합니다. 필요한 경우 지원을 제공할 수 있는 공식 지원 채널, 설명서 및 사용자 커뮤니티가 있는지 확인합니다.

네트워크 통과 최적화

네트워크 통과 최적화는 워크로드 구성 요소 간의 네트워크 트래픽을 최소화하는 것입니다. 데이터 전송에는 종종 관련 비용이 발생합니다. 네트워크 트래픽을 최소화하면 비용을 줄이면서 전송해야 하는 데이터의 양을 줄일 수 있습니다.

워크로드를 분석하고 구성 요소 간의 불필요한 데이터 전송을 식별합니다. 중복 또는 중복 데이터를 전송하지 않고 필수 정보만 전송합니다. 예를 들어 구성 요소가 다른 구성 요소에서 동일한 데이터를 반복적으로 요청하는 경우 최적화 후보입니다. 코드를 리팩터링하여 불필요한 호출을 줄이거나 요청을 일괄 처리하여 전송된 데이터를 최소화할 수 있습니다. 애플리케이션은 몇 개의 필드만 필요한 경우 전체 개체 또는 데이터 구조를 보낼 수 있습니다. 필요한 데이터만 보내도록 코드를 최적화하면 각 데이터 전송의 크기를 최소화할 수 있습니다.

네트워크 프로토콜 최적화

네트워크 프로토콜은 네트워크 통신의 효율성에 중요한 역할을 합니다. 네트워크 프로토콜을 최적화하면 데이터 전송의 전반적인 효율성을 개선하고 리소스 소비를 줄일 수 있습니다.

다음 제안을 고려합니다.

  • 효율적인 프로토콜 선택: 데이터 전송 속도 및 오버헤드 최소화 측면에서 효율성으로 유명한 프로토콜을 선택합니다. 예를 들어 HTTP/1.1을 통해 HTTP/2와 같은 프로토콜을 사용하는 것이 좋습니다. 이러한 프로토콜은 대기 시간을 줄이고 데이터 전송을 최적화하여 성능을 향상하도록 설계되었습니다. 애플리케이션에서 라이브러리 및 프레임워크를 사용하여 이러한 프로토콜을 사용합니다.

  • 압축 지원: 전송되는 데이터의 크기를 줄이기 위해 네트워크 프로토콜에서 압축 메커니즘을 구현합니다. 압축은 네트워크를 통해 전송되는 데이터의 양을 크게 줄여 성능을 향상시키고 대역폭 사용량을 줄일 수 있습니다. 서버 쪽 압축은 일반적으로 애플리케이션 코드 또는 서버 구성에서 사용하도록 설정됩니다.

  • 연결 풀링 활용: 연결 풀링을 사용하면 설정된 네트워크 연결을 다시 사용하여 각 요청에 대한 새 연결을 설정하는 오버헤드를 줄일 수 있습니다. 연결 풀링을 사용하면 연결 설정 및 중단의 오버헤드를 방지하여 네트워크 통신의 효율성을 향상시킬 수 있습니다. 연결 풀링 라이브러리 또는 프레임워크를 선택하고 워크로드 요구 사항을 충족하도록 구성합니다.

  • 다른 최적화 구현: 워크로드 및 네트워크 환경과 관련된 다른 최적화를 살펴봅니다. 예를 들어 콘텐츠 캐싱, 부하 분산 및 트래픽 셰이핑을 사용하여 네트워크 통과를 더욱 최적화할 수 있습니다.

네트워크 오버헤드 최소화

워크로드 구성 요소 간의 네트워크 트래픽 및 데이터 전송 양을 최소화합니다. 네트워크 오버헤드를 줄이면 데이터 송신과 관련된 비용을 절감하고 수신하고 전반적인 네트워크 성능을 향상시킬 수 있습니다.

다음 기술을 고려합니다.

  • 중복 요청 감소: 코드를 분석하여 중복되거나 불필요한 요청을 식별합니다. 동일한 데이터에 대해 여러 요청을 하는 대신 코드를 수정하여 데이터를 한 번 검색하고 필요에 따라 다시 사용할 수 있습니다.

  • 데이터 크기 최적화: 구성 요소 또는 시스템 간에 전송되는 데이터를 검토하고 크기를 최소화할 기회를 찾습니다. 전송 전에 데이터를 압축하거나 보다 효율적인 데이터 형식을 사용하는 등의 기술을 고려합니다. 데이터 크기를 줄이면 네트워크 대역폭 사용량을 줄이고 전반적인 효율성을 향상시킬 수 있습니다.

  • 일괄 처리 요청: 해당하는 경우 더 작은 여러 요청을 단일 더 큰 요청으로 일괄 처리하는 것이 좋습니다. 일괄 처리는 여러 연결을 설정하는 오버헤드를 줄이고 전체 데이터 전송을 줄입니다.

  • 데이터 직렬화 사용: 데이터 직렬화는 복잡한 데이터 구조 또는 개체를 네트워크를 통해 쉽게 전송하거나 영구 스토리지 시스템에 저장할 수 있는 형식으로 변환하는 프로세스입니다. 이 전략에는 데이터를 표준화된 형식으로 나타내므로 수신 끝에서 데이터를 효율적으로 전송, 처리 및 재구성할 수 있습니다.

    간단하고 빠르며 워크로드 요구 사항에 적합한 직렬화 형식을 선택합니다.

    Serialization 형식 Description
    프로토콜 버퍼(protobuf) 구조화된 데이터의 효율적인 인코딩 및 디코딩을 제공하는 이진 serialization 형식입니다. 형식화된 정의 파일을 사용하여 메시지 구조를 정의합니다.
    MessagePack 유선을 통한 압축 전송을 위한 이진 serialization 형식입니다. 다양한 데이터 형식을 지원하고 빠른 직렬화 및 역직렬화 성능을 제공합니다.
    JSON(JavaScript Object Notation) 사람이 읽을 수 있고 사용하기 쉬운 널리 사용되는 데이터 직렬화 형식입니다. JSON은 텍스트 기반이며 광범위한 플랫폼 간 지원을 제공합니다.
    이진 JSON(BSON) JSON과 비슷하지만 효율적인 serialization 및 역직렬화를 위해 설계된 이진 serialization 형식입니다. BSON에는 JSON에서 사용할 수 없는 추가 데이터 형식이 포함되어 있습니다.

    serialization 형식에 따라 개체 또는 데이터 구조를 선택한 형식으로 직렬화하고 원래 형식으로 다시 역직렬화하는 논리를 구현해야 합니다. 형식에 대한 serialization 기능을 제공하는 라이브러리 또는 프레임워크를 사용하여 이 논리를 구현할 수 있습니다.

데이터 액세스 최적화

데이터 액세스 최적화는 불필요한 작업을 최소화하기 위해 데이터를 검색하고 저장하기 위한 패턴과 기술을 간소화하는 것을 의미합니다. 데이터 액세스를 최적화할 때 리소스 사용량을 줄이고, 데이터 검색을 줄이고, 데이터 처리의 효율성을 개선하여 비용을 절감할 수 있습니다. 데이터 캐싱, 효율적인 데이터 쿼리 및 데이터 압축과 같은 기술을 고려합니다.

캐싱 메커니즘 사용

캐싱에는 자주 액세스하는 데이터를 필요한 구성 요소에 더 가깝게 저장하는 작업이 포함됩니다. 이 기술은 네트워크를 통해 가져오는 대신 캐시에서 데이터를 제공하여 네트워크 통과의 필요성을 줄입니다.

다음 캐싱 메커니즘을 고려합니다.

  • 외부 캐시 사용: 인기 있는 캐싱 솔루션 중 하나는 콘텐츠 배달 네트워크입니다. 정적 콘텐츠를 소비자에게 더 가깝게 캐싱하여 대기 시간을 최소화하고 네트워크 통과를 줄이는 데 도움이 됩니다.

  • 캐싱 매개 변수 조정: 캐싱 매개 변수(예: TTL(Time to Live))를 구성하여 잠재적인 단점을 최소화하면서 캐싱의 이점을 최적화합니다. 적절한 TTL을 설정하면 캐시된 데이터가 최신 상태로 유지되고 관련성이 유지됩니다.

  • 메모리 내 캐싱 사용: 외부 캐싱 솔루션 외에도 애플리케이션에서 메모리 내 캐싱을 구현하는 것이 좋습니다. 메모리 내 캐싱은 유휴 컴퓨팅 리소스를 활용하고 할당된 리소스의 컴퓨팅 밀도를 높이는 데 도움이 될 수 있습니다.

데이터베이스 트래픽 최적화

데이터베이스에 대한 애플리케이션 통신의 효율성을 향상시킬 수 있습니다. 다음은 데이터베이스 트래픽을 최적화하기 위한 몇 가지 주요 고려 사항 및 기술입니다.

  • 인덱스 만들기: 인덱싱은 데이터 검색 속도를 향상시키는 데이터 구조를 만드는 프로세스입니다. 자주 쿼리되는 열에 인덱스를 만들면 쿼리를 실행하는 데 걸리는 시간을 크게 줄일 수 있습니다. 예를 들어 사용자 이름에 대한 열이 있는 사용자 테이블이 있는 경우 사용자 이름 열에 인덱스를 만들어 특정 사용자 이름을 검색하는 쿼리 속도를 높일 수 있습니다.

    가장 자주 액세스하는 열을 식별하고 해당 열에 인덱스를 만들어 데이터 검색 속도를 향상합니다. 기존 인덱스를 정기적으로 분석하고 최적화하여 여전히 효과적인지 확인합니다. 삽입 및 업데이트 작업에 부정적인 영향을 줄 수 있으므로 과잉 인덱싱을 방지합니다.

  • 쿼리 최적화: 특정 데이터 요구 사항을 고려하고 불필요한 데이터 검색을 최소화하여 효율적인 쿼리를 디자인합니다. 테이블 간의 관계에 따라 적절한 조인 형식(예: 내부 조인 및 왼쪽 조인)을 사용하여 시작합니다. 쿼리 힌트, 쿼리 계획 분석 및 쿼리 다시 쓰기와 같은 쿼리 최적화 기술을 사용하여 성능을 향상시킵니다.

  • 캐시 쿼리 결과: 자주 실행되는 쿼리의 결과를 메모리 또는 캐시에 저장할 수 있습니다. 그런 다음, 동일한 쿼리의 후속 실행을 캐시에서 처리할 수 있으므로 비용이 많이 드는 데이터베이스 작업이 필요하지 않습니다.

  • ORM(개체 관계형 매핑) 프레임워크를 사용합니다 . 지연 로드, 캐싱 및 일괄 처리와 같은 ORM 기능을 사용하여 데이터 검색을 최적화하고 데이터베이스 왕복을 최소화합니다. C#용 Entity Framework 또는 Java용 최대 절전 모드와 같은 ORM 프레임워크를 사용합니다.

  • 저장 프로시저 최적화: 저장 프로시저의 논리 및 성능을 분석하고 최적화합니다. 저장 프로시저에서 불필요한 계산 또는 중복 쿼리를 방지하는 것이 목표입니다. 임시 테이블, 변수 및 커서 사용을 최적화하여 리소스 소비를 최소화합니다.

데이터 구성

효율적인 액세스 및 검색을 위해 데이터를 구성하려면 성능을 최대화하고 리소스 소비를 최소화하는 방식으로 데이터를 구조화하고 저장해야 합니다. 쿼리 응답 시간을 개선하고, 데이터 전송 비용을 절감하고, 스토리지 사용률을 최적화할 수 있습니다.

다음은 데이터를 효율적으로 구성하는 몇 가지 기술입니다.

  • 파티션: 분할에는 큰 데이터 세트를 파티션이라는 더 작고 관리하기 쉬운 하위 집합으로 나누는 작업이 포함됩니다. 각 파티션을 별도로 저장하여 병렬 처리 및 향상된 쿼리 성능을 허용할 수 있습니다. 예를 들어 특정 값 범위에 따라 데이터를 분할하거나 서버 간에 데이터를 분산하여 데이터를 분할할 수 있습니다. 이 기술은 확장성을 향상시키고 경합을 줄이며 리소스 사용률을 최적화할 수 있습니다.

  • 분할: 분할은 여러 데이터베이스 인스턴스 또는 서버 간에 데이터를 수평으로 분할하는 기술입니다. 각 분할된 데이터베이스에는 데이터의 하위 집합이 포함되며 이러한 분할된 데이터베이스에서 쿼리를 병렬로 처리할 수 있습니다. 분할은 워크로드를 배포하고 각 쿼리가 액세스하는 데이터의 양을 줄여 쿼리 성능을 향상시킬 수 있습니다.

  • 압축: 데이터 압축에는 스토리지 요구 사항을 최소화하고 데이터 전송의 효율성을 개선하기 위해 데이터 크기를 줄이는 작업이 포함됩니다. 압축된 데이터는 디스크 공간을 덜 차지하므로 스토리지 비용을 절감할 수 있습니다. 압축된 데이터를 네트워크를 통해 더 빠르게 전송하고 데이터 전송 비용을 줄일 수도 있습니다.

예를 들어 고객 정보의 큰 데이터 세트가 있는 시나리오를 고려해 보세요. 고객 지역 또는 인구 통계에 따라 데이터를 분할하면 워크로드를 여러 서버에 분산하고 쿼리 성능을 향상시킬 수 있습니다. 또한 데이터를 압축하여 스토리지 비용을 절감하고 데이터 전송의 효율성을 향상시킬 수 있습니다.

아키텍처 최적화

워크로드 아키텍처를 평가하여 리소스 최적화 기회를 식별합니다. 목표는 올바른 작업에 적합한 서비스를 사용하는 것입니다.

이 목표를 달성하려면 더 적은 리소스를 사용하려면 아키텍처의 일부를 다시 디자인해야 할 수 있습니다. 서버리스 또는 관리형 서비스를 고려하고 리소스 할당을 최적화합니다. 아키텍처를 최적화하면 기능 및 비기능 요구 사항을 충족하는 동시에 instance 리소스당 더 적은 수의 리소스를 사용할 수 있습니다.

디자인 패턴 사용

디자인 패턴은 개발자가 반복되는 디자인 문제를 해결하는 데 도움이 되는 재사용 가능한 솔루션입니다. 효율적이고 유지 관리 가능하며 확장 가능한 코드를 디자인하는 구조화된 접근 방식을 제공합니다.

디자인 패턴은 효율적인 리소스 할당 및 관리에 대한 지침을 제공하여 시스템 리소스 사용을 최적화하는 데 도움이 됩니다. 예를 들어 회로 차단기 패턴은 제어된 방식으로 오류를 처리하고 복구하는 메커니즘을 제공하여 불필요한 리소스 소비를 방지하는 데 도움이 됩니다.

디자인 패턴은 다음과 같은 방법으로 코드를 비용 최적화하는 데 도움이 될 수 있습니다.

  • 개발 시간 단축: 디자인 패턴은 일반적인 디자인 문제에 대한 검증된 솔루션을 제공하여 개발 시간을 절약할 수 있습니다. 설정된 패턴을 따르면 개발자는 반복적인 작업을 방지하고 애플리케이션의 특정 요구 사항을 구현하는 데 집중할 수 있습니다.

  • 향상된 유지 관리 기능: 디자인 패턴은 더 쉽게 이해하고 수정하고 유지 관리할 수 있는 모듈식 및 구조화된 코드를 촉진합니다. 디버깅 및 유지 관리 작업 감소 측면에서 비용을 절감할 수 있습니다.

  • 확장성 및 성능: 디자인 패턴은 확장 가능하고 성능이 뛰어난 시스템을 설계하는 데 도움이 됩니다. Cache-Aside 패턴과 같은 패턴은 자주 액세스하는 데이터를 캐싱하여 값비싼 계산 또는 외부 호출의 필요성을 줄여 성능을 향상시킬 수 있습니다.

디자인 패턴을 구현하려면 개발자가 각 패턴의 원칙과 지침을 이해하고 코드에 적용해야 합니다. 문제에 적합한 패턴을 식별하고, 해당 구조와 구성 요소를 이해하고, 패턴을 전체 디자인에 통합하는 것이 좋습니다.

설명서, 자습서 및 샘플 코드와 같은 다양한 리소스를 사용할 수 있습니다. 이러한 리소스는 개발자가 디자인 패턴을 효과적으로 학습하고 구현하는 데 도움이 될 수 있습니다.

구성 변경

워크로드 구성을 정기적으로 검토하고 업데이트하여 현재 요구 사항에 부합하는지 확인합니다. 워크로드 요구에 따라 리소스 크기 조정 및 구성 설정을 조정하는 것이 좋습니다. 구성을 최적화하면 리소스를 효과적으로 할당하고 오버프로비전을 방지하여 비용을 절감할 수 있습니다.

아키텍처 리팩터링

워크로드 아키텍처를 평가하고 리소스 소비를 최적화하기 위해 구성 요소를 리팩터링하거나 다시 디자인할 기회를 식별합니다. 마이크로 서비스 아키텍처 채택, 회로 차단기 패턴 구현 및 서버리스 컴퓨팅 사용과 같은 기술을 고려합니다. 아키텍처를 최적화하면 리소스 사용률과 비용 효율성을 높일 수 있습니다.

리소스 크기 수정

워크로드의 리소스 사용률을 지속적으로 모니터링하고 분석합니다. 관찰된 패턴 및 추세에 따라 리소스 크기 조정 및 구성 설정을 조정하여 리소스 소비를 최적화합니다.

가상 머신의 권한을 부여하고, 메모리 할당을 조정하고, 스토리지 용량을 최적화하는 것이 좋습니다. 리소스의 권한을 부여하면 사용 부족 또는 과잉 프로비전과 관련된 불필요한 비용을 방지할 수 있습니다.

절충: 코드 및 아키텍처를 재작업하는 것은 현재 프로젝트 일정에 맞지 않을 수 있으며 일정 및 비용 미끄러짐으로 이어질 수 있습니다.

Azure 촉진

계측 코드: Azure는 Azure Monitor, Application InsightsLog Analytics와 같은 모니터링 및 로깅 도구를 제공합니다. 이러한 도구를 사용하여 코드의 성능과 동작을 실시간으로 추적하고 분석할 수 있습니다.

핫 경로 식별 및 최적화: Application Insights 및 Application Insights Profiler는 실행 시간과 리소스 사용량을 분석하여 코드의 핫 경로를 식별하고 최적화하는 데 도움이 됩니다. 프로파일러를 사용하여 불필요한 메모리 할당을 최소화하고 메모리 사용량을 최적화할 수 있습니다.

올바른 SDK 사용: Azure는 성능 및 사용 편의성을 위해 최적화된 여러 프로그래밍 언어로 SDK 를 제공합니다. 이러한 SDK는 사용자 지정 구현의 필요성을 줄이기 위해 Azure 서비스와 상호 작용하는 미리 빌드된 함수 및 라이브러리를 제공합니다.

네트워크 순회 최적화: 다양한 Azure 서비스는 서비스와 애플리케이션 간의 효율적인 통신을 위해 HTTP/2QUIC 와 같은 고속 네트워크 프로토콜을 지원합니다.

Azure Database for PostgreSQL - 유연한 서버와 같은 Azure 서비스는 연결 풀링을 지원합니다.

Azure는 다양한 서비스에서 일괄 처리를 지원하므로 여러 작업을 함께 그룹화하고 단일 요청에서 실행할 수 있습니다. 일괄 처리는 효율성을 크게 개선하고 네트워크 오버헤드를 줄일 수 있습니다.

데이터 serialization과 관련하여 Azure는 JSON 및 XML을 비롯한 다양한 serialization 형식을 지원합니다. 데이터 크기, 성능 요구 사항 및 상호 운용성 요구 사항에 따라 적절한 serialization 형식을 선택합니다.

데이터 액세스 최적화: Azure는 Azure Cache for Redis 같은 캐싱 서비스를 제공합니다. 캐싱을 사용하여 자주 액세스하는 데이터를 애플리케이션에 더 가깝게 저장할 수 있으므로 검색 속도가 빨라지고 백 엔드 로드가 줄어듭니다.

  • 인덱싱 및 쿼리 최적화:Azure SQL DatabaseAzure Cosmos DB와 같은 Azure 서비스는 쿼리 성능을 최적화하는 인덱싱 기능을 제공합니다. 올바른 인덱싱 전략을 선택하고 쿼리를 최적화하면 데이터 검색의 전반적인 효율성을 향상시킬 수 있습니다.

  • ORM(개체 관계형 매핑): Azure는 Entity Framework와 같은 ORM 프레임워크를 지원합니다. 이러한 프레임워크는 개체 지향 코드와 관계형 또는 NoSQL 데이터베이스 간의 데이터 액세스 및 매핑을 간소화합니다.

  • 저장 프로시저 최적화:Azure SQL Database와 같은 Azure 서비스를 사용하여 저장 프로시저를 만들고 최적화할 수 있습니다. 저장 프로시저는 네트워크 왕복을 줄이고 SQL 문을 미리 컴파일하여 성능을 향상시킬 수 있습니다.

  • 분할 및 분할: Azure는 Azure Cosmos DBAzure SQL Database와 같은 서비스에서 분할 및 분할 기능을 제공합니다. 분할을 사용하여 확장성 및 성능 최적화를 위해 여러 노드에 데이터를 분산할 수 있습니다.

  • 데이터 압축: Azure 서비스는 GZIP 및 DEFLATE와 같은 데이터 압축 기술을 지원합니다.

아키텍처 최적화: Azure는 확장 가능하고 복원력이 뛰어나며 성능이 뛰어난 애플리케이션을 디자인하기 위한 아키텍처 지침 및 디자인 패턴을 제공합니다. 자세한 내용은 디자인 패턴을 참조하세요.

비용 최적화 검사 목록

전체 권장 사항 집합을 참조하세요.