>  기사  >  데이터 베이스  >  Redis가 단일 스레드인 이유는 무엇입니까?

Redis가 단일 스레드인 이유는 무엇입니까?

藏色散人
藏色散人원래의
2019-06-11 10:49:588057검색

Redis가 단일 스레드인 이유는 무엇입니까?

과거에는 고성능 서버를 구현하려면 멀티 쓰레드로 구현해야 한다는 오해가 늘 있었습니다.

이유는 매우 간단합니다. 오해로 인해 2: 멀티 쓰레드가 싱글 쓰레드보다 효율적이어야 합니다. . 설마.

redis core는 내 모든 데이터가 메모리에 있으면 단일 스레드 작업이 가장 효율적이라는 것입니다. 왜죠? 멀티 스레딩의 본질은 CPU가 여러 스레드를 시뮬레이션한다는 것입니다. 이것이 바로 컨텍스트 스위칭인데, 메모리 시스템에서는 컨텍스트 스위칭이 없는 것이 가장 효율적이다.

Redis는 단일 CPU를 사용하여 메모리 데이터 조각을 바인딩한 다음 이 메모리의 데이터를 여러 번 읽고 쓸 때 모두 하나의 CPU에서 수행되므로 이 문제를 단일 스레드에서 처리합니다. 메모리의 경우 이 솔루션이 가장 좋습니다. (권장: "redis 비디오 튜토리얼")

CPU 컨텍스트 전환에 약 1500ns가 걸리기 때문입니다.

메모리에서 1MB의 연속 데이터를 읽는 데 약 250us가 소요됩니다. 1MB의 데이터를 여러 스레드에서 1000번 읽은 다음 1000번의 시간 컨텍스트 전환이 있다고 가정하면

그러면 1500ns * 1000 = 1500us가 소요됩니다. 단일 스레드에서 1MB의 데이터를 읽는 데 시간 컨텍스트를 전환하는 데 1500us가 걸렸습니다. 매번 작은 데이터를 읽는 데 걸리는 시간은 포함되지 않습니다.

그렇다면 언제 멀티 스레드를 사용해야 할까요? 해결책? ?

답은: 하위 계층 스토리지 및 기타 느린 상황입니다. 예를 들어 disk

memory는 IOPS가 매우 높은 시스템입니다. 메모리 조각을 신청하려면 메모리 조각을 신청하고, 메모리 조각을 파괴하면 메모리 조각도 파괴되기 때문입니다. .기억을 신청하고 파기하는 것은 매우 쉽습니다. 그리고 메모리는 크기에 따라 동적으로 적용될 수 있습니다.

디스크의 특징은 다음과 같습니다. IPOS는 매우 낮지만 처리량이 매우 높습니다. 이는 최고의 성능을 달성하려면 많은 수의 읽기 및 쓰기 작업을 함께 수집한 다음 디스크에 제출해야 함을 의미합니다. 왜?

트랜잭션 그룹 작업(즉, 쓰기, 읽기, 쓰기, 읽기 및 쓰기와 같은 여러 개의 분리된 트랜잭션 요청, 이 5가지 작업이 함께 있음)이 있는 경우 IOPS가 매우 높기 때문에 메모리에 하나씩 완료했지만 디스크에 이 요청 방법도 있으면

첫 번째 쓰기 작업은 다음과 같이 완료됩니다. 먼저 하드 디스크에서 주소를 찾는데 약 10ms가 소요됩니다. 그런 다음 조각을 읽습니다. 1ms가 걸릴 수 있는 데이터 작업(무시) 후 하드 디스크에 다시 쓰는 데 10ms가 더 소요되어 총 21ms가 소요됩니다.

두 번째 작업에서는 읽는 데 10ms가 걸렸고, 세 번째 작업에서는 쓰는 데 21ms가 걸렸습니다. , 그리고 나서 10ms를 읽고 21ms를 썼는데, 요청 5개 총 83ms가 소요되는데, 이는 여전히 메모리에 있다면 1ms 미만일 것입니다.

따라서 이렇게 처리량이 많은 디스크의 경우 가장 좋은 솔루션은 N개의 요청을 버프에 함께 넣은 다음 함께 제출하는 것입니다.

방법은 비동기식을 사용하는 것입니다. 요청을 처리 스레드에 바인딩하지 않고 요청 스레드가 요청을 버프에 넣은 다음 버프가 거의 가득 찰 때까지 기다린 다음 처리 스레드가 버프를 처리합니다. 그런 다음 이 버프를 사용하여 디스크에 쓰거나 디스크를 균일하게 읽으므로 효율성이 가장 높습니다. Java의 IO가 그런거 아닌가요~

느린 장치에는 이 처리 방법이 가장 좋습니다. 느린 장치에는 디스크, 네트워크, SSD 등이 포함됩니다.

이러한 문제를 처리하는 멀티스레딩, 비동기 방식은 매우 일반적입니다. 유명한 netty가 이런 일을 합니다.

마지막으로 redis가 왜 싱글스레딩인지, 언제 싱글스레딩과 멀티스레딩을 사용해야 하는지 명확히 했습니다. 사실 그것도 아주 간단한 일이지만 기초가 좋지 않으면 정말 당황스럽습니다. . . .

마스터의 인용문 추가: 단일 코어 CPU를 메모리 조각에 바인딩하는 것이 가장 효율적인 이유에 대해 이야기해 보겠습니다.

“우리는 자체 프로그램을 더 잘 알고 있기 때문에 운영 체제 로드 밸런싱을 허용할 수 없습니다. 수동으로 할 수 있습니다. CPU를 너무 많이 차지하지 않고 CPU 코어를 할당합니다." 기본적으로 단일 스레드는 시스템 호출을 할 때 CPU 코어를 무작위로 사용합니다. Redis를 최적화하기 위해 고정된 CPU 코어를 단일 스레드에 바인딩하는 도구를 사용할 수 있습니다. 불필요한 성능 손실을 줄입니다!

Redis는 멀티 코어 CPU를 최대한 활용하기 위해 하나의 서버에서 여러 인스턴스가 시작되는 경우가 많은 단일 프로세스 모델 프로그램입니다. 전환 비용을 줄이려면 각 인스턴스가 실행되는 CPU를 지정해야 합니다.

Linux의 Taskset은 프로세스를 특정 CPU에 바인딩할 수 있습니다. 스케줄러가 프로그램을 어리석게 예약하는 것을 피하거나 다중 스레드 프로그램에서 캐시 무효화로 인한 오버헤드를 피하기 위해 운영 체제보다 프로그램을 더 잘 알고 있습니다.

위 내용은 Redis가 단일 스레드인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.