Я хотів би дізнатися найкращу можливу конфігурацію / обладнання для доставки 40 Гбіт / с з одного сервера в цьому питанні.
Ситуація
У нас є проксі-сервер для відеообміну, який вивантажує піки з повільних серверів зберігання. Весь трафік лише HTTP. Сервер діє як зворотний проксі (файли, які не кешовані на сервері) і веб-сервер (файли, що зберігаються на локальних дисках).
Наразі на серверах зберігання резервних копій файли ростуть приблизно як 100TB файлів.
Механізм кешування реалізований самостійно, і це питання не стосується кешування самого себе, оскільки він працює дуже добре - на даний момент постачає 14 Гбіт / с, передає на бек-сервери лише 2 Гбіт / с. Тож використання кешу добре.
Мета
Досягнення 40 Гбіт / с або навіть більше пропускної здатності від однієї машини.
Обладнання 1
HW: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), 16 Гб оперативної пам'яті DDR4, 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
- Кінцевий термін роботи планувальника вводу / виводу
- iptables порожні (незавантажені модулі)
- Файлова система: XFS
Nginx:
- sendfile off
- aio нитки
- directio 1M
- tcp_nopush увімкнено
- tcp_nodelay увімкнено
Як видно з графіків, нам вдалося натиснути 12,5 Гбіт / с. На жаль, сервер не відповідав.
Є дві речі, які привернули мою увагу. Перший - це велика кількість IRQ. У цьому випадку у мене, на жаль, немає графіків з / proc / переривання. Друга річ - це високе завантаження системи, яке, на мою думку, було спричинене тим, що kswapd0 мав проблеми працювати лише з 16G оперативної пам’яті.
Обладнання 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), оперативна пам'ять DDR4 128 ГБ, 2x Supermicro 10G STGN-i1S
SSD, конфігурація системи такі ж, як і апаратні 1. Nginx - це sendfile on (aio / sendfile порівняно далі).
Це здається кращим, тому тепер, коли у нас є сервер, який працює в піках, ми можемо спробувати деякі оптимізації.
Sendfile vs aio теми
Я намагався вимкнути sendfile і використовувати замість нього потоки aio.
- sendfile off
- aio нитки
- directio 1M (що відповідає всім файлам, які ми маємо)
проти
- sendfile on
Потім о 15:00 я переключився на sendfile і перезавантажив nginx (так що знадобилося деякий час, щоб закінчити існуючі з'єднання). Приємно, що використання накопичувача (вимірюється йостатом) знизилося. У трафіку нічого не змінилося (на жаль, zabbix вирішив не збирати дані з bond0).
sendfile включено / вимкнено
Щойно спробував переключити надсилання / вимкнення. Нічого не змінилося, крім перепланування перерв.
irqbalancer як сервер / cron / disabled
Як згадував @lsd, я намагався налаштувати irqbalancer для виконання через cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
На жаль, це не допомогло в моєму випадку. Одна з мережевих карт почала вести себе дивно:
Я не зміг знайти те, що було не так у графіках, і як це сталося на наступний день знову, я увійшов на сервер і побачив, що одне ядро на 100% (використання системи).
Я спробував запустити irqbalance як послугу, результат був все той же.
Тоді я вирішив використовувати скрипт set_irq_affinity, і він негайно усунув проблему, і сервер знову натиснув 17 Гбіт / с.
Обладнання 3
Ми здійснили оновлення до нового обладнання: 2U 24 (+2) накопичувачів шасі (6xSFF), 2x Xeon E5-2620v4, 64 ГБ оперативної пам’яті DDR4 (модулі 4x16GB), 13x SSD, 2x Supermicro (з мікросхемою Intel), мережеві карти. Нові процесори значно покращили продуктивність.
Залишається поточна установка - sendfile і т. Д. Різниця полягає лише в тому, що ми дозволяємо лише одному ЦП обробляти обидві мережеві карти (за допомогою сценарію set_irq_affinity).
Досягнуто ліміту 20 Гбіт / с.
Наступна мета? 30 Гбіт / с.
Не соромтеся знімати на мене ідеї, як покращити продуктивність. Я буду радий перевірити це в прямому ефірі і поділитися деякими важкими графіками тут.
Будь-які ідеї, як боротися з великою кількістю SoftIRQ на процесорі?
Це не питання щодо планування потужностей - у мене вже є обладнання та трафік. Я завжди можу розділити трафік на кілька серверів (що мені доведеться робити в майбутньому в будь-якому разі) і виправити проблему грошима. Це, однак, питання оптимізації системи та налаштування продуктивності в реальному реальному сценарії.