성능 효율성
조직의 최근 제품 발표 사항 중 하나에 대한 뉴스 기사가 방금 게시되었다고 가정해 보겠습니다. 뉴스 기사의 추가 홍보로 인해 웹 사이트의 트래픽이 크게 늘어납니다. 웹 사이트에서 이 트래픽 증가를 처리할 수 있나요? 사이트가 느려지거나 응답하지 않는 일 없이 추가 부하를 받을 수 있나요?
이 단원에서는 뛰어난 애플리케이션 성능을 보장하는 몇 가지 기본 원칙을 살펴봅니다. 특히 크기 조정 및 최적화 원칙이 성능 효율성의 핵심을 이룹니다.
성능 효율성이란 무엇인가요?
성능 효율성이란 애플리케이션에 사용할 수 있는 리소스를 애플리케이션이 수신하는 요구와 일치시키는 것을 말합니다. 성능 효율성에는 리소스 크기 조정, 잠재적인 병목 상태 구분 및 최적화, 최고 성능에 대한 애플리케이션 코드 최적화가 포함됩니다.
애플리케이션의 성능과 확장성을 향상시킬 수 있는 일부 패턴 및 사례를 살펴보겠습니다.
강화 및 확장
두 가지 방법으로 리소스 컴퓨팅의 크기를 조정할 수 있습니다.
강화는 단일 인스턴스에 더 많은 리소스를 추가하는 것입니다. 이를 수직 스케일링이라고도 합니다.
확장은 더 많은 인스턴스를 추가하는 것입니다. 이를 수평 스케일링이라고도 합니다.
스케일 업은 단일 인스턴스에 CPU 또는 메모리 같은 더 많은 리소스를 추가하는 것과 관련이 있습니다. 이 인스턴스는 가상 머신 또는 PaaS 서비스일 수 있습니다.
인스턴스에 더 많은 용량을 추가하는 것은 애플리케이션에서 사용할 수 있는 리소스를 증가시키지만, 추가할 수 있는 용량에는 한계가 있습니다. 가상 머신은 실행하는 호스트의 용량으로 제한되며, 자체 호스트에는 물리적 제한이 있습니다. 마침내는 인스턴스를 스케일 업할 때 이러한 제한에 부딪히게 됩니다. 인스턴스에 더 많은 리소스를 추가하는 데에는 제약이 있습니다.
스케일 아웃은 서비스에 더 많은 인스턴스를 추가하는 것과 관련이 있습니다. 이러한 인스턴스는 가상 머신 또는 PaaS 서비스일 수 있습니다. 확장은 단일 인스턴스를 더 강력하게 만들어 더 많은 용량을 추가하는 대신 총 인스턴스 수를 늘려 용량을 추가하는 작업입니다.
확장의 이점은 아키텍처에 더 많은 머신을 추가할 경우 영구적으로 확장할 수 있다는 점입니다. 확장하려면 어떤 식으로든 부하를 분산해야 합니다. 사용 가능한 서버에 요청을 분산하는 부하 분산 장치이거나, 요청을 보내는 활성 서버를 식별하기 위한 서비스 검색 메커니즘을 예로 들 수 있습니다.
두 크기 조정 방법 모두 리소스를 절감하여 비용을 최적화하는 데 도움이 됩니다.
자동 크기 조정은 성능 요구 사항에 맞게 리소스를 동적으로 할당하는 프로세스입니다. 작업 용량이 증가하면 원하는 성능 수준을 유지하고 SLA(서비스 수준 계약)를 충족하기 위해 애플리케이션에 추가 리소스가 필요할 수 있습니다. 수요가 감소하고 추가 리소스가 더 이상 필요하지 않으면 비용을 최소화하기 위해 할당을 취소할 수 있습니다.
자동 크기 조정은 관리 부담을 완화하면서 클라우드에 호스트된 환경의 탄력성을 활용합니다. 이렇게 하면 운영자가 시스템 성능을 지속적으로 모니터링하고 리소스 추가 또는 제거를 결정할 필요가 줄어듭니다.
네트워크 성능 최적화
성능을 최적화하는 경우 네트워크 및 스토리지 성능을 확인하여 해당 수준이 수용 가능한 한도 내에 있는지 확인합니다. 이러한 성능 수준이 애플리케이션의 응답 시간에 영향을 줄 수 있습니다. 아키텍처에 대한 올바른 네트워킹 및 스토리지 기술을 선택하면 소비자에게 최상의 환경을 제공하도록 보장하는 데 도움이 됩니다.
서비스 간에 메시징 계층을 추가하면 성능 및 확장성에 이점이 될 수 있습니다. 메시징 계층을 추가하면 버퍼가 생성되므로 수신 애플리케이션이 요청을 감당할 수 없는 경우에도 요청은 오류 없이 계속해서 유입됩니다. 애플리케이션은 요청을 통해 작동하므로 수신된 순서에 따라 요청에 응답할 수 있습니다.
스토리지 성능 최적화
대부분의 대규모 솔루션은 데이터를 개별적으로 관리하고 액세스할 수 있는 별도의 파티션으로 나눕니다. 분할 전략은 부정적인 영향을 최소화하고 이점을 극대화하도록 신중하게 선택해야 합니다. 분할을 통해 확장성을 향상시키고 경합을 줄여 성능을 최적화할 수 있습니다.
아키텍처에서 캐싱을 사용하면 성능을 향상할 수 있습니다. 캐싱은 빠른 검색을 위해 자주 사용되는 데이터 또는 자산(웹 페이지, 이미지)을 저장하는 메커니즘입니다. 애플리케이션의 다른 계층에 캐싱을 사용할 수 있습니다. 애플리케이션 서버 및 데이터베이스 간에 캐싱을 사용하여 데이터 검색 시간을 줄일 수 있습니다.
또한 정적 콘텐츠를 사용자에게 더 가깝게 배치하여 사용자 및 웹 서버 사이에 캐싱을 사용할 수도 있습니다. 이러한 유형의 캐싱은 사용자에게 웹 페이지를 반환하는 데 걸리는 시간을 줄입니다. 이 캐싱은 또한 데이터베이스나 웹 서버에서 요청을 오프로드하는 부차적인 영향을 미쳐 다른 요청에 대한 성능을 향상시킵니다.
애플리케이션에서 성능 병목 상태 식별
클라우드에서 실행되는 분산 애플리케이션 및 서비스는 움직이는 부분이 많은 복잡한 소프트웨어입니다. 프로덕션 환경에서는 사용자가 시스템을 활용하는 방식을 추적할 수 있어야 합니다. 또한 리소스 사용률을 추적하고 일반적은 시스템의 상태와 성능을 모니터링하는 것도 중요합니다. 이 정보를 진단 도구로 사용하여 문제를 검색하고 수정할 수 있습니다. 또한 이 정보를 사용하면 잠재적인 문제를 파악하고 발생을 방지하는 데에도 도움이 될 수 있습니다.
성능 최적화에는 애플리케이션 자체가 작동하는 방법을 이해하는 것도 포함됩니다. 오류, 잘못 수행된 코드 및 종속 시스템의 병목 현상은 애플리케이션 성능 관리 도구를 통해 모두 파악할 수 있습니다. 대개 이러한 문제는 사용자, 개발자 및 관리자에게 숨기거나 가려질 수 있지만 애플리케이션의 전반적인 성능에 부정적인 영향을 미칠 수 있습니다.
애플리케이션의 모든 계층을 살펴보고, 성능 병목 상태를 파악해 수정해야 합니다. 이러한 병목 상태로 인해 애플리케이션에서 또는 데이터베이스에 인덱스를 추가하는 과정에서 메모리가 잘못 처리될 수 있습니다. 병목 상태 수정은 하나의 병목 상태를 완화한 다음, 인식하지 못한 다른 병목 상태를 발견하게 되는 반복적인 프로세스가 될 수 있습니다.
성능 모니터링에 대한 철저한 접근법을 사용하여 아키텍처에서 활용할 수 있는 패턴 및 사례 형식을 결정할 수 있습니다.