코드 및 인프라 최적화를 위한 권장 사항
이 Azure Well-Architected Framework 성능 효율성 검사 목록 권장 사항에 적용됩니다.
PE:07 | 코드 및 인프라를 최적화합니다. 성능이 좋은 코드를 사용하고 책임을 플랫폼에 오프로드하는지 확인합니다. 코드 및 인프라는 핵심 용도로만 사용하고 필요한 경우에만 사용합니다. |
---|
이 가이드에서는 코드 및 인프라 성능을 최적화하기 위한 권장 사항을 설명합니다. 코드 및 인프라를 최적화하려면 구성 요소를 핵심 용도로만 사용해야 하며 필요한 경우에만 사용해야 합니다. 코드 및 인프라를 과도하게 사용하면 불필요한 리소스 소비, 병목 현상 및 느린 응답이 생성됩니다. 이러한 비효율성을 보완하려면 동일한 작업을 수행하기 위해 더 많은 리소스를 추가해야 합니다.
정의
용어 | 정의 |
---|---|
동시성 | 여러 작업 또는 프로세스가 한 번에 수행되지만 정확히 동시에 수행되는 것은 아닙니다. |
CPU 아키텍처 | 컴퓨터 작동 방식에 영향을 주는 구성 요소 및 원칙입니다. |
데이터 압축 | 중복 데이터를 최소화하여 파일 크기를 줄이는 작업입니다. |
힙 | 런타임 메모리 할당에 사용되는 메모리 영역입니다. |
메모리 누수 | 메모리가 더 이상 필요하지 않은 후 워크로드가 할당된 메모리를 해제하지 못하는 경우 |
병렬 처리 | 여러 작업 또는 프로세스가 동시에 수행되는 경우 |
주요 디자인 전략
코드 및 인프라를 최적화하려면 코드와 지원 인프라를 미세 조정하여 성능 효율성을 개선해야 합니다. 작업을 신속하게 실행하고 리소스를 낭비하지 않는 성능 코드가 필요합니다. 불필요한 복잡성을 방지하기 위해 간소화된 잘 설계된 인프라가 필요합니다. 워크로드는 플랫폼의 고유한 기능을 사용해야 합니다. 코드와 인프라가 주로 핵심 용도로 그리고 필요한 경우에만 사용되는지 확인하는 데 도움이 되는 접근 방식입니다.
코드 성능 최적화
코드 성능을 최적화하려면 코드를 수정하여 리소스 사용량을 줄이고 런타임을 최소화하며 성능을 향상시킵니다. 코드를 수정하여 소프트웨어 프로그램의 효율성과 속도를 향상시킬 수 있습니다. 무차별 암호 대입으로 성능 문제를 마스킹하지 마세요. 무차별 암호 대입은 소스 주소를 지정하는 대신 추가 용량을 추가하는 것과 같은 코드 성능을 보완하기 위해 컴퓨팅 리소스를 추가하는 것을 의미합니다. 최적화와 관련된 성능 문제를 해결해야 합니다. 코드 성능을 최적화하면 시스템 리소스의 사용률을 최대화하고, 응답 시간을 개선하고, 대기 시간을 줄이고, 사용자 환경을 향상시키는 데 도움이 됩니다.
코드 계측
코드 계측은 런타임 중에 데이터를 수집하고 코드 성능을 모니터링하는 코드 조각 또는 라이브러리를 코드에 추가하는 방법을 나타냅니다. 코드 계측을 사용하면 개발자가 리소스 사용량(CPU, 메모리 사용량) 및 실행 시간과 같은 주요 메트릭에 대한 정보를 수집할 수 있습니다. 개발자는 코드를 계측하여 코드 핫 경로에 대한 인사이트를 얻고, 성능 병목 상태를 식별하고, 더 나은 성능 효율성을 위해 코드를 최적화할 수 있습니다.
이상적인 환경에서는 소프트웨어 개발 수명 주기 초기에 코드 분석을 수행해야 합니다. 코드 문제를 더 일찍 catch할수록 문제를 해결하는 것이 더 저렴합니다. 이 코드 분석을 최대한 자동화하려고 합니다. 동적 및 정적 코드 분석 도구를 사용하여 수동 작업을 줄입니다. 그러나 이 테스트는 여전히 프로덕션 시뮬레이션입니다. 프로덕션은 코드 최적화에 대한 명확한 이해를 제공합니다.
절충: 코드 모니터링 도구는 비용을 증가시킬 수 있습니다.
핫 경로 식별
코드를 계측하여 다양한 코드 경로에 대한 리소스 사용량을 측정할 수 있습니다. 이러한 측정은 핫 경로를 식별하는 데 도움이 됩니다. 핫 경로는 성능 및 리소스 사용량에 상당한 영향을 줍니다. 높은 성능과 짧은 대기 시간이 필요한 프로그램의 중요하거나 자주 실행되는 섹션입니다. 코드 핫 경로를 식별하려면 다음 단계를 고려합니다.
런타임 데이터 분석: 런타임 데이터를 수집하고 분석하여 CPU, 메모리 또는 I/O 작업과 같은 중요한 리소스를 사용하는 코드 영역을 식별합니다. 자주 실행되거나 완료하는 데 시간이 오래 걸리는 코드의 패턴 또는 섹션을 찾습니다.
성능 측정: 프로파일링 도구 또는 성능 테스트 프레임워크를 사용하여 다양한 코드 경로의 실행 시간과 리소스 사용량을 측정합니다. 이를 통해 병목 상태 및 개선 영역을 식별할 수 있습니다.
비즈니스 논리 및 사용자 효과 고려: 애플리케이션의 기능 또는 중요한 비즈니스 운영에 대한 관련성에 따라 다양한 코드 경로의 중요성을 평가합니다. 사용자에게 가치를 제공하거나 성능 요구 사항을 충족하는 데 중요한 코드 경로를 결정합니다.
코드 논리 최적화
코드 논리 최적화는 리소스가 적은 작업을 수행하도록 코드의 구조와 디자인을 구체화하는 것입니다. 향상된 논리는 불필요한 작업을 줄입니다. 리소스 소비를 줄이면 실행 속도가 빨라집니다. 성능에 영향을 줄 수 있는 코드 경로 내에서 불필요한 작업을 제거해야 합니다. 가장 큰 성능 효율성 향상을 확인하려면 핫 경로 최적화의 우선 순위를 지정합니다. 코드 논리를 최적화하려면 다음 전략을 고려합니다.
불필요한 함수 호출 제거: 코드를 검토하고 원하는 기능에 필수적이지 않고 성능에 부정적인 영향을 줄 수 있는 함수를 식별합니다. 예를 들어 함수 호출이 코드의 앞부분에서 완료된 유효성 검사를 수행하는 경우 불필요한 유효성 검사 함수 호출을 제거할 수 있습니다.
로깅 작업 최소화: 로깅은 디버깅 및 분석에 유용할 수 있지만 과도한 로깅은 성능에 영향을 줄 수 있습니다. 각 로깅 작업의 필요성을 평가하고 성능 분석에 중요하지 않은 불필요한 로깅 호출을 제거합니다.
루프 및 조건부 최적화: 코드에서 루프 및 조건부를 분석하고 제거할 수 있는 불필요한 반복 또는 조건을 식별합니다. 이러한 구조를 단순화하고 최적화하면 코드의 성능이 향상될 수 있습니다. 루프 내에서 함수 호출을 최소화하고 중복 계산을 제거합니다. 루프 외부에서 계산을 이동하거나 루프 언롤링을 사용하는 것이 좋습니다.
불필요한 데이터 처리 줄이기: 중복 계산 또는 변환과 같은 불필요한 데이터 처리 작업에 대한 코드를 검토합니다. 이러한 불필요한 작업을 제거하여 코드의 효율성을 개선합니다.
데이터 구조를 최적화합니다. 데이터를 효율적으로 저장하고 검색하려면 배열, 연결된 목록, 트리 및 해시 테이블과 같은 적절한 데이터 구조를 선택합니다. 특정 문제에 가장 적합한 데이터 구조를 선택합니다. 적합한 데이터 구조는 애플리케이션 성능을 향상시킵니다.
네트워크 요청 최소화: 코드에서 네트워크 요청을 수행하는 경우 요청 수를 최소화하고 사용량을 최적화합니다. 가능하면 요청을 일괄 처리하고 불필요한 왕복을 방지하여 성능을 향상시킵니다.
할당 최소화: 과도한 메모리 할당이 발생하는 영역을 식별합니다. 불필요한 할당을 줄이고 가능하면 기존 리소스를 다시 사용하여 코드를 최적화합니다. 할당을 최소화하면 메모리 효율성과 전반적인 성능을 향상시킬 수 있습니다. 프로그래밍 언어에 적절한 메모리 관리 및 가비지 수집 전략을 사용합니다.
데이터 구조 크기 줄이기: 클래스와 같은 데이터 구조의 크기를 평가하고 감소가 가능한 영역을 식별합니다. 데이터 요구 사항을 검토하고 불필요한 필드 또는 속성을 제거합니다. 적절한 데이터 형식을 선택하고 데이터를 효율적으로 압축하여 메모리 사용량을 최적화합니다.
성능 최적화 SDK 및 라이브러리를 사용합니다. 네이티브 SDK 또는 성능 최적화 라이브러리를 사용합니다. 네이티브 SDK는 플랫폼 또는 프레임워크 내에서 서비스 및 리소스와 상호 작용하도록 설계되었습니다. 예를 들어 클라우드 네이티브 SDK는 사용자 지정 API 액세스보다 클라우드 서비스 데이터 평면에서 더 잘 작동합니다. SDK는 네트워크 요청을 처리하고 상호 작용을 최적화하는 데 탁월합니다. Math.NET 같은 성능 최적화 라이브러리에는 성능 최적화 함수가 포함되어 있습니다. 함수를 적절하게 적용하면 워크로드의 성능을 향상시킬 수 있습니다.
교차 절단 구현: 미들웨어 또는 토큰 검사와 같은 교차 절단 구현의 영향을 고려하고 성능에 부정적인 영향을 미치는지 여부를 평가합니다.
작업 중인 프로그래밍 언어와 관련된 성능 권장 사항을 검토합니다. 이러한 권장 사항에 대해 코드를 평가하여 개선 영역을 식별합니다.
절충:
- 코드 및 핫 경로를 최적화하려면 코드 비효율성을 식별하는 데 개발자의 전문 지식이 필요하며 주관적이며 다른 작업에는 고도로 숙련된 개인이 필요할 수 있습니다.
- SDK는 편의성을 제공하고 API와 상호 작용하는 복잡성을 제거합니다. 그러나 SDK는 사용자 지정 코드에 대한 제어 및 사용자 지정 옵션을 제한할 수 있습니다.
메모리 관리 최적화
메모리 관리 최적화에는 워크로드가 메모리 리소스를 사용, 할당 및 해제하여 효율성을 개선하는 방법을 구체화하는 작업이 포함됩니다. 적절한 메모리 관리는 메모리 작업의 오버헤드를 줄이기 때문에 코드 성능을 향상시킵니다. 효율적인 메모리 사용은 대기 시간을 줄이고 시스템 속도 저하 또는 충돌을 방지하며 계산 작업의 처리량을 최대화합니다. 메모리 관리를 최적화하려면 다음 전략을 고려하세요.
메모리 문제를 디버그합니다. 메모리 덤프는 애플리케이션 메모리 스냅샷입니다. 특정 시점에 애플리케이션의 메모리 상태를 캡처합니다. 메모리 덤프를 사용하면 메모리 관련 문제를 회고적으로 분석할 수 있습니다. 진단하려는 문제의 특성과 사용 가능한 리소스에 따라 적절한 유형의 메모리 덤프를 선택합니다. 복잡한 중요한 문제에는 일상적인 디버깅 및 전체 덤프에 미니어처 덤프를 사용해야 합니다. 이 전략은 리소스 사용량과 진단 기능 간의 균형을 제공합니다. 많은 코드 호스팅 서비스는 메모리 디버깅을 지원합니다. 그렇지 않은 서비스보다 메모리 분석을 지원하는 서비스를 선호해야 합니다. 다음은 메모리 문제를 디버깅하는 기본 단계입니다.
메모리 덤프 캡처: 먼저 애플리케이션의 런타임 동안 메모리 덤프를 캡처하는 메커니즘을 설정합니다. 캡처는 수동으로, 자동으로 또는 특정 조건(예: 과도한 메모리 사용량)이 충족될 때 트리거될 수 있습니다. 일부 클라우드 서비스는 이미 이 프로세스를 제공할 수 있습니다.
메모리 덤프 분석: 메모리 덤프를 수집한 후 분석합니다. Windows 애플리케이션용 WinDbg 또는 Unix 기반 시스템용 GDB와 같은 다양한 도구를 사용하여 이러한 덤프를 검사할 수 있습니다.
메모리 누수 식별: 분석 중에 메모리 누수 식별에 집중합니다. 메모리 누수는 애플리케이션이 메모리를 할당하지만 메모리가 더 이상 필요하지 않을 때 해제하지 못할 때 발생합니다. 할당을 취소해야 하는 경우에도 메모리에 남아 있는 개체 또는 데이터 구조를 검색합니다.
수정 및 테스트: 문제가 있는 코드를 식별할 때 메모리 문제 해결에 집중합니다. 해결 방법에는 메모리를 올바르게 해제하거나, 데이터 구조를 최적화하거나, 메모리 관리 사례를 재평가하는 작업이 포함될 수 있습니다. 솔루션이 그 효능을 보장하기 위해 엄격한 테스트를 거치는지 확인합니다.
반복 및 모니터링: 메모리 관리는 연속 프로세스입니다. 애플리케이션의 메모리 사용량을 정기적으로 모니터링하고 프로덕션 환경에서 메모리 덤프를 수집할 수 있습니다. 분석 및 최적화 단계를 정기적으로 다시 검토하여 후속 코드 수정으로 메모리 문제가 다시 나타나지 않도록 합니다.
메모리 덤프 분석을 소프트웨어 개발 수명 주기에 통합하면 애플리케이션의 안정성과 효율성을 증폭할 수 있습니다. 프로덕션 환경에서 메모리 관련 문제의 가능성을 줄이는 데 도움이 됩니다.
메모리 할당을 줄입니다. 메모리 할당을 최소화하여 코드의 전체 메모리 공간을 줄입니다. 워크로드는 사용 가능한 메모리를 효율적으로 활용할 수 있습니다. 가비지 수집기가 사용되지 않는 메모리를 회수할 필요가 적고 가비지 수집 주기의 빈도와 기간을 줄입니다. 메모리 할당은 특히 자주 수행하는 경우 비용이 많이 들 수 있습니다. 코드를 빠르고 효율적으로 실행할 수 있도록 메모리 할당을 최소화합니다.
캐시는 프로세서 가까이에 자주 액세스되는 데이터를 저장하므로 성능이 향상됩니다. 메모리 할당을 최소화하면 캐시 공간에 대한 경합이 줄어들므로 캐시를 효과적으로 활용할 수 있습니다. 메모리 할당 수가 많을 경우 애플리케이션 성능이 저하되고 오류가 발생할 수 있습니다. 메모리 할당을 최소화하는 다른 방법은 다음과 같습니다.
지역 변수: 전역 변수 대신 지역 변수를 사용하여 메모리 소비를 최소화합니다.
지연 초기화: 지연 초기화를 구현하여 필요할 때까지 개체 또는 리소스 만들기를 연기합니다.
버퍼: 큰 메모리 버퍼를 할당하지 않도록 버퍼를 효과적으로 관리합니다.
개체 풀링: 개체 풀링을 할당 및 할당 취소하는 대신 큰 개체를 다시 사용하는 것이 좋습니다.
자세한 내용은 메모리 할당 감소 및 Windows 시스템의 큰 개체 힙을 참조하세요.
동시성 및 병렬 처리 사용
동시성 및 병렬 처리를 사용하려면 여러 작업 또는 프로세스를 동시에 실행하거나 겹치는 방식으로 실행하여 컴퓨팅 리소스를 효율적으로 사용해야 합니다. 이러한 기술은 전체 처리량과 워크로드에서 처리할 수 있는 작업 수를 증가합니다. 작업을 동시에 또는 병렬로 실행할 때 애플리케이션의 런타임을 줄이고 대기 시간을 줄이고 응답 시간을 늘립니다. 동시성 및 병렬 처리를 사용하면 CPU 코어 또는 분산 시스템과 같은 컴퓨팅 리소스를 효율적으로 활용할 수 있습니다. 동시성 및 병렬 처리는 컴퓨팅 리소스 간에 워크로드를 효과적으로 분산합니다.
병렬 처리를 사용합니다. 병렬 처리는 여러 컴퓨팅 리소스에서 여러 작업 또는 프로세스를 동시에 트리거하는 시스템의 기능입니다. 병렬 처리는 워크로드를 병렬로 실행되는 더 작은 작업으로 나눕니다. 다중 처리 또는 분산 컴퓨팅과 같은 기술을 사용하여 병렬 처리를 달성할 수 있습니다. 작업을 다중 코어 프로세서에 분산하여 워크로드 관리를 최적화합니다. CPU 아키텍처, 스레딩 모델 및 멀티 코어 프로세서를 활용하도록 코드를 최적화합니다. 코드를 병렬로 실행하면 워크로드가 여러 코어에 분산되므로 성능이 향상됩니다.
동시성을 사용합니다. 동시성은 시스템에서 여러 작업 또는 프로세스를 실행하는 기능입니다. 동시성을 사용하면 프로그램의 여러 부분이 독립적으로 진행되어 전반적인 성능을 향상시킬 수 있습니다. 여러 스레드가 단일 프로세스 내에서 동시에 실행되는 다중 스레딩과 같은 기술을 사용하여 동시성을 구현할 수 있습니다. 작업이 동시에 트리거되는 비동기 프로그래밍을 사용할 수도 있습니다.
비동기 프로그래밍: 비동기 프로그래밍은 기본 스레드를 차단하지 않고 작업을 트리거하는 방법입니다. 비동기 프로그래밍을 사용하면 프로그램이 장기 실행 작업이 완료되기를 기다리는 동안 작업을 트리거할 수 있습니다. 비동기 프로그래밍을 사용하면 프로그램에서 여러 작업을 시작하고 비동기적으로 완료되기를 기다릴 수 있습니다. 프로그램은 다음 작업으로 이동하기 전에 각 작업이 완료되기를 기다릴 필요가 없습니다.
프로그래밍 언어 및 플랫폼에 따라 많은 비동기 프로그래밍 기술과 패턴이 있습니다. 한 가지 일반적인 방법은 C#과 같은 언어에서 및 와 같은
async
비동기 키워드 및await
구문을 사용하는 것입니다. 이러한 키워드를 사용하여 비동기 메서드를 정의할 수 있습니다. HTTP 트래픽의 경우 비동기 Request-Reply 패턴을 사용하는 것이 좋습니다.많은 프레임워크 및 라이브러리는 비동기 프로그래밍을 기본적으로 지원합니다. 예를 들어 .NET 플랫폼에서 작업 기반 비동기 패턴 및 이벤트 기반 비동기 패턴과 같은 패턴을 사용하여 비동기 작업을 구현할 수 있습니다. 비동기 프로그래밍의 특정 구현은 애플리케이션의 프로그래밍 언어, 플랫폼 및 요구 사항에 따라 달라집니다.
큐: 큐는 요청 구성 요소(생산자)와 워크로드의 처리 구성 요소(소비자) 사이에 있는 스토리지 버퍼입니다. 단일 큐에 대해 여러 소비자가 있을 수 있습니다. 작업이 증가함에 따라 수요에 맞게 소비자를 확장해야 합니다. 생산자는 작업을 큐에 배치합니다. 큐는 소비자가 용량을 하게 될 때까지 작업을 저장합니다. 큐는 수요가 가장 많은 처리 서비스에 작업을 전달하는 가장 좋은 방법입니다. 자세한 내용은 큐 기반 부하 평준화 패턴 및 스토리지 큐 및 Service Bus 큐를 참조하세요.
연결 풀링 사용
연결 풀링 은 모든 요청에 대해 새 연결을 만드는 대신 설정된 데이터베이스 연결 다시 사용하는 방법입니다. 데이터베이스에 대한 연결을 설정하는 데 비용이 많이 들 수 있습니다. 원격 데이터베이스 서버에 대한 인증된 네트워크 연결을 만들어야 합니다. 데이터베이스 연결은 새 연결을 자주 여는 애플리케이션에 특히 비용이 많이 듭니다. 연결 풀링에서는 기존 연결을 재사용하고 각 요청에 대해 새 연결을 여는 비용을 제거합니다. 연결 풀링을 사용하면 연결 대기 시간을 줄이고 서버에서 높은 데이터베이스 처리량(초당 트랜잭션 수)을 사용할 수 있습니다. 현재보다 더 많은 연결을 처리할 수 있는 풀 크기를 선택해야 합니다. 목표는 연결 풀이 들어오는 새 요청을 신속하게 처리하도록 하는 것입니다.
연결 풀링 제한을 이해합니다. 일부 서비스는 네트워크 연결 수를 제한합니다. 이 제한을 초과하면 연결 속도가 느려지거나 종료될 수 있습니다. 연결 풀링을 사용하여 시작 시 고정된 연결 집합을 설정한 다음 해당 연결을 유지할 수 있습니다. 대부분의 경우 기본 풀 크기는 기본 테스트 시나리오에서 빠르게 수행되는 몇 가지 연결로만 구성될 수 있습니다. 애플리케이션은 규모에 따라 기본 풀 크기를 소진하고 병목 상태를 만들 수 있습니다. 각 애플리케이션 instance 지원되는 동시 트랜잭션 수에 매핑되는 풀 크기를 설정해야 합니다.
연결 풀을 테스트합니다. 각 데이터베이스 및 애플리케이션 플랫폼에는 풀 설정 및 사용에 대한 요구 사항이 약간 다릅니다. 연결 풀을 테스트하여 부하 상태에서 효율적으로 작동하는지 확인합니다.
위험: 연결 풀링으로 풀 조각화 가 만들어지고 성능이 저하될 수 있습니다.
백그라운드 작업 최적화
많은 애플리케이션에는 UI와 독립적으로 실행되는 백그라운드 작업이 필요합니다. 애플리케이션은 작업을 시작하고 사용자의 대화형 요청을 계속 처리할 수 있습니다. 백그라운드 작업의 예로는 일괄 처리 작업, 프로세서 집약적 작업 및 워크플로와 같은 장기 실행 프로세스가 있습니다. 백그라운드 작업은 애플리케이션을 차단하거나 시스템이 로드 중일 때 지연된 작업으로 인해 불일치를 일으키면 안 됩니다. 성능을 향상시키기 위해 백그라운드 작업을 호스트하는 컴퓨팅 인스턴스의 크기를 조정할 수 있습니다. 자세한 내용은 백그라운드 작업 및 크기 조정 및 성능 고려 사항을 참조하세요.
인프라 성능 최적화
인프라 성능을 최적화한다는 것은 최대 작업과 워크로드에 대한 리소스를 최대한 활용하도록 인프라 요소를 향상시키고 조정하는 것을 의미합니다. 인프라를 미세 조정하면 낭비를 최소화하고 지연 시간을 줄이며 사용 가능한 리소스를 통해 더 많은 것을 달성할 수 있습니다. 워크로드가 안정적이고 신속하게 실행되어 사용자 환경이 향상되고 비용이 절감됩니다. 인프라 성능을 최적화하려면 다음 전략을 고려하세요.
사용 제한을 추가합니다. 일부 워크로드 구성 요소에 대한 사용 제한을 구현할 수 있습니다. 예를 들어 불안정한 Pod를 제거하려면 AKS(Azure Kubernetes Service)에서 Pod CPU 및 메모리 제한을 정의할 수 있습니다. 성능을 최적화하기 위해 Java VM(가상 머신)에서 메모리 제한을 정의할 수 있습니다.
인프라를 간소화합니다. 워크로드를 간소화하여 상호 작용, 종속성 및 호환성 문제의 가능성을 줄입니다. 워크로드를 간소화하면 메모리, 처리 능력 및 스토리지의 리소스 사용률을 최적화합니다.
부하를 줄이십시오. 워크로드의 부하를 줄이려면 애플리케이션에 대한 수요를 최소화하고 리소스가 기본 작업을 수행할 수 있도록 합니다. 예를 들어 코드 내에서 또는 개별 컴퓨팅 인스턴스에서 보안 솔루션을 실행하지 않는 것이 일반적입니다. 대신 웹 서버는 HTTP 요청을 제공해야 합니다. 웹 애플리케이션 방화벽 및 게이트웨이 리소스는 보안 검사를 처리할 수 있습니다. 다음 전략은 워크로드의 부하를 줄이는 데 도움이 됩니다.
최종 일관성: 최종 일관성 모델을 채택하여 데이터를 약간 날짜가 지정되도록 하여 성능을 향상시킵니다. 최종 일관성은 지속적인 데이터 업데이트에 대한 CPU 주기 및 네트워크 대역폭에 대한 즉각적인 수요를 줄입니다.
태스크 위임: 검색 인덱스 및 캐시와 같은 클라이언트 또는 중간 사용자에게 서버 작업을 위임합니다. 데이터 정렬, 데이터 필터링 또는 뷰 렌더링과 같은 작업을 위임합니다. 이러한 작업을 오프로드하면 서버의 워크로드를 줄이고 성능을 향상시킵니다.
네트워크를 최적화합니다. 성능을 위해 워크로드 네트워크를 최적화하려면 네트워크 인프라를 구성하고 미세 조정합니다. 워크로드가 최고 수준의 효율성으로 작동할 수 있는지 확인합니다.
네트워크 프로토콜: HTTP/2와 같은 최신 프로토콜로 업그레이드하여 단일 연결을 통해 여러 요청을 보낼 수 있습니다. 최신 프로토콜은 새 연결 설정의 오버헤드를 줄입니다.
절충: 최신 프로토콜은 이전 클라이언트를 제외할 수 있습니다.
네트워크 대화: 요청 수를 줄이기 위해 네트워크 요청을 일괄 처리합니다. 여러 개의 작은 요청을 만드는 대신 더 큰 요청으로 결합하여 네트워크 오버헤드를 줄입니다.
데이터베이스 쿼리: 데이터베이스 쿼리가 필요한 정보만 검색하는지 확인합니다. 많은 양의 불필요한 데이터를 검색하지 않으면 네트워크 트래픽이 증가하고 성능이 저하될 수 있습니다.
정적 데이터: 콘텐츠 배달 네트워크를 활용하여 사용자와 가까운 자주 액세스하는 정적 콘텐츠를 캐시합니다. 데이터를 캐시할 때 장거리 이동이 필요하지 않습니다. 캐싱은 응답 시간을 개선하고 네트워크 트래픽을 줄입니다.
로그 수집: 요구 사항을 지원하는 데 필요한 로그 데이터만 수집하고 보존합니다. 데이터 수집 규칙을 구성하고 디자인 고려 사항을 구현하여 Log Analytics 비용을 최적화합니다.
데이터 압축: 클라이언트와 서버 간에 빠른 전송을 허용하도록 HTTP 콘텐츠 및 파일 데이터를 압축하고 번들로 묶습니다. 압축은 페이지 또는 API가 반환하는 데이터를 축소하고 브라우저 또는 클라이언트 앱으로 다시 보냅니다. 압축은 네트워크 트래픽을 최적화하여 애플리케이션 통신을 가속화할 수 있습니다.
절충: 압축은 서버 쪽 및 클라이언트 쪽 처리를 추가합니다. 애플리케이션은 데이터를 압축, 전송 및 압축 해제해야 합니다. 멀티캐스트 통신 또는 여러 수신자와의 통신은 압축 해제 오버헤드를 만들 수 있습니다. 데이터 압축을 구현하기 전과 후에 성능 변화를 테스트하고 측정하여 워크로드에 적합한지 확인해야 합니다. 자세한 내용은 ASP.NET Core의 응답 압축을 참조하세요.
Azure 촉진
계측 코드: Azure Monitor Application Insights는 애플리케이션 코드의 자동 계측(자동 침입) 및 수동 계측을 지원합니다. 자동 침입은 애플리케이션의 코드를 건드리지 않고 원격 분석 수집을 가능하게 합니다. 수동 계측에는 Application Insights 또는 OpenTelemetry API를 구현하기 위한 코드 변경이 필요합니다. Application Insights Profiler를 사용하여 핫 경로를 최적화할 수 있습니다.
코드 논리 최적화: Azure는 Azure 서비스와 상호 작용할 수 있는 다양한 프로그래밍 언어에 대한 SDK 및 라이브러리를 제공합니다. SDK를 사용하여 애플리케이션과 Azure 리소스 간의 상호 작용을 간소화합니다. SDK는 대기 시간을 줄이고 효율성을 향상시키는 Azure 서비스와의 최적의 상호 작용을 제공합니다.
메모리 관리 최적화: Application Insights의 스마트 검색 기능을 사용하여 메모리 사용량을 분석하고 메모리 누수 식별 및 해결에 도움을 줍니다.
Azure App Service 프로파일러 및 메모리 덤프 수집 및 분석 기능이 있습니다. App Service 자동 절전 기능은 .NET 및 Java 앱의 메모리 덤프 및 프로필 추적을 자동으로 수행할 수 있습니다.
동시성 및 병렬 처리 사용: 다른 Azure 서비스는 Azure Cosmos DB, Azure Functions 및 Blob Storage와 같은 동시성에 대한 고유한 지원을 제공합니다. 병렬 처리를 위해 서비스 AKS 는 병렬 처리를 개선하는 컨테이너화된 애플리케이션 배포를 지원합니다.
Azure Batch 인프라 설정 없이 병렬 및 고성능 컴퓨팅을 사용하도록 설정하는 데 사용할 수 있는 클라우드 기반 작업 예약 서비스입니다. 자세한 내용은 백그라운드 작업을 참조하세요.
인프라 성능 최적화: 코드를 사용하여 인프라를 정의하고 배포하는 Azure Resource Manager 템플릿을 구현합니다. 이러한 템플릿을 사용하여 효율적이고 반복 가능하며 일관된 리소스 배포를 구현합니다. Azure Policy 리소스 배포가 조직의 모범 사례 및 표준을 준수하도록 하는 거버넌스 기능을 제공합니다.
비동기 프로그래밍의 경우 Azure Queue Storage 및 Azure Service Bus 같은 확장 가능한 큐 서비스를 사용하여 비동기 프로그래밍을 용이하게 합니다. 작업을 큐에 대기하고 독립적으로 처리할 수 있습니다. 비동기 작업을 지원하기 위해 Azure Marketplace Azure 서비스와 통합할 수 있는 타사 큐 및 도구를 제공합니다.
관련 링크
- AKS
- Application Insights 스마트 검색 기능
- 비동기 요청-회신 패턴
- 메모리 할당 방지
- Azure Batch
- Azure Policy
- Azure 리소스 관리자 템플릿
- Azure SDK
- 백그라운드 작업
- 백그라운드 작업 크기 조정 및 성능 고려 사항
- 파일 데이터 압축
- HTTP 콘텐츠 압축
- Pod CPU 및 메모리 제한 정의
- 이벤트 기반 비동기 패턴
- Java VM(가상 머신)
- 대형 개체 힙
- 풀 조각화
- 큐 기반 부하 평준화 패턴
- ASP.NET Core의 응답 압축
- 스토리지 큐 및 Service Bus 큐
- 작업 기반 비동기 패턴
성능 효율성 검사 목록
전체 권장 사항 집합을 참조하세요.