Chẩn đoán các sự cố tải máy chủ Linux với một tập lệnh đơn giản
Nếu bạn 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á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 cung cấp cho bạn câu trả lời. Vậy làm thế 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 chúng?
Các kịch bản sau đây có thể có thể giúp đỡ. Nó được viết cho một máy chủ web, do đó, có một số phần của nó đặc biệt tìm kiếm các quy trình httpd và một số phần liên quan đến MySQL. Tùy thuộc vào việc triển khai máy chủ của bạn, chỉ cần bình luận / xóa các phần đó và thêm các phần 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 tập lệnh này 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 gọi là mytop (có sẵn tại http://jeremy.zawodny.com/mysql/mytop/), một công cụ tuyệt vời để kiểm tra cách thức hoạt động của MySQL. Nó đã 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ỉ sử dụng tiện ích 'mail' được tích hợp trong linux. Tôi chạy nó qua cron mỗi giờ; điều chỉnh khi bạn thấy phù hợp Ồ - và tập lệnh này cần chạy dưới quyền root vì nó đọc từ một số khu vực được bảo vệ của máy chủ.
Vì vậy, hãy bắt đầu, chúng ta sẽ?
Đầu tiên, đặt các biến script của bạn:
#! / bin / bash
#
# Script để kiểm tra mức trung bình tải hệ thống để cố gắng xác định
# những gì quá trình đang đưa nó quá cao
#
# 07Jul2010 tjones
#
# thiết lập môi trường
dt = "ngày +% d% b% Y-% X"
# Rõ ràng, thay đổi các thư mục sau thành nơi lưu trữ tệp nhật ký của bạn
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
thuyết minh = "/ var / log / message"
mysqlLog = "/ var / log / mysqld.log"
# mailstop đầu tiên là email tiêu chuẩn cho các báo cáo. Thứ hai là cho điện thoại di động (với một báo cáo giảm xuống)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
máy = "tên máy chủ"
# Ba điều sau đây là để sử dụng mytop - sử dụng người dùng db có quyền khá
dbusr = "tên người dùng"
dbpw = "mật khẩu"
db = "yourdatabasename"
# Sau đây là mức tải để kiểm tra - 10 thực sự cao, vì vậy bạn có thể muốn hạ thấp nó.
levelToCheck = 10
Tiếp theo, hãy kiểm tra mức tải của bạn để xem tập lệnh có tiếp tục không:
# Đặt biến từ hệ thống:
loadLevel = "cat / Proc / loadavg | awk" in $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# nếu mức tải lớn hơn bạn muốn, hãy bắt đầu quá trình tập lệnh. Nếu không, thoát 0
if [$ loadLevel -gt $ levelToCheck]; sau đó
tiếng vang ""> $ tmpfile
tiếng vang "****** / TÌM HIỂU"
tiếng vang "Ngày: $ dt" >> $ tmpfile
echo "Kiểm tra tải & xử lý hệ thống" >> $ tmpfile
tiếng vang "****** / TÌM HIỂU"
Và tiếp tục thông qua 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ơi áp dụng cho tình huống của bạn:
# Nhận thêm các biến từ hệ thống:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Hiển thị mức tải hiện tại:
echo "Mức tải là: $ loadLevel" >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile# Hiển thị số lượng quy trình httpd hiện đang chạy (không bao gồm trẻ em):
echo "Số lượng quy trình httpd hiện tại: $ httpdProcesses" >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Hiển thị danh sách quy trình:
echo "Quá trình hiện đang chạy:" >> $ tmpfile
ps f -ef >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Hiển thị thông tin MySQL hiện tại:
echo "Kết quả từ mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile
Lưu ý với lệnh trên cùng, chúng tôi đang ghi vào hai tệp tạm thời. Một là cho tin nhắn nhỏ hơn nhiều cho điện thoại di động. Nếu bạn không muốn sự khẩn cấp của cảnh báo điện thoại di động vào lúc ba giờ sáng, bạn có thể gỡ nó ra (và bỏ thói quen gửi thư thứ hai sau trong tập lệnh).
# Hiển thị hàng đầu hiện tại:
echo "hàng đầu hiện hiển thị:" >> $ tmpfile
echo "top hiện hiển thị:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile
Kiểm tra thêm:
# Hiển thị các kết nối hiện tại:
echo "netstat hiện hiển thị:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Kiểm tra dung lượng đĩa
tiếng vang "không gian đĩa:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile
Sau đó viết nội dung tệp tạm thời vào tệp nhật ký cố định 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 giảm xuống chỉ bao gồm tiêu chuẩn nằm ngoài 'top':
# Gửi kết quả đến tệp nhật ký:
/ bin / mèo $ tmpfile >> $ logfile# Và kết quả email đến sysadmin:
/ usr / bin / mutt -s "$ machine có mức tải cao! - $ dt" -a $ mysqlLog -a $ dirLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
Và sau đó một số vệ sinh và thoát:
# Và sau đó xóa tệp tạm thời:
rm $ tmpfile
rm $ topfile
fi#
thoát 0
Hy vọng điều này sẽ giúp ai đó ngoài kia. Kịch bản được lắp ráp hoàn chỉnh là:
#! / bin / bash
#
# Script để kiểm tra mức trung bình tải hệ thống để cố gắng xác định quy trình nào
# dùng nó quá cao
#
# thiết lập môi trường
dt = "ngày +% d% b% Y-% X"
# Rõ ràng, thay đổi các thư mục sau thành nơi lưu trữ tệp nhật ký của bạn
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
thuyết minh = "/ var / log / message"
mysqlLog = "/ var / log / mysqld.log"
# mailstop đầu tiên là email tiêu chuẩn cho các báo cáo. Thứ hai là cho điện thoại di động (với một báo cáo giảm xuống)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
máy = "tên máy chủ"
# Ba điều sau đây là để sử dụng mytop - sử dụng người dùng db có quyền khá
dbusr = "tên người dùng"
dbpw = "mật khẩu"
db = "yourdatabasename"
# Sau đây là mức tải để kiểm tra - 10 thực sự cao, vì vậy bạn có thể muốn hạ thấp nó.
levelToCheck = 10
# Đặt biến từ hệ thống:
loadLevel = "cat / Proc / loadavg | awk" in $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# nếu mức tải lớn hơn bạn muốn, hãy bắt đầu quá trình tập lệnh. Nếu không, thoát 0
if [$ loadLevel -gt $ levelToCheck]; sau đó
tiếng vang ""> $ tmpfile
tiếng vang "****** / TÌM HIỂU"
tiếng vang "Ngày: $ dt" >> $ tmpfile
echo "Kiểm tra tải & xử lý hệ thống" >> $ tmpfile
tiếng vang "****** / TÌM HIỂU"# Nhận thêm các biến từ hệ thống:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Hiển thị mức tải hiện tại:
echo "Mức tải là: $ loadLevel" >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile# Hiển thị số lượng quy trình httpd hiện đang chạy (không bao gồm trẻ em):
echo "Số lượng quy trình httpd hiện tại: $ httpdProcesses" >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Hiển thị danh sách quy trình:
echo "Quá trình hiện đang chạy:" >> $ tmpfile
ps f -ef >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Hiển thị thông tin MySQL hiện tại:
echo "Kết quả từ mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Hiển thị hàng đầu hiện tại:
echo "hàng đầu hiện hiển thị:" >> $ tmpfile
echo "top hiện hiển thị:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Hiển thị các kết nối hiện tại:
echo "netstat hiện hiển thị:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Kiểm tra dung lượng đĩa
tiếng vang "không gian đĩa:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
tiếng vang "****** / TÌM KIẾM * ">> $ tmpfile
tiếng vang "" >> $ tmpfile# Gửi kết quả đến tệp nhật ký:
/ bin / mèo $ tmpfile >> $ logfile# Và kết quả email đến sysadmin:
/ usr / bin / mutt -s "$ machine có mức tải cao! - $ dt" -a $ mysqlLog -a $ dirLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# Và sau đó xóa tệp tạm thời:
rm $ tmpfile
rm $ topfile
fi#
thoát 0