Ubuntu có một công việc định kỳ được thiết lập để tìm và xóa các phiên PHP cũ:
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] \
&& [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
-maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir \
fuser -s {} 2> /dev/null \; -delete
Vấn đề của tôi là quá trình này mất rất nhiều thời gian để chạy, với rất nhiều đĩa IO. Đây là biểu đồ sử dụng CPU của tôi:
Việc dọn dẹp đang chạy được thể hiện bằng các gai nhọn. Vào đầu giai đoạn này, các công việc dọn dẹp của PHP đã được lên lịch vào mặc định 09 và 39 phút. Vào lúc 15:00, tôi đã loại bỏ thời gian 39 phút khỏi cron, vì vậy công việc dọn dẹp gấp đôi kích thước thường gấp rưỡi (bạn có thể thấy các đỉnh được tăng gấp đôi và gấp rưỡi thường xuyên).
Dưới đây là các biểu đồ tương ứng cho thời gian IO:
Và hoạt động của đĩa:
Vào lúc cao điểm có khoảng 14.000 phiên hoạt động, việc dọn dẹp có thể được xem là chạy đủ 25 phút, rõ ràng là sử dụng 100% một lõi của CPU và dường như là 100% IO của đĩa trong toàn bộ thời gian. Tại sao nó rất tốn tài nguyên? Một ls
thư mục phiên /var/lib/php5
chỉ mất một phần của giây. Vậy tại sao phải mất 25 phút để cắt các phiên cũ? Có bất cứ điều gì tôi có thể làm để tăng tốc độ này?
Hệ thống tập tin cho thiết bị này hiện đang là ext4, chạy trên Ubuntu Precise 12.04 64-bit.
EDIT: Tôi nghi ngờ rằng tải là do quá trình "fuser" bất thường (vì tôi mong đợi một đơn giản rm
là một cảnh tượng chết tiệt nhanh hơn hiệu suất tôi đang thấy). Tôi sẽ loại bỏ việc sử dụng bộ nhiệt áp và xem điều gì sẽ xảy ra.