Làm thế nào tôi có thể biết nếu tôi ra khỏi đồng hồ inotify?


47

Tôi sử dụng một ứng dụng tiêu thụ đồng hồ inotify. Tôi đã thiết lập

fs.inotify.max_user_watches=32768

trong /etc/sysctl.confnhưng đêm qua các ứng dụng ngừng lập chỉ mục, trừ khi tôi chạy nó bằng tay, dẫn tôi để nghi ngờ tôi ra khỏi đồng hồ.

Vì tôi không biết sự đánh đổi là gì khi tôi tăng con số này (nó có tiêu tốn nhiều RAM hơn không?), Tôi không biết liệu tôi có nên tăng con số này không, vì vậy tôi muốn biết liệu có cách nào không có thể biết nếu nó sử dụng tất cả những chiếc đồng hồ này và những gì có thể đánh đổi để tăng nó.


Câu hỏi này đã trở nên khá liên quan một lần nữa vì hóa ra vào ngày 18.04, việc mở khóa màn hình là không thể nếu một người đã hết đồng hồ inode.
kasperd

Câu trả lời:


64

Làm thế nào để bạn biết nếu bạn ra khỏi đồng hồ? Đuôi sẽ bảo!

  • Bắt đầu 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 hết đồ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ị

Đối với những người tò mò: Tại sao đuôi là "Telltail"?

  • Trên thực tế, bất kỳ ứng dụng được viết tốt nào cũng phải có phép lịch sự cho bạn biết, vì API / cuộc gọi inotify rõ ràng cho họ biết thỏa thuận này là gì.
  • strace tail -f ...Thay vào đó hãy thử và khi thành công, nó kết thúc bằng:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • Nhưng nếu nó thất bại, tức là bạn hết đồng hồ , nó sẽ nói:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (Không còn chỗ trống trên thiết bị)
    

Bạn có thể tăng đồng hồ? Bằng bao nhiêu? Bất kỳ sự đánh đổi?

Câu trả lời ngắn gọn: Chắc chắn, không có mồ hôi. Tới thẳng đến một nửa triệu (524.288) nếu bạn muốn ... bộ nhớ thêm được sử dụng nên không đáng kể trên một hệ thống hiện đại với 4GB + bộ nhớ.

  • 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.
  • Vì vậy, 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ó.
  • Giá trị tối đa là gì? Tôi đoán không, theo lý thuyết, miễn là bạn có đủ RAM. Trong thực tế, 524288 đã được các ứng dụng chính thức khuyến nghị và mọi người đã đặt nó ở mức 2 triệu , với việc sử dụng bộ nhớ đi kèm, tất nhiên.


5
Nếu bạn cũng muốn biết số lượng đồng hồ inotify hiện tại thực tế (do đó nhiều hơn có / không), hãy đisudo lsof | grep -i inotify | wc -l
Frank Nocke

2
Liên kết "được viết tốt" bị hỏng.
Gaurav Sharma

11

Tôi không biết nếu tôi chỉ nên tăng số này

Cách dễ dàng để kiểm tra xem bạn có đạt được max_user_watchesgiá trị của mình hay không , với người dùng của bạn, sử dụng inotifywatch, từ gói inotify-toolsvà kiểm tra xem bạn vẫn có thể thu thập thông tin từ một tệp hay không.

Ví dụ inotifywatch -v /home/bruno/.profilecho tôi trả về:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

Vì vậy, inotifykhông có vấn đề tạo ra một chiếc đồng hồ mới, không có vấn đề ở đây.

Nếu bạn đã đạt đến giới hạn tối đa của mình trong đồng hồ inotify, nó sẽ trả về một cái gì đó như

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Nếu bạn thấy một cái gì đó như thế này thì bạn đã đạt đến giới hạn và sẽ cần phải tăng giới hạn đồng hồ được phép.

Nó có tiêu thụ nhiều RAM hơn không?

Vâng, nó làm. Nhưng theo bài viết cũ này , số tiền nó tiêu thụ là tối thiểu so với các khía cạnh khác của máy tính để bàn đang chạy.

- SỬ DỤNG HÓA HỌC--

Các cấu trúc dữ liệu inotify có trọng lượng nhẹ:

Đồng hồ inotify là 40 byte thiết bị inotify là 68 byte sự kiện inotify là 272 byte

Vì vậy, giả sử một thiết bị có 8192 đồng hồ, các cấu trúc sẽ chỉ tiêu thụ 320KB bộ nhớ. Với số lượng tối đa 8 thiết bị được phép tồn tại tại một thời điểm, đây vẫn chỉ là 2,5 MB

Mỗi thiết bị cũng có thể có 256 sự kiện được xếp hàng cùng một lúc, tổng cộng là 68KB cho mỗi thiết bị. Và chỉ 0,5 MB nếu tất cả các thiết bị được mở và có hàng đợi sự kiện đầy đủ.

Vì vậy, khoảng 3 MB bộ nhớ được sử dụng trong trường hợp hiếm hoi của mọi thứ mở và đầy đủ.

Mỗi đồng hồ inotify ghim vào nút của một thư mục / tệp trong bộ nhớ, kích thước của một nút là khác nhau trên mỗi hệ thống tệp nhưng giả sử rằng nó là 512 byes.

Vì vậy, giả sử số lượng đồng hồ toàn cầu tối đa đang hoạt động, điều này sẽ giảm 32 MB inode trong bộ đệm inode. Một lần nữa không phải là một vấn đề trên một hệ thống hiện đại.

Tất nhiên tôi cho rằng mọi thứ không thay đổi nhiều kể từ khi bài viết được viết nhưng nhìn vào những con số tôi sẽ không lo lắng và việc tăng giới hạn sẽ không làm tăng mức tiêu thụ RAM nhiều.


Bài viết liên quan về inotify


Xin lỗi người đàn ông, tôi đã có một bản nháp mở ngày hôm qua trong vài giờ và không thấy câu trả lời của bạn trước khi tôi đăng bài của tôi. Tôi đoán là ổn vì chúng có hai cách tiếp cận khác nhau :-) Bạn có thể làm rõ rằng trong các hạt nhân gần đây, inotify sử dụng 0,5KB (trên 32 bit) hoặc 1KB (64 bit) cho mỗi bộ nhớ, vì thông tin cũ từ Năm 2005 dường như không còn đúng nữa?
ish
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.