Bu soruda tek bir sunucudan 40Gbps sunmak için mümkün olan en iyi yapılandırmayı / donanımı bulmak istiyorum.
Durum
Arkasındaki yavaş depolama sunucularından zirveleri boşaltan bir video paylaşım proxy sunucumuz var. Tüm trafik yalnızca HTTP'dir. Sunucu, ters proxy (sunucuda önbelleğe alınmamış dosyalar) ve bir web sunucusu (yerel sürücülerde depolanan dosyalar) gibi davranır.
Şu anda 100TB dosya ve arka uç depolama sunucularında büyüyen bir şey var.
Önbellek mekanizması bağımsız olarak uygulanır ve bu soru çok iyi çalıştığı için kendini önbelleğe almakla ilgili değildir - şu anda 14Gbps sağlar, arka uç sunucularına sadece 2Gbps geçer. Bu yüzden önbellek kullanımı iyidir.
Hedef
Tek bir makineden 40Gbps veya daha fazla verim elde edin.
Donanım 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
Sistem:
- irqbalancer durdu
- Her arabirim için set_irq_affinity (ixgbe sürücüsü tarball'ında komut dosyası aracılığıyla)
- ixgbe-4.3.15
- G / Ç zamanlayıcı son tarihi
- iptables boş (yüksüz modüller)
- Dosya sistemi: XFS
nginx:
- dosya gönderme
- aio konuları
- directio 1M
- tcp_nopush açık
- tcp_nodelay açık
Grafiklerde görüldüğü gibi, 12.5Gbps itebildik. Ne yazık ki sunucu yanıt vermiyordu.
Dikkatimi çeken 2 şey var. Birincisi yüksek miktarda IRQ. Bu durumda maalesef / proc / interrupts dizininden grafiklerim yok. İkinci şey, kswapd0'ın sadece 16G RAM ile çalışmak için problemleri olduğunu düşündüğüm yüksek sistem yüküydü.
Donanım 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), 128GB DDR4 RAM, 2x Supermicro 10G STGN-i1S
SSD, Sistem yapılandırması donanım 1 ile aynıdır. Nginx sendfile açık (aio / sendfile daha fazladır).
Bu daha iyi görünüyor, bu yüzden şimdi zirvelerde çalışan bir sunucumuz olduğu için bazı optimizasyonları deneyebiliriz.
Sendfile vs aio konuları
Sendfile devre dışı bırakmak ve bunun yerine aio konularını kullanmayı denedim.
- dosya gönderme
- aio konuları
- directio 1M (sahip olduğumuz tüm dosyalarla eşleşir)
vs
- göndermek
Sonra 15: 00'de sendfile'a geri döndüm ve nginx'i yeniden yükledim (bu nedenle mevcut bağlantıları bitirmek biraz zaman aldı). Sürücü kullanımının (iostat ile ölçülen) azalması güzel. Trafikte hiçbir şey değişmedi (maalesef zabbix bond0'dan veri toplamamaya karar verdi).
gönderme dosyası açık / kapalı
Sadece göndermeyi açmayı / kapatmayı denedi. Yeniden zamanlama kesintileri dışında hiçbir şey değişmedi.
irqbalancer sunucu / cron / devre dışı
@ Lsd belirtildiği gibi ben irqbalancer cron üzerinden yürütülmesini ayarlamaya çalıştı:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
Ne yazık ki benim durumumda yardımcı olmadı. Ağ kartlarından biri garip davranmaya başladı:
Grafiklerde neyin yanlış olduğunu bulamadım ve ertesi gün tekrar olduğu gibi, sunucuya giriş yaptım ve bir çekirdeğin% 100 (sistem kullanımı) olduğunu gördüm.
İrqbalance'ı bir hizmet olarak başlatmaya çalıştım, sonuç hala aynıydı.
Sonra set_irq_affinity komut dosyasını kullanmaya karar verdim ve sorunu hemen düzeltti ve sunucu 17Gbps'yi tekrar itti.
Donanım 3
Yeni donanıma yükseltme yaptık: 2U 24 (+2) sürücü kasası (6xSFF), 2x Xeon E5-2620v4, 64GB DDR4 RAM (4x16GB modüller), 13x SSD, 2x Supermicro (Intel yongalı) ağ kartları. Yeni CPU'lar performansı çok artırdı.
Geçerli kurulum kalır - sendfile, vb. Tek fark, yalnızca tek bir CPU'nun her iki ağ kartını da işlemesine izin vermemizdir (set_irq_affinity komut dosyası aracılığıyla).
20Gbps sınırına ulaşıldı.
Sıradaki hedef? 30Gbps.
Performansı nasıl artıracağına dair fikirleri bana çekinmekten çekinmeyin. Canlı olarak test etmekten ve burada ağır grafikler paylaşmaktan mutluluk duyacağım.
CPU'da büyük miktarda SoftIRQ'larla nasıl başa çıkacağınız hakkında bir fikriniz var mı?
Bu kapasite planlamasıyla ilgili bir soru değil - Donanım ve trafiğe zaten sahibim. Ben her zaman (ki ben yine de gelecekte yapmak zorunda kalacak) çeşitli sunuculara trafik bölmek ve para ile sorunu giderebilirsiniz. Ancak bu, gerçek bir canlı senaryoda sistem optimizasyonu ve performans düzeltme ile ilgili bir sorudur.