Cách sửa nhanh trong 30 giâyNếu bạn đang vội, hãy chạy hai lệnh sau để tăng giới hạn lên 524.288. Đây là tiêu chuẩn chung cho máy tính phát triển và có thể xử lý cả những thư mục node_modules đồ sộ nhất.
# Áp dụng thay đổi ngay lập tức
sudo sysctl fs.inotify.max_user_watches=524288
# Lưu thay đổi vĩnh viễn
echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Tại sao lỗi này xảy ra?Lỗi này thường làm gián đoạn công việc ngay khi bạn khởi động các dev server như Vite, Webpack hoặc Nodemon. Nó cũng thường gặp với người dùng VS Code làm việc trong các monorepo lớn hoặc bất kỳ ai chạy các công cụ đồng bộ nền như Syncthing.
Failed to watch /path/to/dir; upper limit on inotify watches reached!
Linux sử dụng một hệ thống con gọi là inotify để theo dõi các sự kiện trên hệ thống tệp. Mỗi khi một ứng dụng giám sát một thư mục để tìm các thay đổi, nó sẽ tiêu tốn một "watch".
Hầu hết các bản phân phối Linux đi kèm với giá trị mặc định khiêm tốn là 8.192 watch. Nghe có vẻ nhiều, nhưng một dự án React hoặc Vue tiêu chuẩn có thể dễ dàng có hơn 20.000 tệp nằm trong node_modules. Khi hết giới hạn, nhân (kernel) sẽ ngừng theo dõi các tệp mới, làm hỏng tính năng hot-reloading và các chức năng của IDE.
Cách tăng giới hạn### 1. Kiểm tra thông số hiện tạiĐầu tiên, hãy xem chính xác hệ thống của bạn hiện đang cho phép bao nhiêu watch:
cat /proc/sys/fs/inotify/max_user_watches
Nếu con số là 8192 và bạn đang phát triển ứng dụng web hiện đại, chắc chắn bạn đã chạm trần giới hạn.
2. Áp dụng thay đổi tạm thờiBạn cần quay lại làm việc ngay lập tức? Hãy tăng giới hạn mà không cần khởi động lại. Cách này rất phù hợp để kiểm tra xem thay đổi có thực sự giải quyết được vấn đề của bạn hay không.
sudo sysctl fs.inotify.max_user_watches=524288
Lưu ý rằng cài đặt này sẽ biến mất ngay khi bạn khởi động lại máy tính.
3. Thiết lập vĩnh viễnĐể ngăn lỗi này quay lại sau khi khởi động lại, bạn cần cập nhật cấu hình hệ thống.
Lựa chọn A: Cập nhật /etc/sysctl.confMở tệp với quyền root:
sudo nano /etc/sysctl.conf
Thêm dòng này vào cuối tệp:
fs.inotify.max_user_watches=524288
Lựa chọn B: Sử dụng tệp cấu hình riêng (Khuyên dùng)Trên các bản phân phối hiện đại, tốt nhất nên để các tùy chỉnh riêng trong /etc/sysctl.d/ để giữ cho tệp cấu hình chính được sạch sẽ.
echo "fs.inotify.max_user_watches=524288" | sudo tee /etc/sysctl.d/40-max-user-watches.conf
sudo sysctl -p /etc/sysctl.d/40-max-user-watches.conf
Ứng dụng nào đang tiêu tốn watch?Bạn tò mò muốn biết ứng dụng nào đang chiếm dụng nhiều tài nguyên nhất? Hãy chạy lệnh sau để xem danh sách các tiến trình và số lượng watch xấp xỉ của chúng. Đây là cách tuyệt vời để tìm ra các ứng dụng "rò rỉ" đang theo dõi các thư mục không cần thiết.
find /proc/*/fd -lname anon_inode:inotify -printf '%h\n' | cut -d/ -f3 | xargs -I{} -- ps -p {} -o comm= | sort | uniq -c | sort -nr
Việc này có làm chậm máy tính không?Không hẳn. Mỗi watch tiêu tốn một phần nhỏ bộ nhớ nhân (kernel memory) không thể hoán đổi (unswappable) — khoảng 1 KB trên hệ thống 64-bit.
Nếu bạn sử dụng hết tất cả 524.288 watch, bạn sẽ mất khoảng 512 MB RAM. Đối với laptop của lập trình viên có 16 GB hoặc 32 GB, đó chỉ là một sai số nhỏ. Tuy nhiên, nếu bạn đang chạy trên một VPS nhỏ 1 GB, hãy cân nhắc và thử giới hạn 65.536 thay thế.

