it-swarm-vi.com

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

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ỗi trả về lệnh 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 là gì 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?
221
Ultraspider

Có an toàn khi tăng 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 đã sử dụng đồng hồ inotify 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 xuất phát từ 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 đồng hồ inotify tối đa:

cat /proc/sys/fs/inotify/max_user_watches

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

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 ):

  • đặt fs.inotify.max_user_watches=524288 và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/, ví dụ. /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 tail với -f (theo) tùy chọn 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 điều này lỗi hơi khó hiể :

đ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ì đang sử dụng đồ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 ].

294
tshepang