Tuesday, July 17, 2007

Giải cứu Solaris server

Không hiểu sao cái Solaris server lại có thể chứa đến hơn 300.000 email còn nằm trong hàng đợi (email báo kết quả cron job) từ đời tám hoánh đột nhiên lại được gửi ra một lúc. Đến độ 8GB RAM + 8GB swap bị đầy nghẹt, process mail không thể gửi vì lỗi hết bộ nhớ (cannot fork: not enough space). Lỗi này là nghiêm trọng (critical) và hệ thống tự động ... gửi email để thông báo cho root (stupid!) dẫn đến vòng lặp không thể thoát được, một local DoS kiểu "tự mình hại mình". May mắn là vẫn còn có thể cứu được mà không phải reboot server cực kỳ quan trọng này nhờ vẫn còn shell trên đó.

Trước hết là thêm swap để có thể chạy các lệnh khác:
# mkfile 1500m /swapfile
# swap -a /swapfile

Kết quả ps cho thấy hàng trăm process sendmail và mail.local đang chạy, phải kill hết chúng trước:
# pkill -9 sendmail
# pkill -9 mail.local

Phải dọn dẹp đống 300.000 file trong /var/spool/mqueue và /var/spool/clientmqueue để không bị lấy ra xử lý khi sendmail chạy lại (may mà toàn cron email):
# cd /var/spool/clientmqueue
# find . -type f | xargs -n 1000 rm

(Lý thuyết thì rm -rf /var/spool/clientmqueue sẽ nhanh hơn nhưng thực tế thì cũng giống lệnh trên)

Cuối cùng bỏ bớt cái swapfile vì có thể làm chậm hệ thống và start lại các service:
# swap -d /swapfile

Hú hồn!

1 comment:

PhuLeRock said...

Anh Long giỏi Unix thật, đọc blog anh thật hay. Em cũng làm về network nhưng kiến thức về linux còn khá yếu, cũng chỉ đang làm việc với vài service đơn giản như apache2, squid và shorewall.
Mong rằng sẽ học hỏi được nhiều từ anh trong thời gian tới.
À, VnSecConf tháng 8 này anh có đi không ?