Назад | Перейти на главную страницу

Как определить причину высокой загрузки полосы пропускания на сервере

У меня есть сервер базы данных MySQL, работающий на VPS. Сервер подключен к веб-серверу через частный сетевой интерфейс и не имеет общедоступных служб, кроме SSH и установки PHPMyAdmin.

Некоторое время назад я установил правило Monit для проверки ненормального трафика через публичный сетевой интерфейс (он же не тот, который передаются данные MySQL):

# Monitor network connection
check network public with interface eth1
   if failed link then alert
   if changed link then alert
   if saturation > 90% then alert
   if download > 10 MB/s then alert
   if total upload > 1 GB in last hour then alert

Несколько месяцев назад я начал получать шквал предупреждений Monit, вызванных этим правилом:

Upload bytes exceeded Service public

        Date:        Tue, 04 Apr 2017 13:11:55
        Action:      alert
        Host:        myhostname.com
        Description: total upload 1.0 GB matches limit [upload rate < 1024.0 MB in last 1 hour]

Your faithful employee,
Monit

Эти предупреждения на самом деле не коррелируют с каким-либо всплеском использования на сервере, и, поскольку нет реальных общедоступных сервисов, я не могу себе представить, что может быть ответственным за такой объем загрузки. Дисковое пространство, похоже, тоже не используется.

Как я могу узнать, что вызывает загрузку более 1 ГБ «чего-то», что загружается и откуда?

Похоже, что-то выполняет какой-то периодический запрос SELECT, который выгружает данные из общедоступного интерфейса.

Wireshark, pcap или другой вариант отслеживания пакетов выявляют источник (сервер SQL) и цель, используемые порты / протоколы и т. Д. Обнулите порт 3306 (TCP или UDP), который является портом MySQL.

Если у вас много места на диске в системе, вы можете настроить отслеживание пакетов для сохранения файлов pcap, содержащих сетевой трафик, через ваш общедоступный интерфейс.

Я бы порекомендовал режим буферизации, скажем, 10 ГБ, разбитый на файлы по 2 ГБ, чтобы вы никогда не использовали больше этого количества места, но вы должны иметь возможность захватить хотя бы одну из этих загрузок (или, по крайней мере, ее начало). Это может занять час или два, или всего несколько минут, но при использовании этого метода у вас всегда будет не менее 8 ГБ неповрежденного разговора (последний файл будет <2 ГБ и будет самыми новыми данными).

Как только вы поймете, что происходит, вы можете предпринять шаги для смягчения последствий. Сразу же я бы порекомендовал закрыть порт 3306 на общедоступном порту, а также заблокировать кредиты «Может выполнять запросы» в разрешениях MySQL. Это закроет дверь сарая.

Возможный способ определить, что происходит со стороны MySQL, - включить журнал медленных запросов, а затем установить действительно низкий порог для захвата каждого оператора. Затем вы можете просмотреть журнал медленных запросов, чтобы узнать, что выполнялось в то время.

Альтернативный подход - периодически сбрасывать "показать полный список процессов \ G". Так будет намного легче увидеть, что работает в данный момент.