Một câu hỏi rất nhiều người gặp nhưng ít ai giải thích đúng bản chất:

“Tôi đã xoá hết file trong /var/lib/php/sessions, nhưng chạy ll vẫn rất chậm. VPS dùng lâu có phải thế nào cũng chậm không?”

Bài viết này tổng hợp đầy đủ – đúng bản chất – đúng hướng xử lý production, dựa trên case thực tế với PHP 7.4 + Nginx + ext4.


1. Triệu chứng thường gặp

  • Chạy:ll /var/lib/php/sessions → chậm bất thường
  • Dù:
    • Đã rm -rf toàn bộ file session
    • Thư mục gần như trống
  • Kiểm tra:stat /var/lib/php/sessions Thấy:
    • Size lên tới hàng chục MB
    • Blocks rất lớn
    • Nhưng Links: 2 (chỉ còn ...)

👉 Đây không phải lỗi PHP, không phải VPS yếu.


2. Nguyên nhân thật sự: ext4 directory metadata bị phình

2.1 ext4 xử lý thư mục lớn như thế nào?

  • Khi một thư mục chứa rất nhiều file (hàng chục nghìn → hàng triệu):
    • ext4 tự động chuyển sang HTree (hashed B-tree)
    • Cấp phát thêm directory blocks để tăng tốc tra cứu

👉 Việc này là bình thường và đúng thiết kế.


2.2 Vì sao xoá file rồi mà vẫn chậm?

Điểm quan trọng nhất:

ext4 KHÔNG thu hồi lại directory blocks sau khi file bị xoá.

Nghĩa là:

  • File đã đi
  • Nhưng metadata của thư mục vẫn giữ nguyên kích thước
  • Directory từng nặng 70MB → xoá file → vẫn 70MB

➡️ Khi chạy ll:

  • Kernel phải đọc toàn bộ metadata
  • ls -l phải stat() từng entry
  • Kết quả: chậm

3. Có cách nào “thu gọn” thư mục ext4 không?

❌ Câu trả lời thẳng: KHÔNG

Với ext4:

  • Không có lệnh shrink directory
  • rm, unlink, fsck, tune2fs đều không giúp
  • drop_caches chỉ tác động cache RAM, không giảm size directory

👉 Cách duy nhất để thư mục trở lại nhỏ gọn:

Xoá và tạo lại thư mục mới


4. VPS dùng lâu có phải thế nào cũng chậm?

❌ Sai hoàn toàn

VPS không chậm theo thời gian.

Nó chỉ chậm khi:

  • Thiết kế filesystem sai
  • Để 1 thư mục chứa quá nhiều file nhỏ
  • Không chia subfolder
  • Không cleanup hợp lý

📌 Các thư mục nguy hiểm nhất:

  • /var/lib/php/sessions
  • /tmp
  • /var/cache/*
  • /var/log (không logrotate)

5. Giải pháp đúng chuẩn production

5.1 Không bao giờ xoá cả folder session định kỳ ❌

Vì:

  • Logout toàn bộ user
  • Mất session đang sống
  • Dễ gây lỗi race condition
  • Chỉ chữa ngọn

5.2 Giải pháp CHUẨN: chia nhỏ session directory

Cấu hình PHP:

session.save_path = "2;/var/www/sessions"

Ý nghĩa:

  • 2; → PHP tự tạo 256 subfolder (00 → ff)
  • Mỗi folder chỉ chứa vài nghìn file
  • ext4 không bao giờ phình metadata

5.3 Tạo thư mục và phân quyền

mkdir -p /var/www/sessions
chown -R www-data:www-data /var/www/sessions
chmod 700 /var/www/sessions

5.4 Cron dọn file session hết hạn (không đụng folder)

find /var/www/sessions -type f -mtime +2 -delete

✔ Không ảnh hưởng user online
✔ Folder luôn gọn
✔ Không cần recreate thư mục


6. Khi nào cần xoá & tạo lại thư mục session?

Trường hợpCó nên xoá folder?
Folder đã phình hàng chục MB1 lần duy nhất
Production đang chạy
Định kỳ hàng ngày
Bảo trì hệ thống⚠️ có thể

7. Lựa chọn tốt hơn nữa: Redis session

Nếu traffic cao:

  • Không filesystem
  • Không inode
  • Không directory
  • Nhanh hơn file session

CI3 ví dụ:

$config['sess_driver'] = 'redis';
$config['sess_save_path'] = 'tcp://127.0.0.1:6379?database=2';

8. Kết luận

Session chậm không phải do PHP, không phải do VPS
👉 mà là do filesystem bị dùng sai cách

Nguyên tắc nhớ kỹ:

  • ❌ Không để 1 folder chứa nhiều file
  • ❌ Không xoá folder session định kỳ
  • ✅ Chia subfolder ngay từ đầu
  • ✅ Chỉ xoá file session hết hạn

Làm đúng → VPS chạy nhiều năm không cần cài lại OS.