hrk1l2x

2 minute read

Linuxにおけるネットワークパフォーマンスのボトルネック改善と向上

負荷

  • ネットワーク負荷
  • サーバ負荷
    • サーバ設定の問題
    • リソースの問題

Linux Process

  • CPUコアの時分割による process 同時実行
  • 実行 queue に複数 process が入り、単位時間辺り process 数分の context switch を行い全 process が同時実行されているように見えている。
    • vmstat > procs > r 実行可能で、実行 queue に入っている(kernelによってCPUリソースを割り当てられた) process 数。
    • vmstat > procs > b 実行可能だが disk, network I/O 待ちか、何らかの理由で処理がブロックされている process 数。

LA

  • procs r+b = LA I/O待ち状態が原因でCPUが利用されていないプロセスの合計を示しており、負荷状況を把握することができます。 I/O負荷が全く無い状態を仮定すると、1プロセスがCPUを100%占有している際にはロードアベレージが1となり、2プロセスで100%占有している場合は2となります。 ちなみに、CPUのコア数が1個の場合はロードアベレージが1になるとCPUが100%使用されている状態であり、コア数が16個の場合はロードアベレージ16になるとCPUが100%使用されている状態となります。 逆に、CPUの負荷がかかっていないのにロードアベレージが上昇している場合には、I/Oがボトルネックになっていることを示します。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2109736 150584 998174848    0    0  1579    11    8   43  0  0 98  1  0
 0  0      0 2100284 150592 998176896    0    0     4   380 3244 1556  0  0 99  0  0
 0  0      0 2100908 150600 998177664    0    0     0   580 3326 1613  0  0 100  0  0
 1  0      0 2091604 150616 998180736    0    0     0   779 6866 2974  0  1 99  0  0
 1  0      0 2091864 150624 998181888    0    0     0   720 6691 2664  1  1 99  0  0
 0  0      0 2093636 150648 998179264    0    0     0   804 8138 2953  1  1 97  0  0

procs r - 実行待ちのプロセス数 b - I/O待ちのプロセス数

memory swpd - スワップの使用量 free - 空きメモリ容量 buff - バッファキャッシュの使用量 cache - ページキャッシュの使用量

swap si - スワップインした回数の秒間平均 so - スワップアウトした回数の秒間平均 io bi - HDDから読み込んだブロック数の秒間平均 bo - HDDへ書き込んだブロック数の秒間平均

system in - 1秒あたりの割り込み回数 cs - 1秒あたりのコンテキストスイッチの回数

cpu us - カーネル以外が使用したCPU使用率 sy - カーネルが使用したCPU使用率 id - アイドル状態の割合 wa - I/Oウェイトにかかった割合 st - Xenなどで、別のDOMが使用したCPU割合

リソースの枯渇箇所特定

LB, Proxy, Web Application, DB のどこか?

  • CPU: user, sys, iowait
  • Memory: used, cached, buffer
  • Disk: write IOPS, read IOPS, read latency
  • Network: Transmit eXchange bps, Receive eXchange bps, tx pps
  • IRQ(Interrupt ReQuest: 割り込み要求)ソフト割り込み要求(パケット受信)の負荷が高いか。
    • パケットが増加すると…割り込み、コンテキストスイッチが増加し、CPU負荷が上がる。

パケット受信フロー

  1. NIC
    1. パケット転送
  2. kenerl
    1. パケット受信
    2. softnet_stat Backlog
    3. RX-ring(Ring buffer)・・・ハード割り込み(Ring buffer にパケットを積むまで)
    4. プロトコル処理(TCP/IPのパケットヘッダ解析,チェックサム計算等)・・・NAPIによるPolling
    5. Socket buffer・・・ソフト割り込み(残りの処理は、ソフト割り込みで非同期遅延処理)
    6. データ受信処理
  3. プロセス

ハード割り込みはパケットをバッファに積み、1回の割り込み処理のCPU負荷を下げ、ソフト割り込みはプロトコル処理を非同期遅延処理する。通常ハード割り込みがかかった同じCPUコアでソフト割り込みを実行するが、RPS(Receive Packet Steering)により、割り込み処理を複数コアに分散させることも可能。CPUキャッシュヒット率を高めたRFS(Receive Flow Steering)もある。

Linux ネットワークインターフェースの確認

Linuxの通信速度が遅い場合の調べ方として、CentOS,RHEL7 の前は ifconfig だったが、7以降は ip が主流。

# インターフェースの状態確認
$ ip -s link show

# 受信側パラメータ設定確認
$ ethtool -g eth0

dropped

無効化したIPv6のパケットを受信したり、Ethernet ヘッダの Type に未サポートのプロトコルが入った場合の、破棄された未サポートプロトコルパケットの数や、大量のパケットを受信し softnet_stat プログラムの Backlog (積み残し処理) が溢れた数を表す。

overrun

大量のパケット(スパイク)を受信し、RX-ring (Ring-buffer: NICの受信パケットを扱うメモリバッファ領域) が不足して処理が行えず、破棄したパケットの数。

RX-ring(ring buffer)の確認

ethtool -g ens33
comments powered by Disqus