1.3. パケットドロップを回避するためにネットワークデバイスのバックログキューをチューニングする
ネットワークカードがパケットを受信し、カーネルプロトコルスタックがこれらのパケットを処理する前に、カーネルはこれらのパケットをバックログキューに保存します。カーネルは、CPU コアごとに個別のキューを維持します。
コアのバックログキューがいっぱいの場合、カーネルは、netif_receive_skb() カーネル関数がこのキューに割り当てるそれ以降の受信パケットをすべてドロップします。サーバーに速度が 10 Gbps 以上のネットワークアダプターまたは複数の 1 Gbps アダプターが含まれている場合は、バックログキューのサイズをチューニングしてこの問題を回避します。
前提条件
- 速度が 10 Gbps 以上、または複数の 1 Gbps ネットワークアダプター
手順
バックログキューのチューニングが必要かどうかを判断し、
/proc/net/softnet_statファイル内のカウンターを表示します。# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 18862 0 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ...この
awkコマンドは、/proc/net/softnet_statの値を 16 進形式から 10 進形式に変換し、表形式で表示します。各行は、コア 0 から始まる CPU コアを表します。関連する列は次のとおりです。
- 最初の列: 受信フレームの総数
- 2 番目の列: バックログキューがいっぱいであるためにドロップされたフレームの数
- 最後の列: CPU コア番号
/proc/net/softnet_statファイルの 2 番目の列の値が時間の経過とともに増加する場合は、バックログキューのサイズを増やします。現在のバックログキューのサイズを表示します。
# sysctl net.core.netdev_max_backlog net.core.netdev_max_backlog = 1000次の内容を含む
/etc/sysctl.d/10-netdev_max_backlog.confファイルを作成します。net.core.netdev_max_backlog = 2000net.core.netdev_max_backlogパラメーターを現在の値の 2 倍に設定します。/etc/sysctl.d/10-netdev_max_backlog.confファイルから設定をロードします。# sysctl -p /etc/sysctl.d/10-netdev_max_backlog.conf
検証
/proc/net/softnet_statファイルの 2 番目の列を監視します。# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -tそれでも値が増加する場合は、
net.core.netdev_max_backlog値を再度 2 倍にします。パケットドロップカウンターが増加しなくなるまで、このプロセスを繰り返します。