パケットロスト、キュー/フレーム損失の改善
フレームがドロップしてるかを調べる
<devname>
内でいくつのフレームがドロップされたか調べる。
とりあえず ifconfig
の dropped
で調べられる。
<devname>: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.10.0.130 netmask 255.255.0.0 broadcast 10.10.255.255 inet6 fe80::2d8:61ff:fe6f:5a95 prefixlen 64 scopeid 0x20<link> ether 00:d8:61:6f:5a:95 txqueuelen 1000 (Ethernet) RX packets 157561 bytes 20855430 (19.8 MiB) RX errors 0 dropped 16450 overruns 0 frame 0 TX packets 118302 bytes 55624032 (53.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16
ethtool
で詳細を調べる。
$ ethtool -S <devname> NIC statistics: rx_packets: 165081 rx_bcast_packets: 33476 rx_mcast_packets: 15379 rx_pause_packets: 0 rx_ctrl_packets: 24 rx_fcs_errors: 0 rx_length_errors: 0 rx_bytes: 21501848 rx_runt_packets: 0 rx_fragments: 0 rx_64B_or_less_packets: 62795 rx_65B_to_127B_packets: 93092 rx_128B_to_255B_packets: 16385 rx_256B_to_511B_packets: 6979 rx_512B_to_1023B_packets: 776 rx_1024B_to_1518B_packets: 5270 rx_1519B_to_mtu_packets: 0 rx_oversize_packets: 0 rx_rxf_ov_drop_packets: 0 rx_rrd_ov_drop_packets: 0 rx_align_errors: 0 rx_bcast_bytes: 2632366 rx_mcast_bytes: 1912872 rx_address_errors: 20324 tx_packets: 123396 tx_bcast_packets: 431 tx_mcast_packets: 26 tx_pause_packets: 0 tx_exc_defer_packets: 0 tx_ctrl_packets: 0 tx_defer_packets: 0 tx_bytes: 57629090 tx_64B_or_less_packets: 7608 tx_65B_to_127B_packets: 52101 tx_128B_to_255B_packets: 20852 tx_256B_to_511B_packets: 5505 tx_512B_to_1023B_packets: 7292 tx_1024B_to_1518B_packets: 30038 tx_1519B_to_mtu_packets: 0 tx_single_collision: 0 tx_multiple_collisions: 0 tx_late_collision: 0 tx_abort_collision: 0 tx_underrun: 0 tx_trd_eop: 0 tx_length_errors: 0 tx_trunc_packets: 0 tx_bcast_bytes: 43980 tx_mcast_bytes: 3866 tx_update: 0
ドライバでキューを長くする
ドライバーが許可する最高値まで指定のキューでバッファー数を増やせる。 メモリに余裕があるなら取り合経ず増やして損はない、と思う。
$ ethtool -g <devname> Ring parameters for eth0: Pre-set maximums: RX: 1020 <-- ここまで上げられる RX Mini: 0 RX Jumbo: 4080 TX: 255 Current hardware settings: RX: 255 <-- 現在値 RX Mini: 0 RX Jumbo: 0 TX: 255
増やす。
$ ethtool -G <devname> rx 512
ただ、NICによって、リングバッファが変更できないこともある。
$ ethtool -g <devname> Cannot get device ring settings: Operation not supported
カーネルのキューを長くする
リングバッファが増やせなかった場合 netdev_max_backlog
を増やすことで対応できる。
ネットワークデバイス別にカーネルが処理できるように貯めておく queue
サイズを大きくできる。
メモリの使用量が増えるだけなので、適当に大きくしても問題ない、はず。
$ sysctl -w net.core.netdev_max_backlog="30000"
キューの排出率を高める
NAPIの1回のソフトウェア割り込みでポーリングする上限パケット数を設定する。 大量の受信トラフィックでポーリング処理が追い付かずNICにパケットのドロップが発生する状況では値を増加させると症状が改善する場合がある。
$ cat /proc/sys/net/core/dev_weight 64
増やす。
$ sysctl -w net.core.dev_weight=128 net.core.dev_weight = 128
一回のソフトウェア割り込みでポーリングする回数が増えるので、その間CPUはスケジューリングが出来なくなる。 なので、あまり大きくしないこと。