通信性能に影響するLinuxのOS設定(UDP編)
前回の記事https://support.bytix.tech/blog/linux_tcp_performance_settings/でTCPで遅延がある環境で性能を出すためのパラメータ設定方法を解説しました。今回はUDPで10Gbps~の環境で性能を出すためのパラメータ設定を解説します。
UDPの設定
UDPは、TCPのように遅延に応じてバッファサイズを大きくする必要はありません。UDPのバッファは、送受信時にNICからプログラムへデータが渡るまでの一時的なパケットデータを保持するためのもので、ローカル側の処理遅延を吸収するためのものになるため、TCPよりも必要なバッファサイズは小さくなります。基本的に1Gbpsの環境ではデフォルト設定から変更する必要はありませんが、10Gbps~の環境で、UDPを帯域上限まで通信しようとした場合はバッファが不足することがあります。OSのデフォルト値はディストリビューションによって変わりますが、数百KB程度です。10Gbps~でUDPの性能を安定させるためには、バッファサイズは4MB程度は必要です。
Linuxでは、以下のコマンドでUDPのバッファサイズを設定します。
sysctl -w net.core.rmem_max=<val> sysctl -w net.core.wmem_max=<val> # 例:最大バッファサイズを4MBに設定 sysctl -w net.core.rmem_max=4194304 sysctl -w net.core.wmem_max=4194304
パラメータ名にUDPが含まれていませんが、これはソケット全体に影響する設定のためです。UDPの設定としてnet.ipv4.udp_memというものがありますが、こちらはソケットバッファサイズの設定ではないので注意してください。
永続化するためにはTCPの設定と同様に、以下のようにします。
# /etc/sysctl.confのファイルに以下を追記 # 例:最大バッファサイズを4MBに設定 net.core.rmem_max=4194304 net.core.wmem_max=4194304 # 設定を反映 sysctl -p
Linux以外の場合
TCPやUDPのバッファサイズが不足する問題は、Linux以外のOS(WindowsやMac)でも同様に起こります。この記事では述べませんが、Windowsはレジストリ、MacOSはLinuxとパラメータ名は異なりますがsysctlコマンドで設定が可能です。