이 기사는 원래 MongoDB에 출판되었습니다. itepoint를 가능한 한 itepoint를 지원하는 파트너에게 감사합니다.
다양한 내부 캐시와 디스크 성능의 관계 이해와 이러한 관계가 데이터베이스 및 응용 프로그램 성능에 어떤 영향을 미치는지 이해하는 것은 어려울 수 있습니다. YCSB 벤치 마크를 사용하여 작업 세트 (테스트에 사용 된 문서 수) 및 디스크 성능을 변경하여 관계를 더 잘 보여줍니다. 결과를 검토 할 때 일반적인 데이터베이스 사용 패턴에 대한 이해를 향상시키기 위해 일부 MongoDB 내부 메커니즘을 소개합니다.
키 포인트
디스크 기준 성능 이해는 전체 데이터베이스 성능을 이해하는 데 중요합니다.
높은 디스크 대기 시간과 활용은 디스크 병목 현상을 나타냅니다.
WiredTiger IO는 무작위입니다.
단일 복제 세트의 쿼리는 단일 스레드이며 순차적입니다.
디스크 성능은 작업 세트 크기와 밀접한 관련이 있습니다.
초록 -
전반적인 시스템 성능의 주요 영향은 작업 세트가 스토리지 엔진 캐시 크기 (데이터 저장 전용 메모리) 및 디스크 성능 (데이터 액세스 속도에 대한 물리적 제한을 제공 함)과 관련된 방법입니다. -
YCSB를 사용하여 디스크 성능과 캐시 크기 사이의 상호 작용을 탐색 하여이 두 가지 요소가 성능에 어떤 영향을 미치는지 보여줍니다. 이 테스트에서는 YCSB를 사용하지만 합성 벤치 마크는 생산 워크로드를 나타낼 수 없습니다. 이 방법을 통해 얻은 대기 시간 및 처리량 번호는 생산 성능에 매핑되지 않습니다. 이 테스트에는 MongoDB 3.4.10, YCSB 0.14 및 MongoDB 3.6.0 드라이버를 사용했습니다. YCSB는 16 개의 스레드와 "균일"읽기 전용 워크로드로 구성됩니다.
우리는 작업 세트를 메모리에 넣는 것이 최적의 응용 프로그램 성능을 제공하며 모든 데이터베이스와 마찬가지로이 한계를 초과하는 것은 대기 시간과 전체 처리량에 부정적인 영향을 미칩니다. -
디스크 메트릭 이해 -
디스크 성능을 고려할 때 네 가지 중요한 표시기가 있습니다.
디스크 처리량 또는 요청 수에 요청 크기를 곱한 수에 곱한 요청 수입니다. 이것은 일반적으로 초당 메가 바이트로 측정됩니다. 4KB 범위의 임의 읽기 및 쓰기 성능은 표준 데이터베이스 워크로드를 가장 잘 나타냅니다. 많은 클라우드 제공 업체는 디스크 처리량 또는 대역폭을 제한합니다. -
<..> 디스크 지연. Linux의 경우, 이는 대기, 즉 응용 프로그램에서 데이터가 작성되거나 응용 프로그램으로 반환되는 시간까지의 시간 (밀리 초)로 표시됩니다. SSD의 경우 지연은 일반적으로 3 밀리 초 미만입니다. HDD는 일반적으로 7 밀리 초보다 높습니다. 높은 대기 시간은 디스크가 주어진 작업량을 따라 유지하기가 어렵다는 것을 의미합니다.
디스크 IOP (초당 입력/출력 작업). Iostat는이 메트릭을 TPS로보고합니다. 주어진 클라우드 제공 업체는 주어진 드라이브에 대해 특정 수의 IOP를 보장 할 수 있습니다. 이 임계 값에 도달하면 추가 액세스가 대기되어 디스크 병목 현상이 발생합니다. 고급 PCIE 부착 된 NVME 장치는 1,500,000 IOP를 제공 할 수 있으며 일반적인 하드 드라이브는 150 IOP 만 지원할 수 있습니다. -
디스크 사용. Iostat에서 Util에 의해보고되었습니다. Linux에는 IO에 서비스를 제공하기 위해 장치 당 여러 대기열이 있습니다. 활용은 주어진 시간 내에 이러한 대기열의 비율을 나타냅니다. 이 숫자는 혼란 스러울 수 있지만 전반적인 디스크 건강의 좋은 지표입니다.
-
테스트 디스크 성능
클라우드 제공 업체는 주어진 볼륨 및 디스크에 대한 IOPS 임계 값을 제공 할 수 있지만 디스크 제조업체는 예상 성능 수치를 게시하지만 시스템의 실제 결과는 다를 수 있습니다. 디스크 성능에 문제가있는 경우 IO 테스트를 수행하는 것이 매우 유용 할 수 있습니다. -
우리는 일반적으로 테스트에 FIO (Flexible IO Tester)를 사용합니다. 우리는 10GB의 데이터를 테스트하고, IOENGINE은 PSYNC이고, 읽기 범위는 4KB와 32KB 사이입니다. 기본 FIO 설정은 WiredTiger Workloads를 나타내지 않지만이 구성은 WiredTiger 디스크 사용의 근사치라는 것을 알았습니다.
모든 테스트는 세 가지 디스크 시나리오에서 반복됩니다
장면 1
AWS C5 IO1 100GB 볼륨이 제공하는 기본 디스크 설정. 5000 IOPS
1144 IOPS / 5025 물리적 읽기 / Second / 99.85% 활용
장면 2
디스크를 600 IOP로 제한하고 7 밀리 초 지연을 도입하십시오. 이것은 하드 드라이브가있는 일반적인 RAID10 SAN의 성능을 반영해야합니다.
134 IOPS / 150 물리적 읽기 / SEC / 95.72% 활용
장면 3
는 7 밀리 초의 대기 시간으로 디스크를 150 IOP로 제한합니다. 이것은 정상적인 회전 하드 드라이브를 시뮬레이션해야합니다.
34 IOPS / 150 물리적 판독 / SEC / 98.2% 활용
쿼리 디스크에서 제공하는 방법?
WiredTiger Storage Engine은 자체 캐시를 실행합니다. 기본적으로 WiredTiger 캐시 크기는 시스템 메모리 마이너스 1GB의 50%로 다른 시스템 프로세스, 파일 시스템 캐시 및 추가 메모리를 사용하는 내부 MongoDB 작업 (예 : 메모리 정렬 수행, 중복 제거 결과, 텍스트 점수, 가입 처리 및 집계) 충분한 공간을 남겨 두십시오. 캐시 충만으로부터의 성능 저하를 방지하기 위해, 활용이 80%를 초과하면 WiredTiger는 자동으로 캐시에서 데이터를 배출하기 시작합니다. 테스트의 경우 유효한 캐시 크기가 (7634MB - 1024MB)*. 5*.8 또는 2644MB임을 의미합니다.
모든 쿼리는 WiredTiger가 캐시합니다. 즉, 쿼리로 인해 인덱스 및 문서가 파일 시스템 캐시를 통해 WiredTiger 캐시로 읽히고 결과를 반환합니다. 요청 된 데이터가 이미 캐시에 있으면이 단계를 건너 뜁니다.
WiredTiger는 Snappy Compression 알고리즘을 사용하여 기본적으로 문서를 저장합니다. 파일 시스템 캐시에서 읽은 모든 데이터는 WiredTiger 캐시에 저장되기 전에 압축 압축됩니다. 인덱스는 기본적으로 접두사로 압축되며 디스크 및 WiredTiger 캐시 모두에서 압축됩니다.
파일 시스템 캐시 캐시는 쉽게 액세스 할 수 있도록 자주 액세스하는 파일을 메모리에 저장하는 데 사용되는 운영 체제 구조입니다. Linux는 캐시 된 파일에서 매우 활성화되어 있으며 파일 시스템 캐시를 사용하여 사용 가능한 모든 메모리를 소비하려고합니다. 더 많은 메모리가 필요한 경우, 파일 시스템 캐시가 추출되어 응용 프로그램에 더 많은 메모리를 제공합니다.
이것은 100 YCSB 읽기 작업에서 생성 된 YCSB 컬렉션에 대한 디스크 액세스를 보여주는 애니메이션 그래프입니다. 각 작업은 단일 문서의 경우 _id의 단일 조회입니다.
왼쪽 상단 코너는 WiredTiger Collection 파일의 첫 번째 바이트를 나타냅니다. 디스크 위치는 오른쪽과 주변으로 증가합니다. 각 라인은 WiredTiger Collection 파일의 3.5MB 세그먼트를 나타냅니다. 액세스는 시간순으로 정렬되며 애니메이션 프레임으로 표시됩니다. 액세스는 현재 디스크 액세스를 강조하기 위해 빨간색 및 녹색 사각형으로 표시됩니다.
여기서, 우리는 수집 데이터 파일이 메모리에 읽히는 것을 알 수 있습니다. 데이터는 B-Tree에 저장되므로 문서를 찾아서 읽기 전에 디스크의 하나 이상의 위치에 액세스하여 문서의 디스크 위치 (작은 액세스)를 찾아야 할 수도 있습니다 (더 큰 액세스).
이것은 MongoDB 쿼리의 일반적인 액세스 패턴을 보여줍니다.이 문서는 디스크에서 서로 가까이 있지 않을 것입니다. 이것은 또한 서로를 삽입 한 후에도 문서가 연속 디스크 위치에 있지 않을 것임을 보여줍니다.
WiredTiger Storage Engine은 "Full Read"로 설계되었습니다. 한 번에 필요한 모든 데이터에 대한 읽기 요청이 발행됩니다. 이로 인해 WiredTiger 배포에 대한 디스크 사전 읽기 제한을 권장 할 수 있습니다.
작업 세트는 캐시
에 적합합니다
첫 번째 테스트 세트의 경우 레코드 수를 2 백만으로 설정하여 총 데이터 크기와 2.43GB 또는 캐시의 92%가됩니다. 여기서 장면 1의 강력한 성능은 초당 76,113 요청입니다. 파일 시스템 캐시 통계 확인 WiredTiger 캐시 적중률은 100%, 액세스 권한이 없으며 파일 시스템 캐시에 바이트를 읽지 않으므로 테스트 전반에 걸쳐 추가 IO가 필요하지 않음을 관찰했습니다.
시나리오 2 및 시나리오 3에서 예상대로 디스크 성능 변경 (7 밀리 초의 대기 시간을 추가하고 IOP를 600 또는 150으로 제한)은 처리량 (각각 69, 579.5 및 70,252 작업/SEC)에 미치는 영향을 미칩니다.
3 개의 테스트 모두에 대한 99% 응답 지연은 0.40 ~ 0.44 밀리 초입니다.
작업 세트는 WiredTiger 캐시보다 크지 만 파일 시스템 캐시에 여전히 적합합니다.
최신 운영 체제 캐시는 자주 읽기 성능을 향상시키기 위해 파일에 자주 액세스했습니다. 파일이 이미 메모리에 있으므로 캐시 된 파일에 액세스해도 물리적 판독 값이 발생하지 않습니다. Free Linux 명령에 표시되는 파일 시스템 캐시 통계는 파일 시스템 캐시의 크기를 자세히 설명합니다.
레코드 수를 2 백만에서 3 백만으로 증가 시켰을 때, 우리는 데이터의 총 크기를 3.66GB로 증가 시켰습니다.
이 메트릭은 WiredTiger 캐시에 평균 548Mbps를 읽었 음을 분명히 보여 주지만 파일 시스템 캐시 메트릭을 확인할 때는 99.9%의 적중률을 볼 수 있습니다.
이 테스트의 경우, 우리는 초당 66,720 개의 작업이 초당 66,720 개의 작업이 수행되며, 기준선에 비해 8% 감소한 반면, 우리의 기준선은 WiredTiger 캐시 서비스에서만 이루어졌습니다.
이 경우 예상대로 디스크 성능 감소는 전체 처리량 (각각 64,484 및 64,229 작업)에 크게 영향을 미치지 않습니다. 문서가 압축하기 쉬운 경우 파일 시스템 캐시를 읽는 것에 대한 페널티는 더 분명하거나 CPU가 제한 요소 인 경우 더 분명합니다.
우리는 P99 대기 시간이 53 – .55ms로 54% 증가한 것을 발견했습니다.
작업 세트는 WiredTiger 및 파일 시스템 캐시보다 약간 큽니다
우리는 WiredTiger 및 파일 시스템 캐시가 함께 작동하여 쿼리를 제공하기위한 데이터를 제공한다고 결정했습니다. 그러나 레코드 수를 3 백만에서 4 백만으로 늘리면 더 이상 이러한 캐시를 활용하여 쿼리를 제공 할 수 없습니다. 데이터 크기는 WiredTiger 캐시보다 82% 더 큰 4.8GB로 증가했습니다.
여기서, 우리는 WiredTiger 캐시를 257.4 Mbps로 읽습니다. 파일 시스템 캐시 적중률은 93-96%로 줄어 듭니다. 이는 읽기의 4-7%가 디스크에서 물리적 판독 값으로 이어집니다.
사용 가능한 IOP 및 디스크 대기 시간을 변경하면이 테스트의 성능에 큰 영향을 미칩니다.
99 번째 백분위 수의 응답 지연이 추가로 증가합니다. 장면 1:19 밀리 초, 장면 2 : 171 밀리 초, 장면 3 : 770 밀리 초, 캐시의 상황에 비해 43 배, 389 배 및 1751 배입니다.
는 완전히 캐싱 친화적 인 이전 테스트와 비교하여 MongoDB가 5000 IOP를 제공 할 때 성능이 75% 감소했습니다. 시나리오 2 및 시나리오 3은 각각 초당 5139.5 및 737.95 작업을 달성하여 IO 병목 현상을 추가로 증명했습니다.
작업 세트는 WiredTiger 및 파일 시스템 캐시보다 훨씬 큽니다
5 백만 레코드로 이동하면 데이터와 인덱스 크기를 6.09GB로 늘립니다. 우리는 IOP 아래의 처리량을 볼 수 있습니다. 이 경우 WiredTiger의 81%가 파일 시스템 캐시에서 읽는 81%를 제공하고 있지만 디스크 오버플로의 읽기는 IO를 포화하고 있습니다. 이 테스트의 파일 시스템 캐시 읽기 속도는 71, 8.3 및 1.9Mbps입니다.
99 번째 백분위 수의 응답 지연이 추가로 증가합니다. 시나리오 1 : 22ms, 시나리오 2 : 199ms, 시나리오 3 : 810ms는 캐시 내 응답 대기 시간에 비해 52 배, 454 배 및 1841 배입니다. 여기서 디스크 변경은 처리량에 큰 영향을 미칩니다.
초록
이 일련의 테스트를 통해 우리는 두 가지 주요 요점을 증명했습니다.
작업 세트가 캐싱에 적합한 경우 디스크 성능은 애플리케이션 성능에 큰 영향을 미치지 않습니다.
디스크 성능은 작업 세트가 사용 가능한 메모리를 초과 할 때 처리량의 제한 요소가됩니다.
MongoDB가 메모리와 디스크를 활용하는 방법 이해는 배포 크기 조정 및 성능 이해의 중요한 부분입니다. WiredTiger 스토리지 엔진의 내부 작업은 하드웨어를 최대한 활용하려고 시도하지만 메모리와 디스크는 워크로드의 전체 성능 특성에 영향을 미치는 두 가지 중요한 인프라 부분입니다.
MongoDB의 메모리 및 디스크 성능에 대한 자주 묻는 질문
MongoDB는 메모리와 디스크 공간을 어떻게 활용합니까?
MongoDB는 메모리와 디스크 공간을 사용하여 데이터를 저장하고 관리합니다. 데이터 스토리지에 메모리 매핑 파일 시스템을 사용하므로 전체 데이터 파일을 RAM에 매핑합니다. 이를 통해 MongoDB는 큰 데이터 세트를 효율적으로 처리 할 수 있습니다. 운영 체제의 가상 메모리 서브 시스템 관리 세부 사항, 필요에 따라 메모리로 데이터를 교환합니다. 반면에 디스크 공간은 데이터 파일, 인덱스 및 로그를 저장하는 데 사용됩니다. MongoDB는 대형 청크에 디스크 공간을 자동으로 할당하여 쓰기 작업을 최적화합니다.
MongoDB에서 높은 디스크 I/O 사용의 영향은 무엇입니까?
높은 디스크 I/O 사용은 MongoDB 데이터베이스의 성능에 심각한 영향을 미칩니다. 읽기 및 쓰기 작업이 느려져서 응용 프로그램의 전반적인 성능을 줄일 수 있습니다. 이는 실시간 데이터 액세스가 필요한 응용 프로그램에 특히 문제가됩니다. 높은 디스크 I/O 사용은 시스템이 디스크 작동을 관리하는 데 더 많은 시간을 소비하기 때문에 CPU 사용량을 증가시킬 수 있습니다. MongoDB에서 디스크 공간 사용을 모니터링하는 방법은 무엇입니까?
MongoDB는 디스크 공간 사용을 모니터링하는 몇 가지 도구를 제공합니다. DB.stats () 명령은 데이터 파일의 총 크기 및 인덱스를 포함하여 데이터베이스의 높은 수준의 개요를 제공합니다. db.collection.stats () 명령은 데이터 및 인덱스의 크기를 포함하여 특정 컬렉션에 대한 자세한 정보를 제공합니다. 또한 MongoDB Atlas (MongoDB가 제공하는 데이터베이스-서비스 제품)는 높은 디스크 공간 사용에 대한 경고를 포함하여 포괄적 인 모니터링 도구 세트를 제공합니다.
MongoDB에서 높은 디스크 공간 활용을 해결하는 방법은 무엇입니까?
MongoDB에서 높은 디스크 공간 활용을 해결하기위한 몇 가지 전략이 있습니다. 한 가지 방법은 불필요한 데이터 또는 컬렉션을 삭제하는 것입니다. 또 다른 접근법은 데이터 파일을 훼손하고 사용되지 않은 디스크 공간을 재활용하는 Compact 명령을 사용하는 것입니다. 그러나이 명령에는 많은 무료 디스크 공간이 필요하며 데이터베이스 성능에 영향을 줄 수 있습니다. 샤딩 (데이터를 여러 서버에 배포)하면 디스크 공간 사용을 관리하는 데 도움이 될 수 있습니다.
RAM 드라이브는 무엇이며 MongoDB와 어떤 관련이 있습니까?
램 드라이브는 운영 체제가 디스크 드라이브로 간주하는 메모리입니다. RAM은 디스크 스토리지보다 훨씬 빠르기 때문에 RAM 드라이브를 사용하면 고속 데이터 액세스가 필요한 응용 프로그램의 성능을 크게 향상시킬 수 있습니다. 그러나 RAM은 휘발성이므로 시스템이 다시 시작될 때 RAM 드라이브에 저장된 데이터가 손실됩니다. MongoDB와 관련하여 RAM 드라이브를 사용하여 자주 액세스하는 데이터 또는 인덱스를 저장하여 성능을 향상시킬 수 있습니다. 그러나 시스템이 다시 시작되면 데이터 손실이 발생할 수 있으므로주의해서 수행해야합니다.
MongoDB는 메모리 관리를 어떻게 처리합니까?
MongoDB는 메모리 관리를 위해 기본 운영 체제에 의존합니다. 메모리 매핑 파일 시스템을 사용하여 운영 체제의 가상 메모리 서브 시스템이 메모리의 데이터 세부 사항과 디스크 데이터의 데이터를 관리 할 수 있습니다. 이 접근법을 사용하면 MongoDB가 큰 데이터 세트를 효율적으로 처리 할 수 있지만 MongoDB의 메모리 사용량은 동일한 시스템에서 실행되는 다른 프로세스의 영향을받을 수 있음을 의미합니다.
MongoDB의 메모리 사용을 최적화하는 방법은 무엇입니까?
MongoDB의 메모리 사용을 최적화하기위한 몇 가지 전략이 있습니다. 한 가지 방법은 작업 세트가 메모리에 적합한 지 확인하는 것입니다. 작업 세트는 자주 데이터의 일부에 액세스됩니다. 작업 세트가 메모리에 적합한 경우 MongoDB는 비용이 많이 드는 디스크 I/O 작업을 피할 수 있습니다. 또 다른 방법은 인덱스를 효율적으로 사용하는 것입니다. 인덱스는 쿼리 성능을 크게 향상시킬 수 있지만 메모리를 소비 할 수도 있습니다. 따라서 인덱스를 현명하게 만들고 메모리 사용에 미치는 영향을 모니터링하는 것이 중요합니다.
MongoDB는 디스크 I/O 작동을 어떻게 처리합니까?
MongoDB는 Write-Pre-Logs를 사용하여 데이터 무결성을 보장합니다. 데이터 파일을 변경하기 전에 먼저 로그에 기록됩니다. 이를 통해 MongoDB는 충돌 또는 정전에서 회복 할 수 있습니다. 그러나 로깅은 또한 디스크 I/O 작동을 증가시켜 성능에 영향을 줄 수 있습니다. 따라서 디스크 I/O 사용을 모니터링하고 필요한 경우 최적화하기위한 조치를 취하는 것이 중요합니다.
MongoDB의 디스크 I/O 작동을 최적화하는 방법은 무엇입니까?
MongoDB의 디스크 I/O 작동을 최적화하기위한 몇 가지 전략이 있습니다. 한 가지 방법은 기존 하드 드라이브보다 더 많은 IOP를 처리 할 수있는 SSD를 사용하는 것입니다. 또 다른 방법은 쓰기 작업에 최적화 된 RAID 구성을 사용하는 것입니다. 또한 Disk I/O에 대한 영향을 줄이기 위해 MongoDB의 로깅 설정을 조정할 수 있습니다. 그러나 이것은 데이터 무결성에 영향을 줄 수 있으므로주의해서 수행해야합니다.
메모리 및 디스크 성능은 MongoDB 데이터베이스의 전반적인 성능에 어떤 영향을 미칩니 까?
메모리 및 디스크 성능은 MongoDB 데이터베이스의 전반적인 성능에서 핵심 요소입니다. 작업 세트가 메모리에 적합한 경우 MongoDB는 비용이 많이 드는 디스크 I/O 작업을 피할 수있어 성능을 크게 향상시킬 수 있습니다. 마찬가지로 효과적인 디스크 I/O 작업은 쓰기 작업의 성능을 향상시키고 데이터 무결성을 보장 할 수 있습니다. 따라서 MongoDB 데이터베이스의 최상의 성능을 보장하기 위해 메모리 및 디스크 성능을 모니터링하고 최적화하는 것이 중요합니다.
위 내용은 메모리 및 디스크 성능이 MongoDB 데이터베이스에 미치는 영향의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!