Чому мій веб-сервер припиняє з'єднання із скиданням TCP при великому навантаженні?


10

У мене невелика установка VPS з nginx. Я хочу витіснити якомога більше продуктивності, тому я експериментував з оптимізацією та тестуванням навантаження.

Я використовую Blitz.io для тестування завантаження, отримавши невеликий статичний текстовий файл, і зіткнувся з незвичайною проблемою, коли сервер, як видається, надсилає TCP скидання, як тільки кількість одночасних підключень досягне приблизно 2000. Я знаю, що це дуже велика кількість, але від використання htop-сервера все ще є достатньо запасу часу та пам'яті процесора, тому я хотів би розібратися в джерелі цього питання, щоб побачити, чи зможу я ще більше просунути його.

Я працюю на Ubuntu 14.04 LTS (64-розрядний) на 2 ГБ Linode VPS.

У мене недостатньо репутації, щоб опублікувати цей графік безпосередньо, тому ось посилання на графік Blitz.io:

введіть тут опис зображення

Ось те, що я зробив, щоб спробувати з’ясувати джерело проблеми:

  • Значення конфігурації nginx worker_rlimit_nofileвстановлено на 8192
  • вже nofileвстановлені в 64000 для твердих і м'яких обмежень для rootі www-dataкористувача (то , що Nginx працює як) в/etc/security/limits.conf
  • немає жодних ознак, в чому щось не /var/log/nginx.d/error.logтак

  • У мене налаштування ufw, але немає обмежувальних норм. Журнал ufw вказує, що нічого не блокується, і я спробував відключити ufw з тим же результатом.

  • Показових помилок у програмі немає /var/log/kern.log
  • Показових помилок у програмі немає /var/log/syslog
  • Я додав наступні значення /etc/sysctl.confі завантажував їх sysctl -pбез ефекту:

    net.ipv4.tcp_max_syn_backlog = 1024
    net.core.somaxconn = 1024
    net.core.netdev_max_backlog = 2000
    

Будь-які ідеї?

EDIT: Я зробив новий тест, розширивши 3000 підключень у дуже маленькому файлі (всього 3 байти). Ось графік Blitz.io:

Графік Blitz.io

Знову ж таки, за словами Бліц, всі ці помилки - це помилки "скидання з’єднання TCP".

Ось графік пропускної здатності Лінода. Майте на увазі, що це середня 5 хвилин, тому низький прохід фільтрується трохи (миттєва пропускна здатність, ймовірно, набагато вище), але все-таки це нічого:

введіть тут опис зображення

ЦП:

введіть тут опис зображення

I / O:

введіть тут опис зображення

Ось htopпід кінець тесту: htop

Я також захопив частину трафіку за допомогою tcpdump за іншим (але схожим на вигляд) тестом, починаючи захоплення, коли почалися входи помилки: sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

Ось файл, якщо хтось хоче його подивитися (~ 20 МБ): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing

Ось графік пропускної здатності від Wireshark:

введіть тут опис зображення (Рядок - це всі пакети, сині смужки - помилки TCP)

З моєї інтерпретації захоплення (і я не експерт), схоже, що прапорці TCP RST надходять із джерела тестування навантаження, а не з сервера. Отже, якщо припустити, що щось не так на стороні служби тестування навантажень, чи можна з впевненістю вважати, що це результат певного управління мережею або зменшення DDOS між службою тестування навантаження та моїм сервером?

Дякую!


Ваш провайдер робить якесь пом'якшення DDoS? Це може заважати вашому тесту.
Майкл Хемптон

@MichaelHampton Я досить впевнений, що Linode цього не робить.
ЄЕАА

Чи можете ви розмістити мережевий графік з панелі управління Linode? Яку пропускну здатність насправді займає цей тест?
ЄЕАА

Я трохи більше розслідував і оновив оригінальний пост з великою кількістю інформації. Я також підтвердив разом з Linode, що вони не роблять пом'якшення DDOS, хоча це не обов'язково означає, що постачальник мережі між службою тестування навантаження та Linode не робить жодної. Дякую!
Ерік Лебедь

1
Чи є причина, що ви встановили лише net.core.netdev_max_backlog2000? У кількох прикладах я бачив, що це на порядок вище для гігабітних (і 10Gig) з'єднань.
Моше Кац

Відповіді:


1

Можливо, існує будь-яка кількість джерел скидання з'єднання. Тестер навантаження може бути поза доступними ефемерними портами, з яких ініціювати з'єднання. У пристрої, який є на шляху (наприклад, брандмауер, що працює в NAT), може бути вичерпаний пул NAT і він не може забезпечити вихідний порт для з'єднання. балансир навантаження або брандмауер на вашому кінці, який, можливо, досяг межі з'єднання? І якщо робити джерело NAT на вхідному трафіку, це також може випробувати виснаження портів.

Один би дійсно потрібен файл pcap з обох кінців. Що ви хочете шукати, це якщо спроба з'єднання надіслана, але ніколи не дістається до сервера, але все одно видається так, ніби вона була скинута сервером. Якщо це так, то щось по лінії повинно було скинути з'єднання. Виснаження басейнів NAT є загальним джерелом подібних проблем.

Також netstat -st може дати вам додаткову інформацію.


1

Деякі ідеї спробувати, виходячи з мого власного недавнього подібного настрою. З посиланнями:

Ви кажете, що це статичний текстовий файл. На всякий випадок, якщо відбувається яка-небудь обробка вище, по всій видимості, розетки домену покращують пропускну здатність TCP через з'єднання на базі TC:

https://rtcamp.com/tutorials/php/fpm-sysctl-tweaking/ https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

Незалежно від припинення:

Увімкнути multi_accept і tcp_nodelay: http://tweaked.io/guide/nginx/

Вимкнути повільний старт TCP: /programming/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

Оптимізуйте вікно застосу TCP (initcwnd): http://www.nateware.com/linux-network-tuning-for-2013.html


1

Щоб встановити максимальну кількість відкритих файлів (якщо це спричиняє вашу проблему), потрібно додати "fs.file-max = 64000" в /etc/sysctl.conf


0

Подивіться, скільки портів знаходиться у TIME_WAITстані, використовуючи команду, netstat -patunl| grep TIME | wc -lта змініть net.ipv4.tcp_tw_reuseна 1.


Як би я дивився на те, скільки портів знаходиться в TIME_WAITдержаві?
Ерік Лебедь

Використання netstatабо ss. Я оновив свою відповідь повною командою!
fgbreel

Я повторно тестував і watch -n 1 'sudo netstat -patunl | grep TIME | wc -l'повертав 0 протягом усього тесту. Я певен, що перезавантаження відбувається в результаті пом'якшення DDOS кимось між тестером навантаження та моїм сервером, спираючись на мій аналіз файлу PCAP, який я розмістив вище, але якщо хтось міг би підтвердити, це було б чудово!
Ерік Лебедь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.