1) 簡介
內核參數會影響收發包性能,尤其是在發包比較快的網卡上,往往需要修改內核參數以提高性能。內核中有很多個buffer相關的參數,下面根據文檔解釋下各個參數作用。
參考文檔:
http://man7.org/linux/man-pages/man7/udp.7.html
http://man7.org/linux/man-pages/man7/tcp.7.html
http://man7.org/linux/man-pages/man7/socket.7.html
2) 測試情況
Socket上有個SO_RCVBUF和SO_RCVBUF兩個參數,可以通過修改這兩個參數增大單個socket的緩沖區。
通過測試發現,UDP中SO_RCVBUF與內核中/proc/sys/net/core/rmem_default對應,SO_SNDBUF與/proc/sys/net/core/wmem_default對應。
而TCP中SO_RCVBUF與內核中/proc/sys/net/ipv4/tcp_rmem 的第二項default對應,SO_SNDBUF與/proc/sys/net/ipv4/tcp_wmem的第二項default對應。
以下是內核buffer相關參數解釋:
內核參數 |
含義 |
|
net.core.rmem_default |
內核給單個socket分配的默認讀buffer大小 |
|
net.core.rmem_max |
所有socket的讀buffer不能超過這個值 |
|
net.core.wmem_default |
內核給單個socket分配的默認寫buffer大小 |
|
net.core.wmem_max |
所有socket的寫buffer不能超過這個值 |
|
net.ipv4.tcp_mem |
low |
如果全部tcp socket分配的內存少於這個值,不會調整內存 |
pressure |
如果全部tcp socket分配的內存超過這個值,內核將調整每個tcp socket的內存 |
|
high |
全部tcp socket分配的內存不超過這個值,這個值覆蓋其他限制 |
|
net.ipv4.tcp_rmem |
min |
當所有tcp socket使用內存緊張時,內核保證至少給每個tcp socket的讀buffer分配這個值的內存大小 |
default |
每個tcp socket默認讀buffer緩沖區,會覆蓋net.core.rmem_default |
|
max |
所有tcp socket讀buffer總大小上限,不會覆蓋net.core.rmem_max |
|
net.ipv4.tcp_wmem |
min |
當所有tcp socket使用內存緊張時,內核保證至少給每個tcp socket的寫buffer分配這個值的內存大小 |
default |
每個tcp socket默認寫buffer緩沖區,會覆蓋net.core.wmem_default |
|
max |
所有tcp socket寫buffer總大小上限,不會覆蓋net.core.wmem_max |
|
net.ipv4.udp_mem |
low |
如果全部udp socket分配的內存少於這個值,不會調整內存 |
pressure |
如果全部udp socket分配的內存超過這個值,內核將調整每個udp socket的內存 |
|
high |
全部udp socket分配的內存不超過這個值,這個值覆蓋其他限制 |
|
net.ipv4.udp_rmen_min |
當所有udp socket使用內存緊張時,內核保證至少給每個udp socket的讀buffer分配這個值的內存大小 |
|
net.ipv4.udp_wmen_min |
當所有udp socket使用內存緊張時,內核保證至少給每個udp socket的寫buffer分配這個值的內存大小 |
3) 疑問
net.core.rmem_max和net.core.wmem_max有沒有分TCP和UDP?
net.ipv4.tcp_rmem中max都被net.core.rmem_max覆蓋了,那么他的作用又是什么?