Для сбора информации о состоянии сервера в моменты высокого 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