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

На сервере с операционной системой Linux иногда наблюдается высокий Load Average, и мне хотелось бы разобраться в причинах его появления. Однако проблема в том, что когда это происходит, никто не замечает данный момент, и после «пробуждения» становится поздно для анализа. 

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

Вот что именно я хотел бы получить: 
- Текущее время и Load Average 
- Топовые процессы по потреблению CPU и RAM, аналогично команде top 
- Список активных HTTP/HTTPS соединений 
- Вывод команды show processlist из MySQL 
- Наиболее быстрорастущие файлы в директориях /var/log/nginx и /var/log/apache2 
- Возможно, последние запросы в этих логах или самые активные IP-адреса клиентов 

Существует ли уже готовое решение или программа, которая выполняет часть этих задач? В настоящее время я использую shell-скрипт, который каждые 5 минут собирает подобную информацию; может быть, есть более удобный способ?
  • 12 ноября 2024 г. 14:13
Ответы на вопрос 3
Для сбора информации о состоянии сервера в моменты высокого Load Average эффективным подходом будет создание скрипта, который будет постоянно отслеживать значение Load Average и записывать данные в случае его повышения. Такой скрипт может быть реализован с использованием cron-задачи для периодического запуска, а также механизма для активации сбора данных при превышении порогового значения Load Average. Вот примерный план, как это можно сделать:

### Подходы и инструменты

1. **Создание скрипта**:
   Используйте Bash для написания скрипта, который будет собирать интересующую вас информацию.

2. **Мониторинг Load Average**:
   В качестве порога можно взять, например, 2.0 или 5.0, в зависимости от вашей конфигурации сервера и нагрузки.

3. **Сохранение данных**:
   Данные можно сохранять в текстовый файл или в формате JSON для удобства последующей обработки.

4. **Использование `cron` для регулярного запуска**:
   Скрипт можно настроить на выполнение каждые 1-5 минут, а сам сбор информации будет активироваться только при превышении порогового значения Load Average.

### Пример скрипта

```bash
#!/bin/bash

# Пороговое значение Load Average
THRESHOLD=2.0

# Получаем значение Load Average за 1 минуту
LOAD=$(awk '{print $1}' /proc/loadavg)

# Проверка, превышает ли Load Average порог
if (( $(echo "$LOAD > $THRESHOLD" | bc -l) )); then
    TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
    
    # Сохраняем данные в файл
    OUTPUT_FILE="/var/log/load_monitor.log"
    
    echo "[$TIMESTAMP] Load Average: $LOAD" >> $OUTPUT_FILE

    # Топовые процессы по CPU и RAM
    echo "Top Processes:" >> $OUTPUT_FILE
    ps aux --sort=-%mem | head -n 10 >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE

    # Активные HTTP/HTTPS соединения
    echo "Active Connections:" >> $OUTPUT_FILE
    netstat -tn 2>/dev/null | grep ':80\|:443' >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE

    # Вывод команды show processlist из MySQL
    echo "MySQL Process List:" >> $OUTPUT_FILE
    mysql -u your_username -p'your_password' -e 'SHOW PROCESSLIST;' >> $OUTPUT_FILE 2>/dev/null
    echo "" >> $OUTPUT_FILE

    # Наиболее быстрорастущие файлы
    echo "Fastest Growing Files in /var/log/nginx:" >> $OUTPUT_FILE
    find /var/log/nginx -type f -printf '%T+ %p\n' | sort -r | head -n 10 >> $OUTPUT_FILE
    echo "Fastest Growing Files in /var/log/apache2:" >> $OUTPUT_FILE
    find /var/log/apache2 -type f -printf '%T+ %p\n' | sort -r | head -n 10 >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE

    # Последние запросы в логах
    echo "Last Requests in Nginx:" >> $OUTPUT_FILE
    tail -n 10 /var/log/nginx/access.log >> $OUTPUT_FILE 2>/dev/null
    echo "" >> $OUTPUT_FILE

    echo "Last Requests in Apache:" >> $OUTPUT_FILE
    tail -n 10 /var/log/apache2/access.log >> $OUTPUT_FILE 2>/dev/null
    echo "" >> $OUTPUT_FILE

    # Самые активные IP-адреса
    echo "Most Active IPs in Nginx:" >> $OUTPUT_FILE
    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10 >> $OUTPUT_FILE 2>/dev/null
    echo "" >> $OUTPUT_FILE

    echo "Most Active IPs in Apache:" >> $OUTPUT_FILE
    awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -n 10 >> $OUTPUT_FILE 2>/dev/null
fi
```

### Настройка `cron`

Чтобы ваш скрипт выполнялся каждые 5 минут, добавьте его в `crontab`:

```bash
*/5 * * * * /path/to/your/script.sh
```

### Готовые решения

Существует множество готовых решений для мониторинга, такие как:

- **Nag
Установите atop в режиме хранения истории. С помощью него найдёте виновника - и можно будет диагностировать дальше более узко.
1. поставь munin -там будет 99% видно где кто и когда дешево и сердито. 
2. iotop -oka тоже даст понимания особенно если это I-O проблема.
3
netstat -ntu | awk '{print $5}' | grep -vE "(Address|servers|77.37.156.60|79.137.175.245|192.168.5.201|95.163.251.234|127.0.0.1|8.8.8.8|8.8.4.4)" | cut -d: -f1 | sort | uniq -c | sort -n| sed 's/^[ \t]*//'

смотрим если там все плохо вас ддосят, плохо это по факту если больше 5 подключений на ip или этих подключений целая куча.
Похожие вопросы