일부 성능 평가의 일부로 문서를 MongoDB에 추가하기 위해 반복적 인 업데이트 작업을 수행하고 있습니다. 내가 업데이트의 수에 따라 실행 시간에 큰 비선형 성을 발견했습니다 (W는 upserts /) 내가 수행하고 있습니다 :MongoDB Update-Upsert 성능 배리어 (성능이 절벽에서 떨어짐)
collection.update({'timestamp': x}, {'$set': {'value1':y, v1 : y/2, v2 : y/4}}, upsert=True)
는 제공합니다 ...
파이썬에서 다음 명령을 반복 나 이러한 결과 ...
500 document upserts 2 seconds.
1000 document upserts 3 seconds.
2000 document upserts 3 seconds.
4000 document upserts 6 seconds.
8000 document upserts 14 seconds.
16000 document upserts 77 seconds.
32000 document upserts 280 seconds.
공지 방법 8K 문서는 성능이 급격하게 저하되기 시작하고, 32K 문서 업데이트로 우리가 처리량의 6 배 감소를보고하고 업데이트 후. 왜 이런거야? "수동으로"4k 문서 업데이트를 8 번 연속해서 실행하는 것이 Python에서 모든 것을 연속적으로 수행하는 것보다 6 배 더 빠르다는 것은 이상한 것 같습니다.
mongostats에서 나는 엄청나게 높은 잠긴 db 비율 (> 100 %)을 보았고 top이 실행 중일 때 85 % 이상의 CPU 사용량을 보여주고 있습니다. VM에 4 개의 코어를 사용할 수있는 i7 프로세서가 있습니다. 이 인덱스는 고유 한 값이 포함되어야하는 경우
collection.ensure_index("timestamp") # shorthand for single-key, ascending index
을 :
collection.ensure_index("timestamp", unique=True)
을 사양이 인덱싱되지 않기 때문에 당신이 수행하는 업데이트입니다
내가 디스크 캐싱 완벽하게 합리적인 설명은 찾을 수 계속 진행하면 성능이 떨어질 것이라고 예측합니다. 업서 트를 늘리십시오. –
모음이'timestamp'에 색인되어 있습니까? – mdscruggs
@mdscruggs, 현재 타임 스탬프에 대한 색인이 생성되지 않았습니다. 수동으로 선언 된 타임 스탬프로 현재 자동 생성 된 _ID를 대체 하시겠습니까? – EnemyBagJones