왜 이렇게 빨리 레디 스를 단일 스레드?

사용 레디 스 데이터베이스는 C 언어로 작성된 KV 메모리, 단일 프로세스를 단일 스레드 모델을 기반으로합니다. 공식 데이터의 1000000+ QPS (초당 쿼리)를 얻을 수있다. 단일 데이터베이스 memcached를 메모리 기반 KV 마차도 스레드에 비해 동일한 프로세스 데이터.

레디 스이 좋은 성능을 가지고 왜 더 나은 대답하기 위해 이해, 우리는 다음과 같은 두 가지 질문에 답해야한다 :

  1. 레디 스 왜 그렇게 빨리?
  2. 이유는 단일 스레드 프로세스 모델을 선택 레디 스?

레디 스 왜 그렇게 빨리?

 

주된 이유는 빠른 레디 스입니다 :

  • 전체 메모리를 기반으로, 대부분의 요청은 매우 빠른 순수 메모리 동작입니다. 메모리에 저장된 데이터가 HashMap의 유사한, HashMap의 장점은 시간 O 및 룩업 연산 복잡도된다 (1);
  • 단순 데이터 구조, 데이터 조작은 레디 스 데이터 구조가 호환 될 수 있도록 설계되어, 간단;
  • 단일 스레드, 불필요한 컨텍스트 스위치 및 경쟁 조건을 피하기 위해, 더 할 수 없기 때문에 더 멀티 프로세스 또는 멀티 스레드 리드를 전환하는 소비 CPU, 다양한 문제, 잠금 잠금 해제 작업이 존재하지 않는, 잠을 고려하지 않아도 없다 성능이 나타납니다이 소비로 인한 교착 상태;
  • 의 IO가 블로킹 여러 I / O 다중화 모델을 사용;
  • 다른 기본 모델을 사용하여, 그들 사이의 기본 응용 프로그램 프로토콜 시스템 호출 시스템 기능의 대부분은, 그것은 이동하는 시간과 요청을 낭비하기 때문에 레디 스 VM는, 자신의 직접적인 메커니즘을 구축하지 같은 클라이언트와 방법 사이의 통신을한다 달성하기 위해 ;

위의 점은 더 나은 다음의 논의는 우리가 멀티 채널에 대한 간단한 모델을 사용, 이해 I / O 멀티플렉싱 :

다중 I / O를 선택, 설문 조사의 사용은 내가 가지고있는 하나 개 이상의 스트림이있는 경우,는 epoll 기능을 동시에, 현재의 thread가 봉쇄 것, 자신의 여가 시간에, 다중 스트림의 I / O 이벤트를 모니터링 할 수있는 모델입니다 다중화 시 / O 이벤트, 프로그램이 다시이 방법을 모든 스트림을 (epoll에 정말 이벤트 스트림을 전송하는 유일한 조사 인) 폴링, 그 과정만을 준비 순차적 흐름 않도록 차단 상태에서 깨어 그것은 쓸모없는 작업을 많이 방지 할 수 있습니다.

여기서 "다중화하여"복수의 네트워크 연결을 의미한다 "멀티플렉싱"동일한 스레드를 다시 지칭한다. I / O를 단일 스레드 연결 요청하는 복수의 처리를 효율적으로 허용 기법을 다중화하는 다중 채널 (IO 네트워크에 의해 소비되는 시간을 최소화하는) 메모리가 아니다의 동작에 대답하고, 레디 스 동작이 매우 빠르고, 메모리 내의 데이터를, 레디 스 주로 레디 스 매우 높은 처리량을 만들었습니다 위의 포인트, 성능의 병목이 될 것입니다.

왜 레디 스는 단일 스레드 프로세스 모델을 선택?

왜 레디 스 단일 스레드 모델은 무엇입니까? 레디 스 기반 메모리 병목 작업, CPU가 레디 스 병목 가능성이 가장 높은 컴퓨터 메모리 또는 네트워크 대역폭의 크기로이다의 레디 스 아니기 때문에 질문의 공식 웹 사이트는 말했다. 때문에 쉽게 구현할 단일 스레드, 그리고 CPU가 병목이되지 않습니다, (결국, 멀티 스레딩의 사용이 많은 문제가 될 것입니다!) 단일 스레드 프로그램을 채택하는 논리적이다.

레디 스는 처음부터, 대다수는 그러한 고려하는 가장 중요한 이유는 여러 가지가 같은 다음이다, 사실 많은에있는 클라이언트의 단일 스레드 모델을 처리 네트워크 요청을 사용하도록 선택 :

  • 더 나은 유지 보수성, 쉽게 개발 및 디버깅을 초래할 수있는 단일 스레드 모델을 사용;
  • 동시에 할 수있는 단일 스레드를 사용하여 클라이언트 요청 처리 모델;
  • 작동 성능의 대부분은 레디 스 서비스가 CPU를 실행하지 않는 병목;

마지막 하나는 세 가지 이유 위의 단일 스레드 모델의 사용에 궁극적 인 결정적인 요소이며, 두 개의 다른 이유는 단일 스레드 모델이 추가 혜택을 제공한다.

  1. 유지 보수성

디버그 및 테스트하기 어려운 코드가, 문제가 재현 종종 어려운 경우 유지 보수성이 프로젝트에 매우 중요하다, 그것은 심각하게 어떤 프로젝트를위한 프로젝트의 유지 보수에 영향을 미칠 것입니다. 뛰어난 성능의 어떤면에서는 모델을 멀티 스레드하지만 프로그램의 실행 순서에 불확실성을 소개하고 있지만, 코드 실행이 더 이상 직렬입니다, 다중 스레드 조심스럽게 다루지 않으면이 가져다 줄 변수에 액세스하지 이상한 문제.

  1. 동시 처리

레디 스 모델은 사용자의 요청을 처리하는 단일 스레드를 사용하지만,이 I / O 멀티플렉서 메커니즘을 사용하는 동안 단일 스레드 프로그램을 사용하면 모델이 동시 처리 작업을하지 않을 수없는 의미합니까 동시 대기하면서, 클라이언트로부터의 연결의 수를 연결 요청하는 복수의 전송된다.

상기 I / O 다중화 모델에서 가장 중요한 기능은 통화 기능을 선택하는 것, 및 동시에 (즉, 클라이언트 연결) 파일 디스크립터 복수 모니터링 할 같이이 방법의 읽고 쓰기가 가능한 경우이고 때 일부 읽거나 파일 기술자를 쓸 때, 선택 방법은 파일의 수를 읽고 쓸 수 디스크립터를 반환합니다. 내가 사용 / O 다중화 기술은 크게 시스템의 오버 헤드를 줄일 수, 시스템 개발 비용 및 유지 보수 비용을 절감 할 수있는 클라이언트와 서버의 연결을 수신하기 위해 추가 생성 및 프로세스와 스레드의 많은 수의 유지 보수가 필요하지 않습니다.

  1. 성능 병목 현상

단일 스레드 모델을 선택하는 결정적인 이유 레디 스 - 멀티 스레딩 기술은 서로 다른 작업을 수행하는 동시에 자원의 CPU 컴퓨팅을 최대한 활용하는 데 도움이 수 있지만 CPU 리소스는 종종 성능 병목 레디 스 서버 아니다. 심지어 우리 보통의 리눅스 서버는 또한 1 초 시간에 사용자 요청 1,000,000을 처리 할 수있는, 레디 스 서비스를 시작합니다.

이 처리량은 우리의 요구를 충족 할 수는 없지만 권장되는 접근 방식은 오히려 레디 스에서 동일한 서비스에서 멀티 스레드 운영의 큰 숫자를 도입보다는 과정에 다른 레디 스 서버에 조각난 방식으로 다른 요청을 사용하는 경우.

 

짧게 요약하고, 레디 스가 CPU를 많이 사용하는 서비스가 아닌, 당신은 AOF 백업을 열 수없는 경우, 모든 작업이 완료됩니다 레디 스는, 읽기 전용 메모리에 자리를 차지할 인한 데이터를 작성, 메모리 I / O 작업 중 하나를 포함하지 않는 따라서, 처리 속도가 매우 빠르고, 멀티 스레딩 모델 손잡이를 사용하여 모든 외부 요청이 좋은 용액하지 않을 수 있도록 병목 서비스, 즉 네트워크 I / O는 클라이언트와 데이터 전송 대기에 의한 네트워크 전송 지연이다.

멀티 스레딩하는 것이 도움이 될 것입니다하지만 우리는 CPU 리소스를보다 효율적으로 사용할 수 있지만 운영 체제는 무료, 사실은, 오버 헤드 전환 등의 추가 스레드를 가져올하지 않는 스레드에서 전환 :

  • 저장 스레드 실행 컨텍스트 (1);
  • 로드 스레드 실행 컨텍스트 2;

자주 쓰레드 컨텍스트 스위칭은 또한 성능의 급격한 하락으로 이어질 수 있습니다, 이것은 우리에게 이어질 수있는 유일한 요청 처리의 평균 속도를 향상하는 데 실패하지만, 부정적인 최적화 된없는, 그래서 이것은 왜 레디 스 매우 신중하게 멀티 스레딩을 사용합니다.

의 레디 스 소개 멀티 스레드

  

이다 삭제 될 수 있습니다 다른 스레드의 일부는 비동기 적으로 작동 최근 몇 버전에 추가 레디 스, 우리는 우리가이 삭제를 필요 왜 UNLINK, FLUSHALL ASYNC 및 FLUSHDB ASYNC, 위에서 언급 한, 그리고 왜 그들이 필요 비동기 처리를 멀티 스레드?

 키가 작은 메모리 공간을 차지하기 위해 삭제 될 경우이 경우에도 레디 스는 해당 값의 키를 삭제하려면 DEL 명령을 사용하여 동기화 된 것이다 너무 많이 소비하지 키 시간을 삭제합니다. 그러나 일부 대형 레디 스 키 - 값 쌍, 수만 또는 데이터의 MB MB의 수백 밀리 초 내에 처리 할 수없는 위해, 레디 스 메모리 공간의 출시에 더 많은 시간을 소비해야 할 수도 있습니다, 이러한 작업은 것입니다 작업을 차단하는 것은, 요청을 처리 할 수있는 가용성 및 영향 PCT99 레디 스 서비스를 처리합니다.

그러나 작품의 메모리 공간의 출시가 실제로 원칙 UNLINK 명령의 실현 백그라운드 스레드 비동기 처리하여 수행 할 수 있습니다, 그것은 단지 메타 데이터에서 키를 삭제됩니다, 실제 비동기 삭제 작업은 백그라운드에서 수행됩니다.

개요

레디 스는 성능 향상을 가져다 멀티 스레딩 모델의 사용은 그것이 가져다 개발 비용 및 유지 보수 비용을 상쇄 할 수 있도록, 시스템 성능 병목 현상은 주로에, CPU가 병목 레디 스 서버가 아닌 주로하기 때문에 단일 스레드 모델의 프로세스 클라이언트 요청을 사용하도록 선택 네트워크 I /에 O 작업, 멀티 스레드 운영 레디 스의 도입은 시간 레디 스 메인 스레드를 차단을 줄일 수 있도록 비 블로킹 다중 스레드 무료 최대 메모리 공간을 통해, 일부 대형 키 - 값 쌍의 삭제에 대한 성능 고려 사항 중도 실행의 효율성을 향상시킬 수 있습니다.

참조 : https://www.sohu.com/a/378300083_355142

게시 43 개 원래 기사 · 원 찬양 1 ·은 40000 +를 볼

추천

출처blog.csdn.net/dengbixuan/article/details/104750256