2010-01-19 22 views
26

Trong Linux, người ta có thể xác định mặc định của hệ thống nhận kích thước bộ đệm cho các gói mạng, nói UDP, sử dụng các lệnh sau:Xác định UDP nhận kích thước bộ đệm khi chạy trong Linux

sysctl -w net.core.rmem_max=<value> 
sysctl -w net.core.rmem_default=<value> 

Nhưng tôi tự hỏi, là nó có thể cho một ứng dụng (giả sử, trong c) để ghi đè các giá trị mặc định của hệ thống bằng cách chỉ định kích thước bộ đệm nhận cho mỗi UDP socket trong thời gian chạy?

Trả lời

28

Bạn có thể tăng giá trị từ mặc định, nhưng bạn không thể tăng giá trị vượt quá giá trị tối đa. Sử dụng setsockopt để thay đổi tùy chọn SO_RCVBUF:

int n = 1024 * 1024; 
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) { 
    // deal with failure, or ignore if you can live with the default size 
} 

Lưu ý rằng đây là giải pháp di động; nó sẽ hoạt động trên bất kỳ nền tảng POSIX nào để tăng dung lượng bộ đệm nhận. Linux đã có autotuning trong một thời gian (kể từ 2.6.7 và với reasonable maximum buffer sizes từ 2.6.17), điều này sẽ tự động điều chỉnh kích thước bộ đệm nhận dựa trên tải. Trên hạt nhân có tự dò, bạn không nên đặt kích thước bộ đệm nhận bằng cách sử dụng setsockopt, vì điều đó sẽ vô hiệu hóa tính năng tự dò tìm của hạt nhân. Tuy nhiên, việc sử dụng setsockopt để điều chỉnh kích thước bộ đệm vẫn có thể cần thiết trên các nền tảng khác.

+0

chỉ là những gì tôi đang tìm :) Tôi cũng tự hỏi, nếu tôi đã chỉ định kích thước bộ đệm cho một giá trị nhỏ, nó sẽ là tĩnh? Hoặc hệ thống sẽ tự động thay đổi kích thước bộ đệm để xử lý áp lực giao thông, nếu có? –

+0

Tôi đã mở rộng câu trả lời của mình một chút để đề cập đến việc tự động chạy Linux TCP; trên Linux, nếu autotuning được kích hoạt, bạn có lẽ không nên điều chỉnh kích thước bộ đệm bằng cách sử dụng 'setsockopt'; nhưng trên các hệ thống khác, bạn vẫn có thể muốn. –

+4

autotuning áp dụng cho TCP chỉ hoặc nó áp dụng cho cả TCP và UDP? – kumar

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