2010-09-23 22 views
5

Tôi đang sử dụng linux, nfs, với nhiều máy liên quan.Tôi có thể nhận được báo động fcntl và Perl để hợp tác không?

Tôi đang cố gắng sử dụng fcntl để triển khai filelocking. Tôi đã sử dụng đàn cho đến khi tôi phát hiện ra nó chỉ hoạt động giữa các quá trình trên cùng một máy.

Bây giờ khi tôi gọi fcntl với F_SETLKW, báo động perl (để thêm thời gian chờ) không hoạt động như trước đây. Điều này thường sẽ là ok, nhưng ctrl-c không thực sự làm việc.

Điều tôi tin đang xảy ra, là fcntl chỉ kiểm tra tín hiệu sau mỗi 30 giây. Các báo động không trở lại cuối cùng. Các ctrl-c bị bắt, ... cuối cùng.

Tôi có thể làm gì để điều chỉnh tần suất kiểm tra fcntl cho các tín hiệu này không?

+4

Khóa trên NFS thật khó. Sử dụng 'File :: NFSLock' có lẽ sẽ cung cấp cho bạn một giải pháp mà chỉ hoạt động mà không cần phải viết bất kỳ mã nào cả. – rafl

+0

Tệp :: NFSLock có một số lỗ riêng.Nó cố gắng để chơi một số thủ thuật với hardlinks và các công cụ, nhưng nếu hệ thống tập tin của bạn bị quá tải, bạn có thể dễ dàng có điều kiện chủng tộc mang lại hai quy trình với cùng một khóa. – mmccoo

+2

Nó có một số thiếu sót trong tài liệu, bao gồm cả xu hướng bỏ đói quá trình chờ đợi trong tình huống rất có tranh chấp, vâng. Tuy nhiên, đối với vấn đề bạn đang cố gắng giải quyết nó vẫn có thể là sự cân bằng đúng đắn. Tôi không thể nói là bạn không mô tả hoàn cảnh của mình thêm nữa. Tuy nhiên, tôi có thể nói từ kinh nghiệm sử dụng File :: NFSLock: Tôi chưa bao giờ thấy cách tiếp cận của nó bỏ đói bất kỳ quy trình nào của tôi, ngay cả trong các tình huống có nhiều tranh cãi, so với hầu hết những thứ khác tôi đang làm. Số lượng các mô-đun tùy thuộc vào nó cũng có vẻ cho thấy nó đủ tốt cho hầu hết mọi người – rafl

Trả lời

1

Tôi chắc chắn không có chuyên gia về vấn đề này, nhưng kiến ​​thức của tôi là fcntl, như bạn cũng đã nêu, sẽ không hoạt động trong trường hợp của bạn. Khóa tư vấn fcntl chỉ có ý nghĩa trong cùng một máy.

Vì vậy, hãy quên tôi nếu điều này nếu không có chủ đề. Tôi đã sử dụng File::NFSLock để giải quyết vấn đề về bộ nhớ cache bão/dogpile/stampeding. Đã có nhiều máy chủ ứng dụng đọc và ghi các tệp bộ nhớ cache trên một ổ đĩa NFS (ý tưởng không phải là rất tốt, nhưng đó là những gì chúng tôi đã bắt đầu với).

Tôi đã xếp lớp/gói tệp :: NFSLock để sửa đổi hành vi của nó. Đặc biệt tôi cần:

  • dai dẳng ổ khóa, mà không mất đi khi một đối tượng File :: nfslock đi ra khỏi phạm vi. Sử dụng File :: NFSLock thông thường, khóa của bạn sẽ biến mất khi đối tượng nằm ngoài phạm vi. Đây không phải là những gì tôi cần.
  • rằng tệp khóa thực tế cũng chứa tên của máy đã mua khóa. Quá trình id rõ ràng là không đủ để quyết định liệu một quá trình được chấm dứt, vì vậy tôi có thể ăn cắp một cách an toàn lockfile. Vì vậy, tôi đã sửa đổi mã để viết các tệp khóa là machine:pid thay vì chỉ pid.

Điều này đã làm việc tuyệt vời trong một vài năm.

Cho đến khi số lượng yêu cầu tăng gấp 10 lần. Đó là, tháng trước tôi bắt đầu gặp phải những vấn đề đầu tiên mà một tập tin cache thực sự bận rộn đã được ghi vào hai backends tại cùng một thời điểm, để lại các khóa chết phía sau. Điều này xảy ra với tôi khi chúng tôi đạt khoảng 9-10 triệu lượt xem trang mỗi ngày, chỉ để cung cấp cho bạn ý tưởng.

Các bị hỏng file cache thức trông giống như:

<!-- START OF CACHE FILE BY BACKEND b1 --> 
... cache file contents ... 
<!-- END OF CACHE FILE BY BACKEND b1 --> 
... more cache file contents ... wtf ... 
<!-- END OF CACHE FILE BY BACKEND b2 --> 

này chỉ có thể xảy ra nếu hai backends viết thư cho cùng một tập tin cùng một lúc ... Đó là chưa rõ ràng nếu vấn đề này được gây ra bởi File: : NFSLock + mod của chúng tôi hoặc một số lỗi trong ứng dụng.

Tóm lại, nếu ứng dụng của bạn không quá bận rộn và bị buôn bán, hãy vào File :: NFSLock, tôi nghĩ đó là đặt cược tốt nhất của bạn. Bạn chắc chắn bạn vẫn muốn sử dụng NFS?

Các vấn đề liên quan