Điểm:2

Giới hạn hàng đợi tin nhắn Centos System V IPC

lá cờ cn

[Mặc dù tôi đang làm việc trong perl nhưng tôi tin rằng câu hỏi này liên quan đến Linux System V IPC API và giới hạn thay vì bất kỳ thứ gì cụ thể cho perl.]

Tôi có hai máy Centos, mỗi máy tại CentOS Linux phát hành 7.9.2009 (Core).

Tôi có một chương trình chia rẽ một đứa trẻ và sau đó sử dụng các thông báo IPC của Hệ thống V để giao tiếp với đứa trẻ, đứa trẻ chuẩn bị câu trả lời và gửi chúng cho phụ huynh.

Trên một máy, chúng tôi thấy hành vi dự kiến. Đứa trẻ tạo ra hàng loạt tin nhắn, cha mẹ tiêu thụ chúng. Đôi khi, đứa trẻ làm việc nhanh hơn cha mẹ một chút và do đó có thể lấp đầy hàng đợi, sau đó đứa trẻ đợi cho đến khi cha mẹ tiêu thụ một số tin nhắn và tiếp tục.

Chúng tôi có thể kiểm tra kích thước hàng đợi bằng ipcs -q và thấy rằng đôi khi đạt đến giới hạn mặc định là 10 thư trên mỗi hàng đợi, phần tử con tạm dừng và sau đó chúng tôi thấy hàng đợi trống như mong đợi.

Chúng tôi tin rằng giới hạn hàng đợi được chỉ định trong các tệp trong /proc/sys/fs/mqueue/ và ví dụ msg_max được coi là 10 dự kiến.Các giá trị này giống hệt nhau trên cả hai máy.

Chúng tôi cũng có thể xem ulimits của người dùng liên quan đến hàng đợi bằng cách sử dụng ulimit -q và thấy giá trị vượt quá 800.000 byte trên cả hai máy.

Điều khó hiểu là trên máy thứ hai của chúng tôi, chúng tôi thấy đứa trẻ viết ba tin nhắn vào hàng đợi và cố gắng viết tin nhắn thứ tư và đợi - chúng tôi cố tình không đặt thời gian chờ. Như thể người viết tin rằng hàng đợi đã đầy, mặc dù ipcs -q chỉ hiển thị 3 mục trong hàng đợi. Tại thời điểm này, cha mẹ vẫn chưa cố gắng đọc tin nhắn.

------ Hàng đợi tin nhắn --------
chủ sở hữu msqid chính cho phép các tin nhắn byte đã sử dụng    
0x0000002a 1474560 dave 600 15020 3  

Câu hỏi: ngoài việc hàng đợi đầy, điều gì sẽ khiến msgsnd() tạm dừng? Việc tạm dừng dường như tiếp tục vô thời hạn, đứa trẻ tiếp tục khi cha mẹ trở nên hoạt động và đọc một số tin nhắn.

Chúng tôi có nhiều máy chạy mã này mà không gặp sự cố. Nó không thành công trên ba máy mới. Có lẽ có một số tính năng dành riêng cho môi trường tương tác với mã của chúng tôi?

Mã perl sử dụng một thư viện nhỏ phía trên các lệnh gọi hệ thống (chi tiết được nêu rõ)

$mQueue = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR);
msgsnd( $mQueue, pack("l! a*", length($msg), $msg);
Điểm:2
lá cờ cn

Vấn đề là kích thước tối đa mặc định của hàng đợi cài đặt hạt nhân được đặt thành giá trị thấp.

Cal này được xem bằng cách sử dụng tùy chọn -l cho ipcs.

ipc -q -l

------ Giới hạn tin nhắn --------
hàng chờ tối đa trên toàn hệ thống = 3671
kích thước tối đa của tin nhắn (byte) = 8192
kích thước tối đa mặc định của hàng đợi (byte) = 16384

Cài đặt hạt nhân được đề cập được lưu trữ trong

/proc/sys/kernel/msgmnb

và có thể được thay đổi (với quyền root) bằng lệnh

 sysctl -w kernel.msgmnb=65536
 hạt nhân.msgmnb = 65536

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.