Solaris のシステム管理 (第 2 巻)

第 27 章 ネットワーク性能の監視手順

この章では、ネットワーク性能を監視する方法について説明します。この章で説明する手順は次のとおりです。

ネットワーク性能の監視

表 27-1 は、ネットワーク性能の監視に使用できるコマンドを示しています。

表 27-1 ネットワーク監視コマンド

コマンド 

用途 

ping

ネットワーク上でホストの応答を調べる 

spray

パケットサイズの信頼性をテストする。パケットが遅延またはドロップされていないかどうかを判別できる 

snoop

ネットワークからパケットを取り込み、各クライアントから各サーバーへのコールを追跡する 

netstat

TCP/IP トラフィックに使用されるインタフェース、IP ルーティングテーブル、UDPTCPICMPIGMP に関するプロトコルごとの統計情報など、ネットワークの状態が表示される

nfsstat

NFS の問題の分析に使用できるサーバーとクライアントの統計情報の集計が表示される 

ネットワーク上のホストの応答をチェックする方法

ping コマンドを使用して、ネットワーク上のホストの応答をチェックします。

$ ping hostname

物理的な問題があると思われる場合は、ping を使用してネットワーク上の複数のホストの応答時間を調べることができます。あるホストからの応答が期待したとおりでない場合は、そのホストを調査できます。物理的な問題は、次の原因で発生することがあります。

このコマンドの詳細は、ping(1M) のマニュアルページを参照してください。

例 - ネットワーク上のホストの応答をチェックする

ping の最も単純なバージョンは、ネットワーク上のホストにパケットを 1 つ送信します。正しい応答を受信すると、「host is alive」というメッセージを出力します。

$ ping elvis
elvis is alive

-s オプションを指定すると、ping は 1 秒ごとに 1 つずつデータグラムをホストに送信します。その後で、次のように各応答と往復の所要時間を出力します。

$ ping -s pluto
64 bytes from pluto (123.456.78.90): icmp_seq=0. time=10. ms
64 bytes from pluto (123.456.78.90): icmp_seq=5. time=0. ms
64 bytes from pluto (123.456.78.90): icmp_seq=6. time=0. ms
^C
----pluto PING Statistics----
8 packets transmitted, 8 packets received, 0% packet loss

round-trip (ms) min/avg/max = 0/2/10

ネットワーク上のホストにパケットを送信する方法

spray コマンドを使用すると、パケットサイズの信頼性をテストできます。

$ spray [ -c count -d interval -l packet_size] hostname
-c count

送信するパケット数 

-d interval

パケットを送信するたびに一時停止するマイクロ秒数。遅延を使用しないと、バッファーを使い果たす可能性がある 

-l packet_size

パケットサイズ 

hostname

パケットを送信するシステム 

このコマンドの詳細は、spray(1M) のマニュアルページを参照してください。

例 - ネットワーク上のホストにパケットを送信する

次の例では、それぞれが 2048 バイト (-l 2048) のパケット 100 個 (-c 100) がホストに送信されます 。パケットは、各バースト間で 20 マイクロ秒の遅延時間 (-d 20) ごとに送信されます。

$ spray -c 100 -d 20 -l 2048 pluto
sending 100 packets of length 2048 to pluto ...
no packets dropped by pluto
279 packets/sec, 573043 bytes/sec

ネットワークからパケットを取り込む方法

ネットワークからパケットを取り込み、各クライアントから各サーバーへのコールを追跡するには、snoop を使用します。このコマンドは、ネットワーク性能の問題を素早く発見できるように正確なタイムスタンプを提供します。詳細は、snoop(1M) のマニュアルページを参照してください。

# snoop

パケットがドロップされる場合は、バッファー領域不足または CPU の過負荷が原因となっていることがあります。

ネットワークの状態をチェックする方法

netstat コマンドを使用すると、ネットワークインタフェース、ルーティングテーブル、各種プロトコルの状態に統計情報など、ネットワークの状態に関する情報を表示できます。

$ netstat [-i] [-r] [-s]

-i

TCP/IP インタフェースの状態を表示する 

-r

IP ルーティングテーブルを表示する 

-s

UDPTCPICMPIGMP プロトコルの統計情報を表示する

詳細は、netstat(1M) のマニュアルページを参照してください。

例 - ネットワークの状態をチェックする

次の例は、netstat -i コマンドからの出力を示しています。このコマンドは、TCP/IP トラフィックに使用されるインタフェースの状態を表示します。

$ netstat -i
Name  Mtu  Net/Dest    Address      Ipkts  Ierrs Opkts  Oerrs Collis Queue
lo0   8232 software    localhost     1280   0     1280     0       0    0
le0   1500 loopback    venus      1628480   0   347070    16   39354    0

この表示画面は、マシンが各インタフェース上で送受信したパケット数を示しています。有効なネットワークトラフィックがあるマシンは、IpktsOpkts が絶えず増加し続けます。

衝突カウント (Collis) を発信パケット数 (Opkts) で割ると、ネットワーク衝突率を計算できます。上記の例では、衝突率は 3.5% です。ネットワーク全体の衝突率が 5% ないし 10% を超える場合は、問題が発生していることがあります。

入力エラー数を合計入力パケット数で割ると (Ierrs/Ipkts)、入力パケットエラー率を計算できます。出力パケットエラー率は、出力エラー数を合計出力パケット数で割った値 (Oerrs/Opkts) です。入力エラー率が高い (0.25% を超える) 場合は、ホストがパケットをドロップしている可能性があります。

次の例は、netstat -s コマンドからの出力を示しています。このコマンドは、UDPTCPICMPIGMP プロトコルに関してプロトコルごとの統計情報を表示します。

UDP
	udpInDatagrams      =196543	udpInErrors         =     0
	udpOutDatagrams     =187820

TCP	
 tcpRtoAlgorithm     =     4	tcpRtoMin           =   200
	tcpRtoMax           = 60000	tcpMaxConn          =    -1
	tcpActiveOpens      = 26952	tcpPassiveOpens     =   420
	tcpAttemptFails     =  1133	tcpEstabResets      =     9
	tcpCurrEstab        =    31	tcpOutSegs          =3957636
	tcpOutDataSegs      =2731494	tcpOutDataBytes     =1865269594
	tcpRetransSegs      = 36186	tcpRetransBytes     =3762520
	tcpOutAck           =1225849	tcpOutAckDelayed    =165044
	tcpOutUrg           =     7	tcpOutWinUpdate     =   315
	tcpOutWinProbe      =     0	tcpOutControl       = 56588
	tcpOutRsts          =   803	tcpOutFastRetrans   =   741
	tcpInSegs           =4587678
	tcpInAckSegs        =2087448	tcpInAckBytes       =1865292802
	tcpInDupAck         =109461	tcpInAckUnsent      =     0
	tcpInInorderSegs    =3877639	tcpInInorderBytes   =-598404107
	tcpInUnorderSegs    = 14756	tcpInUnorderBytes   =17985602
	tcpInDupSegs        =    34	tcpInDupBytes       = 32759
	tcpInPartDupSegs    =   212	tcpInPartDupBytes   =134800
	tcpInPastWinSegs    =     0	tcpInPastWinBytes   =     0
	tcpInWinProbe       =   456	tcpInWinUpdate      =     0
	tcpInClosed         =    99	tcpRttNoUpdate      =  6862
	tcpRttUpdate        =435097	tcpTimRetrans       = 15065
	tcpTimRetransDrop   =    67	tcpTimKeepalive     =   763
	tcpTimKeepaliveProbe=     1	tcpTimKeepaliveDrop =     0

IP	
 ipForwarding        =     2	ipDefaultTTL        =   255
	ipInReceives        =11757234	ipInHdrErrors       =     0
	ipInAddrErrors      =     0	ipInCksumErrs       =     0
	ipForwDatagrams     =     0	ipForwProhibits     =     0
	ipInUnknownProtos   =     0	ipInDiscards        =     0
	ipInDelivers        =4784901	ipOutRequests       =4195180
	ipOutDiscards       =     0	ipOutNoRoutes       =     0
	ipReasmTimeout      =    60	ipReasmReqds        =  8723
	ipReasmOKs          =  7565	ipReasmFails        =  1158
	ipReasmDuplicates   =     7	ipReasmPartDups     =     0
	ipFragOKs           = 19938	ipFragFails         =     0
	ipFragCreates       =116953	ipRoutingDiscards   =     0
	tcpInErrs           =     0	udpNoPorts          =6426577
	udpInCksumErrs      =     0	udpInOverflows      =   473
	rawipInOverflows    =     0

ICMP	
 icmpInMsgs          =490338	icmpInErrors        =     0
	icmpInCksumErrs     =     0	icmpInUnknowns      =     0
	icmpInDestUnreachs  =   618	icmpInTimeExcds     =   314
	icmpInParmProbs     =     0	icmpInSrcQuenchs    =     0
	icmpInRedirects     =   313	icmpInBadRedirects  =     5
	icmpInEchos         =   477	icmpInEchoReps      =    20
	icmpInTimestamps    =     0	icmpInTimestampReps =     0
	icmpInAddrMasks     =     0	icmpInAddrMaskReps  =     0
	icmpInFragNeeded    =     0	icmpOutMsgs         =   827
	icmpOutDrops        =   103	icmpOutErrors       =     0
	icmpOutDestUnreachs =    94	icmpOutTimeExcds    =   256
	icmpOutParmProbs    =     0	icmpOutSrcQuenchs   =     0
	icmpOutRedirects    =     0	icmpOutEchos        =     0
	icmpOutEchoReps     =   477	icmpOutTimestamps   =     0
	icmpOutTimestampReps=     0	icmpOutAddrMasks    =     0
	icmpOutAddrMaskReps =     0	icmpOutFragNeeded   =     0
	icmpInOverflows     =     0
IGMP:
        0 messages received
        0 messages received with too few bytes
        0 messages received with bad checksum
        0 membership queries received
        0 membership queries received with invalid field(s)
        0 membership reports received
        0 membership reports received with invalid field(s)
        0 membership reports received for groups to which we belong
        0 membership reports sent

次の例は、netstat -r コマンドからの出力を示しています。このコマンドは、IP ルーティングテーブルを表示します。

Routing Table:
  Destination          Gateway           Flags  Ref   Use    Interface
-------------------- -------------------- ----- ----- ------ ---------
localhost            localhost             UH       0   2817  lo0
earth-bb             pluto                 U        3  14293  le0
224.0.0.0            pluto                 U        3      0  le0
default              mars-gate             UG       0  14142  

表 27-2 は、netstat -r レポート内のフィールドを示しています。

表 27-2 netstat -r コマンドからの出力

フィールド名 

 

説明 

Flags

U

ルートが動作している 

 

G

ルートはゲートウェイを経由する 

 

H

ルートはホスト宛てである 

 

D

ルートはリダイレクトを使用して動的に作成された 

Ref

 

同じリンク層を共有する現在のルート数を示す 

Use

 

送信されたパケット数を示す 

Interface

 

ルートに使用されるネットワークインタフェースを表示する 

NFS サーバーとクライアントの統計情報を表示する方法

NFS 分散ファイルサービスは、ローカルコマンドをリモートホストへの要求に変換するリモートプロシージャコール (RPC) 機能を使用します。リモートプロシージャコールは同期しています。つまり、クライアントアプリケーションは、サーバーがコールを完了して結果を返すまでブロックまたは中断されます。NFS の性能に影響を及ぼす重要な要素の 1 つは再伝送率です。

ファイルサーバーがクライアントの要求に応答できない場合、クライアントは指定された回数だけ要求を再伝送して終了します。再伝送されるたびにシステムにオーバーヘッドがかかり、ネットワークトラフィックが増大します。再伝送率が高すぎると、ネットワーク性能が低下します。再伝送率が高い場合は、次のことを調べます。

表 27-3 に、クライアントとサーバーの統計情報を表示するための nfsstat オプションを説明します。

表 27-3 クライアント/サーバー統計情報を表示するためのコマンド

オプション 

表示される情報 

nfsstat -c

クライアントの統計情報 

nfsstat -s

サーバーの統計情報 

netstat -m

ファイルシステムごとのネットワーク統計情報 

nfsstat -c を使用するとクライアントの統計情報が表示され、nfsstat -s を使用するとサーバーの統計情報が表示されます。また、netstat -m を使用すると、各ファイルシステムのネットワーク統計情報が表示されます。詳細は、nfsstat(1M) のマニュアルページを参照してください。

例 - NFS サーバーとクライアントの統計情報を表示する

次の例は、クライアント pluto に関する RPC と NFS のデータを示しています。

$ nfsstat -c

        Client rpc:
Connection oriented:
calls    badcalls  badxids  timeouts newcreds  badverfs   timers     
1595799  1511      59       297      0         0          0          
cantconn nomem     interrupts 
1198      0         7          
Connectionless:
calls    badcalls  retrans  badxids  timeouts  newcreds   badverfs   
80785    3135      25029    193      9543      0          0          
timers   nomem     cantsend   
17399    0         0          

Client nfs:
calls    badcalls  clgets   cltoomany  
1640097  3112      1640097  0          
Version 2: (46366 calls)
null     getattr   setattr  root     lookup     readlink  read       
0 0%     6589 14%  2202 4%  0 0%     11506 24%  0 0%      7654 16%   
wrcache  write     create   remove   rename     link      symlink    
0 0%     13297 28% 1081 2%  0 0%     0 0%       0 0%      0 0%       
mkdir    rmdir     readdir  statfs     
24 0%    0 0%      906 1%   3107 6%    
Version 3: (1585571 calls)
null    getattr    setattr  lookup     access     readlink  read     
0 0%    508406 32% 10209 0% 263441 16% 400845 25% 3065 0%   117959 7%  
write    create     mkdir    symlink    mknod    remove   rmdir 
69201 4% 7615 0%    42 0%    16 0%      0 0%     7875 0%  51 0%      
rename   link       readdir  readdir+   fsstat   fsinfo   pathconf   
929 0%   597 0%     3986 0%  185145 11% 942 0%   300 0%   583 0%     
commit     
4364 0%    

Client nfs_acl:
Version 2: (3105 calls)
null       getacl     setacl     getattr    access     
0 0%       0 0%       0 0%       3105 100%  0 0%       
Version 3: (5055 calls)
null       getacl     setacl     
0 0%       5055 100%  0 0%    

表 27-4 は、nfsstat -c コマンドの出力を示しています。

表 27-4 nfsstat -c コマンドの出力

フィールド名 

説明 

calls

送信された合計コール数 

badcalls

RPC によって拒否された合計コール数 

retrans

再伝送の合計回数。このクライアントの場合、再伝送回数は 1% 未満 (6888 回のコールのうち 10 回のタイムアウト)。これは、一時的な障害が原因で発生することがある。1% 以上の値は、問題が発生している場合がある 

badxid

1 つの NFS 要求に対して重複する承認を受信した回数 

timeout

タイムアウトになったコール数 

wait

クライアントハンドルを利用できないためにコールが待機せざるを得なかった回数 

newcred

認証情報を再表示しなければならなかった回数 

timers

タイムアウト値がコールに対して指定されたタイムアウト値以上になった回数 

readlink

シンボリックリンクに対して読み込まれた回数。この数が大きすぎる (10% を超える) ときは、シンボリックリンクが多すぎることを示す場合がある 

次の例は、nfsstat -m コマンドからの出力を示しています。

pluto$ nfsstat -m
/usr/man from pluto:/export/svr4/man
Flags: vers=2,proto=udp,auth=unix,hard,intr,dynamic,
        rsize=8192, wsize=8192,retrans=5
 Lookups: srtt=13 (32ms), dev=10 (50ms), cur=6 (120ms)
 All:     srtt=13 (32ms), dev=10 (50ms), cur=6 (120ms)

表 27-5 は、この nfsstat -m コマンドのミリ秒単位で表示された出力を示しています。

表 27-5 nfsstat -m コマンドの出力

フィールド名 

説明 

srtt

平準化された平均往復時間 

dev

平均偏差 

cur

現在の「予想」応答時間 

ネットワークのハードウェア構成要素が問題の原因と思われる場合は、ケーブルとコネクタを慎重に調べる必要があります。