Linux를 사용하는 일부 Sun 하드웨어에서 스토리지 설정을 최적화하려고합니다. 어떤 생각이라도 대단히 감사하겠습니다.
우리는 다음과 같은 하드웨어를 가지고 있습니다 :
- 썬 블레이드 X6270
- 2 * LSISAS1068E SAS 컨트롤러
- 1TB 디스크가있는 2 개의 Sun J4400 JBOD (JBOD 당 24 개의 디스크)
- 페도라 코어 12
- FC13의 2.6.33 릴리스 커널 (FC12의 최신 2.6.31 커널을 사용해도 동일한 결과)
SAS 하드웨어에 대한 데이터 시트는 다음과 같습니다.
http://www.sun.com/storage/storage_networking/hba/sas/PCIe.pdf
PCI Express 1.0a, 8x 레인을 사용하고 있습니다. 레인 당 250MB / 초의 대역폭으로 SAS 컨트롤러 당 2000MB / 초를 수행 할 수 있어야합니다.
각 컨트롤러는 포트 당 3Gb / sec를 수행 할 수 있으며 2 개의 4 포트 PHY가 있습니다. 컨트롤러에서 JBOD로 두 PHY를 연결합니다. 따라서 JBOD와 컨트롤러 사이에는 2 개의 PHY * 4 개의 SAS 포트 * 3Gb / sec = 24Gb / sec의 대역폭이 있으며 이는 PCI Express 대역폭보다 더 큽니다.
쓰기 캐싱을 사용하고 큰 쓰기를 수행 할 때 각 디스크는 약 80MB / 초 (디스크 시작 부근)를 유지할 수 있습니다. 디스크 24 개로 JBOD 당 1920MB / 초를 수행 할 수 있습니다.
다중 경로 { rr_min_io 100 UID 0 path_grouping_policy 멀티 버스 장애 복구 매뉴얼 path_selector "라운드 로빈 0" rr_weight 우선 순위 별명 somealias no_path_retry 큐 모드 0644 여자 0 wwid somewwid }
rr_min_io에 50, 100, 1000의 값을 시도했지만 별 차이가없는 것 같습니다.
다양한 rr_min_io와 함께 dd를 시작하는 사이에 약간의 지연을 추가하여 모두 동일한 PHY를 동시에 쓰는 것을 막으려 고했지만 아무런 차이가 없었으므로 I / O가 올바르게 확산되고 있다고 생각합니다.
/ proc / interrupts에 따르면 SAS 컨트롤러는 "IR-IO-APIC-fasteoi"인터럽트 체계를 사용하고 있습니다. 어떤 이유로 머신의 코어 # 0 만 이러한 인터럽트를 처리합니다. 각 SAS 컨트롤러의 인터럽트를 처리하기 위해 별도의 코어를 할당하여 성능을 약간 향상시킬 수 있습니다.
에코 2> / proc / irq / 24 / smp_affinity 에코 4> / proc / irq / 26 / smp_affinity
dd를 사용하여 디스크에 쓰면 코어 # 4에 의해 처리되는 "함수 호출 인터럽트"(무엇인지 알 수 없음)가 생성되므로 다른 프로세스도이 코어에서 제외시킵니다.
48 dd (각 디스크 당 하나씩)를 실행하여 인터럽트를 처리하지 않는 코어에 할당합니다.
taskset -c somecore dd if = / dev / zero of = / dev / mapper / mpathx oflag = direct bs = 128M
oflag = direct는 모든 종류의 버퍼 캐시가 관여하지 않도록합니다.
내 코어 중 어느 것도 최대로 보이지 않습니다. 인터럽트를 다루는 코어는 대부분 유휴 상태이며 다른 모든 코어는 예상대로 I / O를 기다리고 있습니다.
Cpu0 : 0.0 % us, 1.0 % sy, 0.0 % ni, 91.2 % id, 7.5 % wa, 0.0 % hi, 0.2 % si, 0.0 % st Cpu1 : 0.0 % us, 0.8 % sy, 0.0 % ni, 93.0 % id, 0.2 % wa, 0.0 % hi, 6.0 % si, 0.0 % st Cpu2 : 0.0 % us, 0.6 % sy, 0.0 % ni, 94.4 % id, 0.1 % wa, 0.0 % hi, 4.8 % si, 0.0 % st Cpu3 : 0.0 % us, 7.5 % sy, 0.0 % ni, 36.3 % id, 56.1 % wa, 0.0 % hi, 0.0 % si, 0.0 % st Cpu4 : 0.0 % us, 1.3 % sy, 0.0 % ni, 85.7 % id, 4.9 % wa, 0.0 % hi, 8.1 % si, 0.0 % st Cpu5 : 0.1 % us, 5.5 % sy, 0.0 % ni, 36.2 % id, 58.3 % wa, 0.0 % hi, 0.0 % si, 0.0 % st Cpu6 : 0.0 % us, 5.0 % sy, 0.0 % ni, 36.3 % id, 58.7 % wa, 0.0 % hi, 0.0 % si, 0.0 % st Cpu7 : 0.0 % us, 5.1 % sy, 0.0 % ni, 36.3 % id, 58.5 % wa, 0.0 % hi, 0.0 % si, 0.0 % st Cpu8 : 0.1 % us, 8.3 % sy, 0.0 % ni, 27.2 % id, 64.4 % wa, 0.0 % hi, 0.0 % si, 0.0 % st Cpu9 : 0.1 % us, 7.9 % sy, 0.0 % ni, 36.2 % id, 55.8 % wa, 0.0 % hi, 0.0 % si, 0.0 % st CPU10 : 0.0 % us, 7.8 % sy, 0.0 % ni, 36.2 % id, 56.0 % wa, 0.0 % hi, 0.0 % si, 0.0 % st CPU11 : 0.0 % us, 7.3 % sy, 0.0 % ni, 36.3 % id, 56.4 % wa, 0.0 % hi, 0.0 % si, 0.0 % st Cpu12 : 0.0 % us, 5.6 % sy, 0.0 % ni, 33.1 % id, 61.2 % wa, 0.0 % hi, 0.0 % si, 0.0 % st CPU13 : 0.1 % us, 5.3 % sy, 0.0 % ni, 36.1 % id, 58.5 % wa, 0.0 % hi, 0.0 % si, 0.0 % st CPU14 : 0.0 % us, 4.9 % sy, 0.0 % ni, 36.4 % id, 58.7 % wa, 0.0 % hi, 0.0 % si, 0.0 % st CPU15 : 0.1 % us, 5.4 % sy, 0.0 % ni, 36.5 % id, 58.1 % wa, 0.0 % hi, 0.0 % si, 0.0 % st
이 모든 것을 감안할 때 "dstat 10"을 실행하여보고 된 처리량은 2200-2300MB / 초 범위입니다.
위의 수학을 감안할 때 2 * 1920 ~ = 3600 + MB / 초 범위의 것을 기대합니다.
누락 된 대역폭이 어디로 갔는지 아는 사람이 있습니까?
감사!