2012-03-21 2 views
12

400-600KB 크기 범위의 많은 문서를 포함하는 CouchDB (1.1.1) 서버를 실행 중입니다. CouchDB에서 읽기가 느린 이유는 무엇입니까? (1.5MB/s 또는 그 부근)

나는 시간이 데이터베이스에서 전체 문서를 가져 오는 경우

은 (안보기, 바로 원시 문서에서)는 1.5MB/s의 처리량 주위에 동일시하는 완료 200-400ms 걸립니다. 나는 디스크에 원시 파일에 동일한 데이터를 작성하는 경우

그들은 (25~50메가바이트/s의 주위에) 10-20ms에로드합니다.

나는 CouchDB를 (그리고 일부) 약간의 오버 헤드가 있지만, 규모의 순서가 기대 기본적으로 읽기 무엇인지에 대한 미친 것 같다 것!

누군가가 왜 이런 경우가 될 수 있습니까?

업데이트 : 컬에서, 아래의 타이밍을 요청 바와 같이 :

# time curl http://localhost:5984/[dbname]/[documentname] 

real 0m0.684s 
user 0m0.004s 
sys  0m0.020s 

페치 된 문서는 642,842 바이트이었다. 유사한 표준 결과와 함께 표준 1TB 하드 디스크와 EC2 인스턴스 (EBS 볼륨)에서 테스트했습니다.

+0

편집 : CURL –

+0

님의 타이밍 아래에서 요청한대로 안녕하세요. 귀하가 설명한 것과 동일한 상황에 직면했습니다. 이것에 대한 벤치 마크를 공유 할 수 있습니까? 많은 독서를 테스트하고 중간 값을 가져다가 제안한 것을 실제로 했습니까? 이 주제는 나에게 꽤 흥미 롭습니다 :) –

답변

15

나는이 당신은 근본적으로 높은 대기 시간 프로토콜 HTTP를 통해 인출하는 몇 가지 요인

  1. 생각합니다. 특히 curl을 사용하여 처음부터 TCP 연결을 구축해야합니다. (웹 브라우저와 대부분의 클라이언트 소프트웨어는 지속적인 HTTP/1.1 킵 얼라이브 연결 풀을 유지합니다.) 근본적으로 CouchDB는 매우 보편적이며 표준이기 때문에 "느린"프로토콜을 선택합니다.
  2. 문서가 CouchDB의 더 큰 크기에 있습니다. 대부분의 문서는 3 자릿수가 아닌 1 자릿수 또는 2 자릿수 KB입니다. CouchDB를이 JSON 하나 개의 큰 쭉 마시는에 있음을 디코딩/인코딩 (즉,이 디스크에서 스트리밍되지 않습니다.)
  3. 는뿐만 아니라 EC2 (심지어 EBS)는 I/O 데이터베이스에 이상적보다 적게보다는 (그 자체가 높은 대기 시간이) 하지만 이웃 사람들이 경쟁 할 수있는 알려지지 않은 I/O 버스트를 생성 할 때도 변동될 수 있습니다.
  4. CouchDB는 파일 시스템 맨 위에있는 파일 시스템입니다. .couch 파일은 파일 시스템 자체와 매우 유사합니다. 그래서 당신은 비효율을 증가시키고 있습니다. .couch 파일과 메타 데이터에는 저장소에 대한 임의의 I/O가 필요합니다. 문서를 읽기 위해서는 .couch 파일 내의 임의 입출력이 필요합니다. 디스크 대기 시간의 영향이 배가 될 수 있습니다. 읽기 을 파일 시스템 파일을 읽는 것과 비교하는 대신 문서 읽기와 동등한 MySQL 행 읽기를 비교해보십시오.

사실 CouchDB가 실제로 빠르며 결과가 올바르지 않습니다. 정 반대 : CouchDB는 많은 사람들이 기대하는 것보다 느리다.어느 정도는 개선되고 최적화 될 여지가 있습니다. 그러나 주로는입니다. CouchDB는 비용이 더 많은 이익을 가져다주는 데 가치가 있다고 판단했습니다.

CouchDB는 벤치 마크를 실패하고 대학을 어렵게 만듭니다. 다음으로 여러 동시 액세스에 대한 예상 수요를 시뮬레이트하고 실제 요구 사항에 최대한 근접하도록 CouchDB에서 전체 부하를 벤치마킹하는 것이 좋습니다. 그러면 더 유용한 테스트가 될 것이고 일반적으로 CouchDB가 거기서 인상적으로 테스트를 수행합니다.

즉, CouchDB는 도메인 특정 데이터베이스이므로 다른 도구도 찾고있을 수 있습니다.

+0

입력 Jason을 보내 주셔서 감사합니다. 또한 EC2를 동일한 결과 (로컬 디스크, 빠른 개발 상자)로 테스트했습니다. 나는 이것이 CouchDB 읽기, 파싱, 그리고 홀수로 보이는 전체 문서의 직렬화에 있다고 생각합니다. 원시 데이터베이스 파일을 "향하게"하면 원시 JSON으로 문서를 볼 수 있습니다. GET 요청에 대해 단순히 스트리밍되는 것이 아니라는 것은 이상한 것 같습니다. –

+0

필자는 추상화 (추상화)에 대한 추상화에 분명히 감사하고 있지만 원시 문서에서 성능을 읽지 못하게하는 수준에 놀랐습니다. 1TB 디스크와 12GB의 RAM이 장착 된 코어 i5에서 3MB/s의 읽기 속도를 보였습니다 (CPU를 고정하는 동안) - 놀랍도록 느립니다! –

+0

나는 또한 CouchDB가 도메인에 특화되어 있다는 것을 알게되었고, 우리에게 도움이되는 것들은 매우 훌륭하게 수행됩니다. 그것은 좋은 성능을 위해 뷰를 미리 빌드하는 데 걸리는 시간과 노력이 모두 끝나면 읽기에 의해 무너질 것입니다 (디스크에서 준비된 데이터/원본 문서를 간단하게 가져와야 함) . –

1

문서를 어떻게 가져 오나요? 일부 코드를 사용하는 경우 해당 코드 및 사용중인 모든 라이브러리를 포함하십시오.

또는 curl을 사용하여 문서를 검색하십시오. 예, 방금 time curl http://localhost:5984/bwah/foo을했고 .017의 문서를 받았습니다. 중요한 점은 SSD가있는 컴퓨터를 사용하고 있다는 것입니다.

또한, 하나 개의 읽기를 수행하면 CouchDB를 예상 할 수있는 처리량, 또는 그 문제에 대한 모든 서버 소프트웨어를 제시하는 것만으로는 충분하지 않습니다. 많은 요청을 한 다음 평균 및 중간 시간을 확인해야합니다.

+0

귀하의 요청에 따라 업데이트를 추가했습니다. –

+0

실제 시험에서 비슷한 크기의 1,000 개의 문서를 읽었으며 게시 한 수치는 전체 샘플의 평균을 반영했습니다. –

+0

EC2 인스턴스의 크기는 무엇입니까? 나는 내 편에서 복창 할 수있다. 또한 가상 시스템은 디스크에 대한 I/O 경합으로 인해 성능이 크게 저하 될 것입니다. CouchDB fsync는 성공을보고하기 전에 모든 쓰기 작업을 수행합니다. 마지막으로 localhost, LAN 또는 WAN에서 테스트를 어디에서 실행합니까? –

관련 문제