카프카의 메시지는 일반적으로 그 것이다 주소 때문에 성능이 저하됩니다 디스크에 데이터를 읽고 쓸 생각됩니다, 저장 또는 디스크 캐시에 더 많은 시간이 소요 있지만, 사실은, 카프카의 특징 중 하나는 높은 처리량이다. 심지어 일반 서버, 카프카 쉽게 메시징 미들웨어의 대부분보다, 두 번째 레벨 당 쓰기 요청의 수백만 지원할 수있는이 기능은 카프카가 널리 장면으로 엄청난 양의 데이터를 처리하는 로그에 사용한다.
벤치 마크에 대한 카프카, 아파치 카프카 벤치 마크를 참조 할 수 있습니다 : 초당 2 백만 쓰기 (세 저가의 컴퓨터에서)
쓰기와 읽기 모두의 분석에서 다음과 같은 데이터 이유 카프카 너무 빨리
첫째, 데이터를 기록
카프카는 데이터가 손실되지 않습니다, 하드 디스크에 기록 된 메시지가 나타납니다. 쓰기 속도를 최적화하기 위해 카프카는 두 가지 기술, 순차 쓰기 및 MMFile를 사용합니다.
순차 쓰기
디스크 읽기 및 쓰기 속도 당신이 그것을 사용하는 방법에 따라 달라집니다, 즉 순차 읽기이며, 작성하거나 임의 읽기 및 쓰기. 일련의 경우에 읽고, 연속 읽기 쓰기 속도와 메모리 디스크 변하지 물품.
주소가 "기계적 작용"이 소모 대부분의 시간 인 것을 특징> 쓰기 - 하드 디스크가 기계 구조이기 때문에, 각각의 읽기 및 쓰기 주소입니다. 그래서 하드 디스크는 대부분의 순차적 I / O를 같은 O / 랜덤 I 싫어 읽고 하드 디스크의 쓰기 속도를 개선하기 위해, 카프카는 순차적 I / O를 사용하는 것입니다
디스크 리눅스 및 최적화 읽고, 디스크 캐시를 미리 읽기 및 쓰기 숨김 포함, 더 될 것입니다 물품. 시간이 메모리에 이러한 작업을 할 경우, 큰 메모리 오버 헤드 자바 객체는, 다른 하나는, GC의 자바가 디스크 작업을 사용하여, 매우 오랜 시간이 될 데이터의 증가에 힙 메모리입니다 다음과 같은 이점이 있습니다 :
- 순차 읽기 및 쓰기 디스크 쓰기 순서 랜덤 액세스 메모리 이상
- 낮은 쓰기 JVM 주문 GC 효율, 대용량 메모리 풋 프린트. 이 문제를 방지 디스크를 사용하여
- 콜드 스타트 순서가 기록되면, 디스크 캐시는 계속 사용할 수 있습니다
다음 그림은 카프카 카프카 문서 파일 (가상 프레임 부)의 단부에 삽입 될 메시지 데이터를 수신 한 후 실제로 각 파티션에 데이터를 기록하는 방법을 도시한다 :
이 방법은 단점이 있습니다 - 데이터를 삭제하는 방법은 없습니다, 카프카의 데이터는 삭제되지 않습니다를, 그것은 모든 데이터가 유지되며, 각 주제에 대한 각 소비자 (소비자가)를 표시하는 데 사용됩니다 상쇄했다 처음 몇 데이터를 읽습니다. 두 소비자가 :
- Consumer1 기록 시퀀스는 두 (주제 파티션 각 가정) partition0을, 대응 개의 파티션 오프셋 갖는다
- 시퀀스 Consumer2 Partition2에 대응하는 오프셋 필기구. 정상적인 상황에서 SDK는 내부 사육사 저장됩니다, 그래서 주소 사육사 소비자를 제공 할 필요가있다, 이것은 클라이언트 SDK를 유지할 책임이 오프셋, 카프카의 Broker는 완전히이 일을 무시합니다.
제거하지 않으면 Kakfa 데이터를 삭제하는 두 가지 전략을 제공하므로 하드 디스크는 확실히 전체 될 것입니다 :
- 하나는 시간에 따라 순차적으로 기록됩니다.
- 두 번째는 순차 쓰기 파일 파티션 크기를 기반으로합니다.
메모리 매핑 된 파일
순서가 하드 디스크 액세스 속도에 기록하더라도 메모리를 잡으려고 여전히 불가능하다. 그래서 카프카는 데이터가 디스크에 기록되는 실시간 아니라, 메모리 I / O 효율의 사용을 증가시키기 위해 최신 운영 체제 페이징 메모리의 모든 이점을 활용하고 있습니다.
메모리 매핑 된 파일도 메모리 매핑 된 파일로 변환됩니다 (나중에 mmap를라고도 함), 64 비트 운영 체제는 일반적으로 데이터 파일 20G를 나타낼 수 있습니다, 그 작동 원리는 물리적 메모리에 파일을 직접 매핑을 달성 운영 체제 페이지의 직접 사용은 .
당신은 실제 메모리의 매핑 작업이 하드 드라이브에 동기화됩니다 완료하면 (적절한 경우 운영 체제).
mmap에 의해 읽기와 읽기 - 쓰기 메모리로 하드 쓰기의 과정은 (물론, 가상 머신 메모리), 우리는 모든 세부 사항을 공개하는 가상 메모리의 메모리 크기에 대해 걱정할 필요가 없습니다.
사용자 공간의 오버 헤드를 제거하면 I / O 업그레이드를 많이 얻을 수있는이 방법은 커널 메모리 공간에 첫 번째 파일을 호출 데이터를 읽을 (복사 할 공간을 커널, 다음 사용자 메모리 공간에 복사합니다 .에서)하지만 분명한 결함도있다 - 프로그램이 자동으로 만 호출 데이터를 플러시 할 때 mmap를 작성 신뢰할 수없는 데이터가 정말 하드 디스크에 기록되지는 운영 체제가 실제 하드 씁니다.
카프카 카프카 생산자라는 동기화 (싱크)에 반환하기 전에 mmap를 즉시 다량 후에 기록하는 경우 제어하는 파라미터는, 활성 --producer.type 플러시 아니다 제공 (플러시를 호출하지 않는 mmap를 생산자 비동기 호출을 기록 직후에 반환 비동기).
둘째, 데이터 읽기
디스크를 읽을 때 카프카는 어떤 최적화를 했습니까?
제로 복사를 달성 sendfile을 바탕으로
다음과 같이 파일이 전송 될 필요가 전통적인 모드는 특정 프로세스 세부 사항은 다음과 같습니다 :
- sendfile을 파일 데이터를 읽을 제로 복사 함수 호출을 달성 기반으로하는 커널 버퍼를 복사하는 것입니다
- 함수가 반환을 읽어 파일은 사용자 버퍼를 커널 버퍼에서 데이터를 복사
- 함수 호출을 쓰기, 파일이 소켓과 관련된 커널 버퍼에 사용자 버퍼의 데이터를 복사합니다.
- 관련 프로토콜 엔진에 소켓 버퍼에서 데이터를 복사합니다.
자세한 내용은 네트워크 파일 전송에 대한 읽기 / 쓰기 모드의 전통적인 방법입니다, 우리는이 과정에서 것을 볼 수 있으며, 데이터 파일은 4 개 개의 동작을 통해 사본은 실제로 :
- 하드 드라이브 -> 커널 buf-> 사용자 buf-> 소켓 버퍼 관련 -> 프로토콜 엔진
에 sendfile 시스템 호출은 파일 전송 방법의 성능을 향상, 위의 반복 복사 줄이는 방법을 제공한다.
버전 2.1 커널은 sendfile을 시스템 호출은 네트워크와 두 로컬 파일 사이의 데이터 전송을 단순화하기 위해 도입된다. sendfile을 또한 컨텍스트 스위칭을 줄뿐만 아니라, 데이터의 복제를 감소 도입. sendfile을 (소켓, 파일, 렌);
다음과 같이 실행 프로세스는 다음과 같습니다
- sendfile을 시스템 호출, 파일 데이터는 커널 버퍼를 복사하는 것입니다
- 그리고 커널 버퍼 사본에서 커널 소켓 버퍼 관련
- 마지막으로 기존의 읽기 / 쓰기 모드에 비해 관련 프로토콜 엔진에 버퍼 복사 소켓, 커널 sendfile을 커널 버퍼의 2.1 버전의 도입은 사용자 버퍼로 감소 된 후, 사용자에 의해 버퍼가 소켓 버퍼에 관련된 파일을 복사하려면, 커널 버전 2.4 이후, 파일 디스크립터 결과 sendfile을 다시 복사 작업을 줄이고,보다 간단한 방법을 달성하기 위해 변경된다.
그래서 아파치, Nginx에, lighttpd를 웹 서버와 중,하는 sendfile을 관련 구성이 sendfile을 크게 파일 전송 성능을 향상시킬 수 있습니다 사용합니다.
소비자가 읽기 - 쓰기 모드 mmap에있는 파일로, 소비자에게 직접 카프카 파일을 데이터를 전송할 필요가있을 때 카프카 모든 메시지가하는 파일에 저장되어 직접 sendfile을 전달할 수 있습니다.
일괄 압축
대부분의 경우, 병목 현상이 CPU 나 디스크하지만, 네트워크 IO, 데이터 센터 WAN 데이터 라인간에 메시지를 보낼 특히 필요 없습니다. 데이터 압축은 CPU 자원의 작은 금액을 소비하지만, 카프카를 들어, 네트워크 IO가 고려되어야한다.
- 각 메시지가 압축하지만 카프카 배치 압축을 사용하므로 압축률이 상대적으로 낮은 경우, 압축은 단일 메시지 압축보다는 함께 여러 메시지 오는
- 카프카 소비자가 해결 될 때까지 압축되고, 메시지 세트 재귀 메시지 볼륨이 로그에 의해 압축 된 형태로 전송 될 수 있으며, 압축 된 포맷으로 유지 될 수 있도록
- 카프카는 Gzip 압축 프로토콜과 뭐 이따위 등 다양한 압축 프로토콜을 지원합니다
셋째, 요약
그것은 모든 배치 파일에 메시지 및 합리적인 대량의 압축 적 mmap을 개선하여, 네트워크 IO 손실을 줄일 수 있다는 카프카 속도의 비밀 I / O 속도, 쓰기 데이터 인해 하나의 partion을에 마지막에 추가 될 때 따라서, 최적의 속도, 직접 출사 된 sendfile 폭력 데이터를 판독.
HTTP : //bigdata.51cto.com/art/201910/604512.htm에서 재판