Đạt đến giới hạn đồng hồ hạt nhân


206

Tôi hiện đang phải đối mặt với một vấn đề trên hộp linux, trong đó root tôi có lệnh trả về lỗi vì đã đạt đến giới hạn đồng hồ.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Tôi đã googled một chút và mọi giải pháp tôi tìm thấy là tăng giới hạn với:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

Nhưng tôi không thể tìm thấy bất kỳ thông tin nào về hậu quả của việc nâng cao giá trị đó. Tôi đoán giá trị kernel mặc định đã được đặt vì một lý do nhưng dường như nó không đủ cho các cách sử dụng cụ thể. (ví dụ: khi sử dụng Dropbox với số lượng lớn thư mục hoặc phần mềm giám sát nhiều tệp)

Vì vậy, đây là những câu hỏi của tôi:

  • Có an toàn để nâng cao giá trị đó không và hậu quả của giá trị quá cao là gì?
  • Có cách nào để tìm hiểu những chiếc đồng hồ hiện đang được đặt và quy trình nào đặt chúng để có thể xác định xem giới hạn đạt được không phải do phần mềm bị lỗi không?

Bây giờ bạn có thể đã kiểm tra điều này vì nó đã 8 tháng tuổi, nhưng ổ đĩa của bạn đã đầy chưa? "Đuôi: không thể xem '/ var / log / message': Không còn chỗ trống trên thiết bị"
froggythefrog

Câu trả lời:


273

Có an toàn để nâng cao giá trị đó không và hậu quả của giá trị quá cao là gì?

Có, an toàn để tăng giá trị đó và dưới đây là các chi phí có thể [ nguồn ]:

  • Mỗi đồng hồ inotify được sử dụng chiếm tới 540 byte (hệ thống 32 bit) hoặc 1 kB (gấp đôi - trên 64 bit) [nguồn: 1 , 2 ]
  • Điều này đi ra khỏi bộ nhớ kernel , không thể tải được.
  • Giả sử bạn đặt tối đa ở mức 524288 và tất cả đã được sử dụng (không thể thực hiện được), bạn sẽ sử dụng khoảng 256 MB / 512 MB bộ nhớ kernel 32 bit / 64 bit.
    • Lưu ý rằng ứng dụng của bạn cũng sẽ sử dụng bộ nhớ bổ sung để theo dõi các thẻ điều khiển inotify, đường dẫn tệp / thư mục, v.v. - bao nhiêu tùy thuộc vào thiết kế của nó.

Để kiểm tra số lượng tối đa của đồng hồ inotify:

cat /proc/sys/fs/inotify/max_user_watches

Để đặt số lượng tối đa của đồng hồ inotify

Một cách tạm thời:

  • Chạy sudo sysctl fs.inotify.max_user_watches=với giá trị ưa thích của bạn ở cuối.

Vĩnh viễn ( thông tin chi tiết hơn ):

  • đưa fs.inotify.max_user_watches=524288vào cài đặt sysctl của bạn. Tùy thuộc vào hệ thống của bạn, họ có thể ở một trong những nơi sau:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: đặt một tệp mới vào /etc/sysctl.d/, vd/etc/sysctl.d/40-max-user-watches.conf
  • bạn có thể muốn tải lại cài đặt sysctl để tránh khởi động lại: sysctl -p(Debian / RedHat) hoặc sysctl --system(Arch)

Kiểm tra xem đã đạt đến số lượng đồng hồ inotify tối đa chưa:

Sử dụng tailvới -ftùy chọn (theo) trên bất kỳ tệp cũ nào, ví dụ tail -f /var/log/dmesg: - Nếu tất cả đều ổn, nó sẽ hiển thị 10 dòng cuối cùng và tạm dừng; hủy bỏ với Ctrl-C - Nếu bạn không dùng đồng hồ , nó sẽ thất bại với lỗi hơi khó hiểu này :

đuôi: không thể xem '/ var / log / dmsg': Không còn chỗ trống trên thiết bị

Để xem những gì sử dụng lên đồng hồ inotify

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

Cột đầu tiên cho biết số lượng fds inotify (không phải số lượng đồng hồ mặc dù) và cột thứ hai hiển thị PID của quá trình đó [nguồn: 1 , 2 ].


3
I guess very few codes need the values higher than the defaultDropbox có thể yêu cầu giới hạn cao hơn, tùy thuộc vào số lượng tệp bạn có. Iv'e nuôi tôi không có vấn đề. trong thực tế, thông báo dropbox (xảy ra khi nó đạt đến giới hạn của nó) rõ ràng cho bạn biết để nâng nó lên.
Falmarri

1
@ ultrasawblade- inotify thay thế dnotify. dnotify là chậm và lỗi. inotify có thể được sử dụng trên các thư mục và một thư mục sẽ được "thay đổi" khi một trong các tệp trong thư mục đó (sâu một cấp) được sửa đổi. Thư mục dù sao cũng chỉ là tập tin.
beatgammit

6
"Vĩnh viễn: Thay thế giá trị trong / Proc / sys / fs / inotify / max_user_watches" <- điều này không chính xác. Để thực hiện điều này vĩnh viễn, bạn cần thay đổi/etc/sysctl.conf
Merc

3
sysctl! = systemd, theo lời giải thích của bạn. Và /etc/sysctl.dcũng hoạt động trên các hệ thống dựa trên RedHat mới hơn.
aairey

1
@stackexchanger nếu bạn rất chắc chắn rằng những thứ này tương tự (ví dụ: bạn đã kiểm tra), thì vui lòng gửi và chỉnh sửa Câu hỏi. Bản thân tôi chưa kiểm tra và tôi biết rằng các bản phân phối có xu hướng vá các gói, vì vậy hành vi có thể khác nhau đối với các gói tương tự. Điều này không đề cập đến sự khác biệt trong các phiên bản gói là tốt.
tshepang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.