Saya ingin mengetahui konfigurasi / perangkat keras terbaik untuk memberikan 40Gbps dari satu server dalam pertanyaan ini.
Situasi
Kami memiliki server proxy berbagi video yang mengeluarkan puncak dari server penyimpanan lambat di belakangnya. Semua lalu lintas hanya HTTP. Server bertindak sebagai proksi terbalik (file yang tidak di-cache di server) dan server web (file yang disimpan di drive lokal).
Saat ini ada sesuatu seperti 100TB file dan tumbuh di server penyimpanan backend.
Mekanisme caching diimplementasikan secara independen dan pertanyaan ini bukan tentang caching itu sendiri karena berfungsi dengan sangat baik - saat ini memberikan 14Gbps, lolos ke server backend hanya 2Gbps. Jadi penggunaan cache bagus.
Tujuan
Mencapai 40Gbps atau bahkan lebih banyak throughput dari satu mesin.
Perangkat Keras 1
HW: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), RAM DDR4 16GB, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD: Samsung 1x 512GB, Samsung 2x500 GB, Intel 535 2x480GB, Intel S3500 1x 240GB
Sistem:
- irqbalancer berhenti
- set_irq_affinity untuk setiap antarmuka (melalui skrip di tarball driver ixgbe)
- ixgbe-4.3.15
- Batas waktu penjadwal I / O
- iptables kosong (modul tidak dimuat)
- Sistem File: XFS
Nginx:
- lepas sendfile
- utas aio
- directio 1 jt
- tcp_nopush aktif
- tcp_nodelay aktif
Seperti yang terlihat pada grafik, kami dapat mendorong 12,5Gbps. Sayangnya server tidak responsif.
Ada 2 hal yang menarik perhatian saya. Yang pertama adalah jumlah IRQ yang tinggi. Dalam hal ini saya sayangnya tidak memiliki grafik dari / proc / interupsi. Yang kedua adalah beban sistem yang tinggi, yang saya pikir disebabkan oleh kswapd0 mengalami masalah untuk bekerja dengan 16G RAM saja.
Perangkat keras 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), RAM DDR4 128GB, 2x Supermicro 10G STGN-i1S
SSD, Konfigurasi sistem sama dengan perangkat keras 1. Nginx diaktifkan sendfile (aio / sendfile dibandingkan lebih jauh).
Ini tampaknya lebih baik, jadi sekarang karena kita memiliki server, yang berfungsi dalam puncak, kita dapat mencoba beberapa optimasi.
Utas Sendfile vs aio
Saya mencoba untuk menonaktifkan sendfile dan menggunakan utas aio sebagai gantinya.
- lepas sendfile
- utas aio
- directio 1M (yang cocok dengan semua file yang kita miliki)
vs.
- sendfile aktif
Kemudian pada pukul 15:00 saya kembali ke sendfile dan memuat ulang nginx (jadi butuh beberapa saat untuk menyelesaikan koneksi yang ada). Sangat menyenangkan bahwa pemanfaatan drive (diukur dengan iostat) turun. Tidak ada yang berubah pada traffic (sayangnya zabbix memutuskan untuk tidak mengumpulkan data dari bond0).
on / off sendfile
Baru saja mencoba untuk mengaktifkan / menonaktifkan send. Tidak ada yang berubah kecuali menjadwal ulang interupsi.
irqbalancer sebagai server / cron / dinonaktifkan
Seperti yang disebutkan @ld saya mencoba mengatur irqbalancer untuk dieksekusi melalui cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
Sayangnya itu tidak membantu dalam kasus saya. Salah satu kartu jaringan mulai berperilaku aneh:
Saya tidak dapat menemukan apa yang salah dalam grafik dan seperti yang terjadi pada hari berikutnya lagi, saya masuk ke server dan melihat bahwa satu inti berada pada 100% (penggunaan sistem).
Saya mencoba memulai irqbalance sebagai layanan, hasilnya masih sama.
Kemudian saya memutuskan untuk menggunakan skrip set_irq_affinity dan itu segera memperbaiki masalah dan server mendorong 17Gbps lagi.
Perangkat Keras 3
Kami melakukan peningkatan ke perangkat keras baru: 2U 24 (+2) drive chassis (6xSFF), 2x Xeon E5-2620v4, 64GB DDR4 RAM (modul 4x16GB), 13x SSD, kartu jaringan 2x Supermicro (dengan chip Intel). CPU baru banyak meningkatkan kinerjanya.
Pengaturan saat ini tetap - sendfile, dll. Satu-satunya perbedaan adalah kita membiarkan hanya satu CPU menangani kedua kartu jaringan (melalui skrip set_irq_affinity).
Batas 20Gbps telah tercapai.
Tujuan selanjutnya? 30Gbps.
Merasa bebas untuk menembak saya ide bagaimana meningkatkan kinerja. Saya akan dengan senang hati mengujinya secara langsung dan membagikan beberapa grafik berat di sini.
Ada ide bagaimana menangani sejumlah besar SoftIRQ pada cpu?
Ini bukan pertanyaan tentang perencanaan kapasitas - saya sudah memiliki perangkat keras dan lalu lintas. Saya selalu dapat membagi lalu lintas ke beberapa server (yang harus saya lakukan di masa depan pula) dan memperbaiki masalah dengan uang. Namun ini adalah pertanyaan tentang optimasi sistem dan penyempurnaan kinerja dalam skenario nyata.