suima8のメモ

メモです

memo

パケットロスト、キュー/フレーム損失の改善

フレームがドロップしてるかを調べる

<devname> 内でいくつのフレームがドロップされたか調べる。 とりあえず ifconfigdropped で調べられる。

<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はスケジューリングが出来なくなる。 なので、あまり大きくしないこと。