What is performance?

Salvatore Sanfilippo

성능이란 무엇인가?

이 블로그 게시물의 제목은 겉보기에는 대답하기 쉬운 질문이지만, 성능이 실제로 무엇을 의미하는지 더 잘 고민해 볼 가치가 있습니다. 확장성과 성능을 혼동하기 쉽고, 데이터베이스 시스템의 특정 경우에 성능을 주요 구성 요소들로 분해하는 것은 사소한 일이 아닐 수 있습니다. 이 짧은 블로그 게시물에서 저는 데이터베이스 시스템의 맥락에서 성능이 무엇인지에 대한 현재 생각을 적어 보려고 합니다.

좋은 출발점은 아마도 제가 최근 Redis에 대한 강연에서 사용하는 첫 번째 슬라이드일 것입니다. 이 첫 번째 슬라이드는 실제로 성능에 관한 것이며, 성능은 주로 세 가지 다른 것으로 구성된다고 말합니다.

  1. 지연 시간: 쿼리에 대한 응답을 받는 데 필요한 시간.
  2. 코어당 단위 시간당 연산 수: 주어진 기준 연산 단위에서 시스템이 초당 얼마나 많은 쿼리(연산)에 응답할 수 있는가?
  3. 연산 품질: 그러한 연산이 얼마나 많은 작업을 수행할 수 있는가?

지연 시간

이것은 아마도 성능의 가장 단순한 구성 요소일 것입니다. 많은 애플리케이션에서 시스템으로부터 응답을 받는 데 필요한 시간이 짧은 것이 바람직합니다. 그러나 평균 시간이 중요하긴 하지만, 또 다른 관심사는 지연 시간 수치의 예측 가능성과 평균적인 경우와 최악의 경우 사이에 얼마나 차이가 있는지입니다. 잘 사용된다면 인메모리 시스템은 매우 좋은 지연 시간 특성을 제공할 수 있으며, 시간이 지나도 일관된 지연 시간을 제공할 수 있습니다.

코어당 초당 연산 수

제가 나열하고 있는 두 번째 구성 요소는 순수 성능과 확장성의 차이를 만드는 것입니다. 우리는 주어진 기준 연산 단위에서, 주어진 시간 단위 동안 시스템이 수행할 수 있는 작업의 양에 관심이 있습니다. 선형 확장이 가능한 시스템은 여러 노드를 사용하여 초당 많은 연산 수에 도달할 수 있지만, 이는 확장 가능하다는 것을 의미할 뿐 반드시 성능이 좋다는 것을 의미하지는 않습니다.

코어당 초당 연산 수는 또한 일반적으로 와트당 수행할 수 있는 쿼리 수, 즉 시스템의 에너지 효율성과도 관련이 있습니다.

연산 품질

마지막 항목은 개발자들 사이에서 처리량과 지연 시간만큼 강조되지는 않지만, 특정 종류의 시스템, 특히 인메모리 시스템에서 매우 중요합니다.

초당 100개의 연산을 수행할 수 있지만 연산 품질이 좋지 않은 시스템(예: Redis 기준으로 단지 GET과 SET만 있는 경우)은 동일한 지연 시간과 OPS 특성을 가지고 INCR 연산도 수행할 수 있는 시스템보다 성능이 낮습니다. 예를 들어, 처리해야 할 문제가 카운터를 증가시키는 것이라면, 전자의 시스템은 카운터를 증가시키기 위해 두 개의 연산이 필요하지만(이 맥락에서는 경쟁 조건을 고려하지 않습니다), INCR을 제공하는 시스템은 단일 연산을 사용할 수 있습니다. 결과적으로 실제로 전자 시스템의 두 배 성능을 제공할 수 있습니다.

보시다시피 연산 품질은 절대적인 척도가 아니라 해결해야 할 문제의 종류에 따라 달라집니다. HTML 조각을 캐시하려는 경우 동일한 두 시스템은 INCR 연산이 쓸모없기 때문에 동등합니다.

연산 품질은 특히 인메모리 시스템에서 중요합니다. 일반적으로 계산 자체는 명령을 수신하고, 디스패치하고, 응답을 만드는 데 필요한 시간에 비해 무시할 수 있기 때문에, Redis와 같이 풍부한 연산 집합을 가진 시스템은 사용자가 단일 연산으로 더 많은 작업을 할 수 있게 함으로써 많은 상황에서 거의 비용 없이 더 나은 성능을 제공할 수 있습니다. '더 많은 작업'은 실제로 많은 것을 의미할 수 있습니다. 예를 들어 Redis의 ZRANK 명령과 같이 더 복잡한 질문에 대한 응답을 제공하거나, HMGET 명령과 같이 해시 값을 구성하는 필드의 하위 집합에 대한 정보만 제공하여 서버와 클라이언트 간의 대역폭을 줄이는 더 선택적인 응답을 제공하는 것입니다.

일반적으로 연산 품질은 시스템이 수행할 수 있는 초당 연산 수에 더 많거나 적은 가치를 부여하기 때문에 성능에만 영향을 미치는 것이 아닙니다. 연산 품질은 또한 지연 시간에 직접적인 영향을 미칩니다. 더 복잡한 연산은 여러 개의 단순한 연산을 조합하여 더 복잡한 계산을 수행하는 데 필요한 클라이언트와 서버 간의 왕복 데이터 전송을 피할 수 있기 때문입니다.

결론

이 짧은 탐구를 통해 성능이 무엇인지, 그리고 이 특정 관점에서 데이터베이스 시스템의 역량을 평가하는 과정에 관련된 복잡성의 일부를 밝혀냈기를 바랍니다. 할 말은 훨씬 더 많지만, 위의 세 가지 성능 구성 요소는 시스템을 평가하고 기존 시스템을 발전시켜 성능 특성을 개선하는 방법을 이해할 때 가장 흥미롭고 중요한 요소 중 하나라고 생각합니다.

이 주제에 대한 피드백을 주신 Yiftach Shoolman님께 감사드립니다.

원문은 Salvatore Sanfilippo님이 에 게재했습니다.

이 글은 deepseek-v4-flash 모델을 사용해 번역했습니다.