Chẩn đoán sự cố tải xuống máy chủ Linux với một tập lệnh đơn giản

Chẩn đoán sự cố tải xuống máy chủ Linux với một tập lệnh đơn giản
Chẩn đoán sự cố tải xuống máy chủ Linux với một tập lệnh đơn giản

Video: Chẩn đoán sự cố tải xuống máy chủ Linux với một tập lệnh đơn giản

Video: Chẩn đoán sự cố tải xuống máy chủ Linux với một tập lệnh đơn giản
Video: 15 Phím Tắt Tuyệt Vời Mà Bạn Chưa Sử Dụng Đến - YouTube 2024, Có thể
Anonim

Nếu bạn đã từng là quản trị viên trong bất kỳ khoảng thời gian nào, bạn chắc chắn đã phát hiện ra tình huống mà máy chủ tăng đột biến trong việc sử dụng CPU hoặc sử dụng bộ nhớ và / hoặc mức tải. Chạy `top` sẽ không luôn trả lời bạn. Vậy làm cách nào bạn tìm thấy những quy trình lén lút đang nhai tài nguyên hệ thống của bạn để có thể giết họ?

Tập lệnh sau có thể giúp bạn. Nó được viết cho một máy chủ web, do đó, có một số phần của nó được đặc biệt tìm kiếm các quy trình httpd và một số phần xử lý MySQL. Tùy thuộc vào triển khai máy chủ của bạn, chỉ cần nhận xét / xóa các phần đó và thêm các mục khác. Nó nên được sử dụng cho một điểm khởi đầu.

Điều kiện tiên quyết cho phiên bản này của kịch bản là một số phần mềm miễn phí được phát hành theo Giấy phép Công cộng GNU được gọi là mytop (có sẵn tại https://jeremy.zawodny.com/mysql/mytop/) là một công cụ tuyệt vời để kiểm tra cách thức hoạt động của MySQL. Nó đang già đi, nhưng vẫn hoạt động tốt cho mục đích của chúng tôi ở đây. Ngoài ra, tôi sử dụng mutt làm người gửi thư - bạn có thể muốn thay đổi tập lệnh để chỉ cần sử dụng linux được xây dựng trong tiện ích `mail`. Tôi chạy nó qua cron mỗi giờ; điều chỉnh như bạn thấy phù hợp. Oh - và kịch bản này cần phải chạy như là người chủ vì nó đọc từ một số khu vực được bảo vệ của máy chủ.

Vậy chúng ta hãy bắt đầu, phải không?

Trước tiên, hãy đặt biến tập lệnh của bạn:

#!/bin/bash # # Script to check system load average levels to try to determine # what processes are taking it overly high… # # 07Jul2010 tjones # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10

Tiếp theo, kiểm tra mức tải của bạn để xem tập lệnh có tiếp tục không:

# Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

Và tiếp tục thông qua các kiểm tra, ghi kết quả vào tập tin tạm thời. Thêm hoặc xóa các mục từ đây nếu có thể áp dụng cho trường hợp của bạn:

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Chú ý với lệnh trên cùng, chúng ta sẽ ghi vào hai tệp tạm thời. Một là cho các tin nhắn nhỏ hơn nhiều để điện thoại di động. Nếu bạn không muốn mức độ khẩn cấp của cảnh báo điện thoại di động lúc ba giờ sáng, bạn có thể thực hiện điều này (và đưa ra thói quen gửi thư thứ hai sau này trong tập lệnh).

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Kiểm tra thêm:

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Sau đó ghi nội dung tệp tạm thời vào tệp nhật ký thường trực hơn và gửi email kết quả cho các bên thích hợp. Việc gửi thư thứ hai là các kết quả được so sánh với nhau chỉ đơn giản là tiêu chuẩn của `top`:

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

Và sau đó một số vệ sinh và lối ra:

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Hy vọng rằng điều này sẽ giúp ai đó ra khỏi đó. Tập lệnh được lắp ráp hoàn chỉnh là:

#!/bin/bash # # Script to check system load average levels to try to determine what processes are # taking it overly high… # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10 # Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Đề xuất: