이 질문에 단일 서버에서 40Gbps를 제공 할 수있는 최상의 구성 / 하드웨어를 찾고 싶습니다.
상태
우리는 느린 스토리지 서버에서 피크를 오프로드하는 비디오 공유 프록시 서버가 있습니다. 모든 트래픽은 HTTP 전용입니다. 서버는 리버스 프록시 (서버에 캐시되지 않은 파일) 및 웹 서버 (로컬 드라이브에 저장된 파일)의 역할을합니다.
현재 100TB의 파일과 같은 것이 백엔드 스토리지 서버에서 증가하고 있습니다.
캐싱 메커니즘은 독립적으로 구현되며이 질문은 캐싱 자체에 관한 것이 아닙니다. 현재 14Gbps를 제공하고 백엔드 서버로 2Gbps 만 전달하는 것이 매우 효과적입니다. 따라서 캐시 사용량이 좋습니다.
골
단일 머신에서 40Gbps 이상의 처리량을 달성하십시오.
하드웨어 1
HW : Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), 16GB DDR4 RAM, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD : 1x 512GB Samsung, 2x 500GB Samsung, 2x480GB Intel 535, 1x 240GB Intel S3500
체계:
- irqbalancer가 중지되었습니다
- 각 인터페이스에 대한 set_irq_affinity (ixgbe 드라이버 tarball의 스크립트를 통해)
- ixgbe-4.3.15
- I / O 스케줄러 마감일
- iptables 비어 있음 (로드되지 않은 모듈)
- 파일 시스템 : XFS
Nginx :
- sendfile off
- 아이오 스레드
- directio 1M
- tcp_nopush 켜기
- tcp_nodelay 켜기
그래프에서 볼 수 있듯이 12.5Gbps를 푸시 할 수있었습니다. 불행히도 서버가 응답하지 않았습니다.
내가 주목 한 두 가지가 있습니다. 첫 번째는 많은 양의 IRQ입니다. 이 경우 불행히도 / proc / interrupts의 그래프는 없습니다. 두 번째는 시스템 부하가 높기 때문에 kswapd0이 16G RAM에서만 작동하는 데 문제가 있다고 생각합니다.
하드웨어 2
HW : Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), 128GB DDR4 RAM, 2x Supermicro 10G STGN-i1S
SSD, 시스템 구성은 하드웨어 1과 동일합니다. Nginx는 sendfile을 켭니다 (aio / sendfile과 비교).
이제는 더 나은 것 같습니다. 이제 서버가 정점에서 작동하므로 최적화를 시도 할 수 있습니다.
Sendfile과 AIO 스레드
sendfile을 비활성화하고 대신 aio 스레드를 사용하려고했습니다.
- sendfile off
- 아이오 스레드
- directio 1M (우리가 가진 모든 파일과 일치)
vs
- sendfile on
그런 다음 15:00에 sendfile로 다시 전환하고 nginx를 다시로드했습니다 (따라서 기존 연결을 완료하는 데 시간이 걸렸습니다). 드라이브 사용률 (iostat로 측정)이 다운 된 것이 좋습니다. 트래픽에 변화가 없었습니다 (불행히 zabbix는 bond0에서 데이터를 수집하지 않기로 결정했습니다).
sendfile 켜기 / 끄기
보내기 / 끄기를 전환하려고했습니다. 일정 변경 인터럽트를 제외하고는 아무것도 변경되지 않았습니다.
서버 / 크론 / 비활성화 된 irqbalancer
@lsd가 언급했듯이 irqbalancer가 cron을 통해 실행되도록 설정하려고했습니다.
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
불행히도 내 경우에는 도움이되지 않았습니다. 네트워크 카드 중 하나가 이상하게 동작하기 시작했습니다.
그래프에서 무엇이 잘못되었는지 찾을 수 없었고 다음 날 다시 발생했을 때 서버에 로그인하여 하나의 코어가 100 % (시스템 사용량)임을 알 수있었습니다.
irqbalance를 서비스로 시작하려고했지만 결과는 여전히 동일합니다.
그런 다음 set_irq_affinity 스크립트를 사용하기로 결정하고 문제를 즉시 해결하고 서버가 17Gbps를 다시 푸시했습니다.
하드웨어 3
새로운 하드웨어로 업그레이드했습니다 : 2U 24 (+2) 드라이브 섀시 (6xSFF), 2x Xeon E5-2620v4, 64GB DDR4 RAM (4x16GB 모듈), 13x SSD, 2x Supermicro (Intel 칩 포함) 네트워크 카드. 새로운 CPU는 성능을 크게 향상 시켰습니다.
현재 설정은 sendfile 등으로 유지됩니다. 단 하나의 CPU 만 set_irq_affinity 스크립트를 통해 두 네트워크 카드를 모두 처리 할 수 있습니다.
20Gbps 한도에 도달했습니다.
다음 목표? 30Gbps.
성능을 향상시키는 방법에 대한 아이디어를 자유롭게 촬영하십시오. 나는 그것을 라이브 테스트하고 여기에 무거운 그래프를 공유하게되어 기쁩니다.
CPU에서 많은 양의 SoftIRQ를 처리하는 방법에 대한 아이디어가 있습니까?
용량 계획에 관한 질문은 아닙니다. 하드웨어와 트래픽이 이미 있습니다. 나는 항상 트래픽을 여러 서버로 나눌 수 있으며 (어쨌든 나중에해야 할) 돈으로 문제를 해결할 수 있습니다. 그러나 이것은 실제 라이브 시나리오에서 시스템 최적화 및 성능 조정에 관한 질문입니다.