ネットワーク情報の詳細を探る
表1.ポイントと項目
No | ポイント | コマンドとオプション | 内容 |
@ | ノードの応答時間は? | ping -s hostname [ data_size ] [ count ] | 特定ノードの応答時間を確認する |
traceroute hostname | 途中のノードも含めた応答時間を確認する | ||
A | トラフィックの内容は? | snoop -d LANIF | 特定LANインタフェースのパケットダンプ |
snoop -d LANIF -V | パケットトレースを表示 | ||
snoop -d LANIF -v | 詳細なパケット情報をトレース | ||
snoop -d LANIF protocol | protocolで示されるトレースを表示 | ||
snoop -d LANIF AHost BHost PortNo | A、BHostのPortNoで示される情報をトレース | ||
B | nddコマンドで値を変更する方法は? | ndd /dev/xxx \? | xxxドライバのパラメタ一覧を表示 |
ndd /dev/xxx param | xxxドライバのparam値を表示 | ||
ndd -set /dev/xxx param value | xxxドライバのparam値をvalueに変更 | ||
/etc/system | nddでセットされないパラメタのチューニング |
ネットワーク上の特定ノードの応答時間は、pingコマンド-sオプションで測定します。図1.1に出力例を示します。応答時間の最小、平均、最大値がround-tripにミリ秒の単位で表示されます。-sオプションを指定しない形式は、通常、特定ノードが生きているかどうかを確認するのに用いられます。表示は"hostname is alive"と表示されます。その他のオプションは、ping(1M)のマニュアルページをご覧下さい。
# ping www.actcrp.com <CR> www.actcrp.com is alive # ping -s www.actcrp.com 56 5 <CR> PING www.actcrp.com: 56 data bytes 64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=0. time=100. ms 64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=1. time=96. ms 64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=2. time=45. ms 64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=3. time=71. ms 64 bytes from business2e.plala.or.jp (210.153.70.21): icmp_seq=4. time=106. ms ----www.actcrp.com PING Statistics---- 5 packets transmitted, 5 packets received, 0% packet loss round-trip (ms) min/avg/max = 45/83/106 # |
図1.1 pingコマンド-sオプションの実行例
pinglコマンド-sオプションで表示されるround-trip時間は、通常、隣接ノードの場合、0ミリ秒です。いくつかのノードを経由した場合、転送遅延が生じます。ノード間の遅延を調べるには、tracerouteコマンドを用います。図1.2にtracerouteの出力例を示します。先頭の番号はホップ数です。ホップ数は30が省略時値で、-mオプションで変更することが出来ます。そのホップのノードに3回のICMP要求を送信します。それらの3回のICMP要求に対する応答時間がミリ秒で表示されます。ICMP要求の回数は-qオプションで指定することが出来ます。その他のオプションは、traceroute(1M)のマニュアルページをご覧下さい。
# traceroute www.actcrp.com <CR> traceroute to www.actcrp.com (210.153.70.21), 30 hops max, 40 byte packets 1 ---.---.0.1 (---.---.0.1) 0.544 ms 0.317 ms 0.310 ms 2 t252168.ap.plala.or.jp (220.220.252.168) 2.446 ms 2.427 ms 1.989 ms 3 t252161.ap.plala.or.jp (220.220.252.161) 2.506 ms 2.412 ms 3.566 ms 4 t250025.ap.plala.or.jp (220.220.250.25) 3.395 ms 3.335 ms 2.897 ms 5 218.43.251.249 (218.43.251.249) 3.191 ms 2.453 ms 3.417 ms 6 221.184.4.1 (221.184.4.1) 3.055 ms 2.497 ms 3.215 ms 7 61.207.0.10 (61.207.0.10) 3.213 ms 3.015 ms 2.533 ms 8 210.150.215.213 (210.150.215.213) 3.404 ms 2.770 ms 3.091 ms 9 g1-1-n-otemachi-core6.sphere.ad.jp (203.138.68.205) 3.264 ms 4.760 ms 2.887 ms 10 p3-1-kanda-core6.sphere.ad.jp (202.239.114.221) 3.071 ms 4.379 ms 4.537 ms 11 g3-0-kanda-core3.sphere.ad.jp (203.138.72.65) 3.876 ms 3.567 ms 3.493 ms 12 f0-0-0-kanda-arena-gw8.sphere.ad.jp (203.138.77.41) 5.510 ms 3.870 ms 4.596 ms 13 202.229.129.38 (202.229.129.38) 4.056 ms 3.845 ms 4.543 ms 14 202.229.63.2 (202.229.63.2) 5.796 ms 5.563 ms 5.103 ms 15 202.229.63.166 (202.229.63.166) 6.625 ms 4.926 ms 5.147 ms 16 210.153.0.241 (210.153.0.241) 6.561 ms 5.947 ms 6.150 ms 17 * * * : 30 * * * # |
図1.2 tracerouteコマンドの出力例
ネットワークを流れるデータはさまざまなプロトコルによって転送されます。netstatコマンドでは、TCP/IPやLANレベルのパケット数やバイト数の統計情報、pingコマンドでは、ICMPの応答時間を測定しました。ときに、ネットワーク状態が悪く再送エラーが発生したり、プロトコル上の問題が発生したような場合、パケットの詳細な内容や、データを調査したい場合があります。このような場合、一般にスニーファをネットワークに接続してデータを採取します。Solarisのsnoopコマンドはスニーファと同様の機能を持っており、ネットワークデータを捕まえることが出来ます。図2.1は特定のLANインタフェースを流れるデータをキャプチャしたものです。
【注意】 | snoopコマンドはあらゆるデータをキャプチャすることが出来ますので、使用にあたって十分ご注意願います。特にパスワード、重要なデータ等、機密情報は取り扱いにご注意下さい。セキュリティ保持は特に重要です。採取データの管理を厳重にするようご注意下さい。 |
# snoop -d eri0 <CR> Using device /dev/eri (promiscuous mode) ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 Using device /dev/er ---.---.0.3 -> act061 TELNET C port=1067 act061 -> dns2.plala.or.jp DNS C 3.0.168.192.in-addr.arpa. Internet PTR ? dns2.plala.or.jp -> act061 DNS R Error: 3(Name Error) act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0 ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192. ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 act061 -> dns2 ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 dns2.plala.or.jp -> ---.---.0.3 -> act061 TELNET C port=1067 ^C# |
図2.1 snoopコマンドによる特定LANインタフェースのパケットキャプチャ
図2.2はsnoopコマンド-Vオプションで、パケット1個を1行にしてデータをキャプチャしたものです。
# snoop -d eri0 -V <CR> Using device /dev/eri (promiscuous mode) ________________________________ ---.---.0.3 -> act061 ETHER Type=0800 (IP), size = 60 bytes ---.---.0.3 -> act061 IP D=---.---.0.4 S=---.---.0.3 LEN=40, ID=22216 ---.---.0.3 -> act061 TCP D=23 S=1067 Ack=389349499 Seq=1176318504 Len=0 Win=64218 ---.---.0.3 -> act061 TELNET C port=1067 ________________________________ act061 -> ---.---.0.3 ETHER Type=0800 (IP), size = 96 bytes act061 -> ---.---.0.3 IP D=---.---.0.3 S=---.---.0.4 LEN=82, ID=36799 act061 -> ---.---.0.3 TCP D=1067 S=23 Ack=1176318504 Seq=389349499 Len=42 Win=24820 act061 -> ---.---.0.3 TELNET R port=1067 Using device /dev/er ________________________________ ---.---.0.3 -> act061 ETHER Type=0800 (IP), size = 60 bytes ---.---.0.3 -> act061 IP D=---.---.0.4 S=---.---.0.3 LEN=40, ID=22217 ---.---.0.3 -> act061 TCP D=23 S=1067 Ack=389349541 Seq=1176318504 Len=0 Win=64176 ---.---.0.3 -> act061 TELNET C port=1067 ________________________________ act061 -> dns2.plala.or.jp ETHER Type=0800 (IP), size = 84 bytes act061 -> dns2.plala.or.jp IP D=210.153.0.130 S=---.---.0.4 LEN=70, ID=34673 act061 -> dns2.plala.or.jp UDP D=53 S=33481 LEN=50 act061 -> dns2.plala.or.jp DNS C 3.0.168.192.in-addr.arpa. Internet PTR ? ________________________________ dns2.plala.or.jp -> act061 ETHER Type=0800 (IP), size = 147 bytes dns2.plala.or.jp -> act061 IP D=---.---.0.4 S=210.153.0.130 LEN=133, ID=50483 dns2.plala.or.jp -> act061 UDP D=33481 S=53 LEN=113 dns2.plala.or.jp -> act061 DNS R Error: 3(Name Error) |
図2.2 snoopコマンド-V オプションによる1パケット1行のキャプチャ
図2.3は、snoopコマンド-vオプションでより詳細にパケット情報をキャプチャしたものです。
# snoop -d eri0 -v <CR> : TELNET: ----- TELNET: ----- TELNET: TELNET: "TCP: .... ...0 = No Fin\r\nTCP: Window = 63846\r\nTCP: " TELNET: ETHER: ----- Ether Header ----- ETHER: ETHER: Packet 18 arrived at 15:54:50.07 ETHER: Packet size = 60 bytes ETHER: Destination = 0:3:ba:10:6:f, ETHER: Source = 0:6:5b:c7:fc:51, ETHER: Ethertype = 0800 (IP) ETHER: IP: ----- IP Header ----- IP: IP: Version = 4 IP: Header length = 20 bytes IP: Type of service = 0x00 IP: xxx. .... = 0 (precedence) IP: ...0 .... = normal delay IP: .... 0... = normal throughput IP: .... .0.. = normal reliability IP: Total length = 40 bytes IP: Identification = 22547 IP: Flags = 0x4 IP: .1.. .... = do not fragment IP: ..0. .... = last fragment IP: Fragment offset = 0 bytes IP: Time to live = 128 seconds/hops IP: Protocol = 6 (TCP) IP: Header checksum = 2165 IP: Source address = ---.---.0.3, ---.---.0.3 IP: Destination address = ---.---.0.4, act061 IP: No options IP: TCP: ----- TCP Header ----- TCP: TCP: Source port = 1067 TCP: Destination port = 23 (TELNET) TCP: Sequence number = 1176318525 TCP: Acknowledgement number = 389360607 TCP: Data offset = 20 bytes TCP: Flags = 0x10 TCP: ..0. .... = No urgent pointer TCP: ...1 .... = Acknowledgement TCP: .... 0... = No push TCP: .... .0.. = No reset TCP: .... ..0. = No Syn TCP: .... ...0 = No Fin TCP: Window = 64008 TCP: Checksum = 0x74c3 TCP: Urgent pointer = 0 TCP: No options ^C# |
図2.3 snoopコマンド-vオプションによる詳細なパケットキャプチャ
図2.4は、snoopコマンドでプロトコル名を指定した例です。
# snoop -d eri0 tcp <CR> Using device /dev/eri (promiscuous mode) ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 Using device /dev/er ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0 ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192. ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192. ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0 ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 act061 -> 192. ---.---.0.3 -> act061 TELNET C port=1067 act061 -> ---.---.0.3 TELNET R port=1067 ---.---.0.3 -> act0 ---.---.0.3 -> act061 TELNET C port=1067 ^C# |
図2.4 snoopコマンドのプロトコル指定によるパケットキャプチャ
特定のLANインタフェースを指定すると、そのLANインタフェースを使用すべての通信相手のデータがキャプチャされ、結果、大きなトレースファイルになることがあります。これを絞り込むため、所定の通信相手とのパケット送受信だけをキャプチャしたい場合、IPアドレスを指定することが出来ます。図2.5にその例を示します。
# snoop -d eri0 ---.---.0.4 ---.---.0.7 23 <CR> Using device /dev/eri (promiscuous mode) ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 \377\373\1\377\375\1login: ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 ---.---.0.7 -> act061 TELNET C port=1235 o act061 -> ---.---.0.7 TELNET R port=1235 o ---.---.0.7 -> act061 TELNET C port=1235 r act061 -> ---.---.0.7 TELNET R port=1235 r ---.---.0.7 -> act061 TELNET C port=1235 a act061 -> ---.---.0.7 TELNET R port=1235 a ---.---.0.7 -> act061 TELNET C port=1235 ---.---.0.7 -> act061 TELNET C port=1235 c act061 -> ---.---.0.7 TELNET R port=1235 c ---.---.0.7 -> act061 TELNET C port=1235 l act061 -> ---.---.0.7 TELNET R port=1235 l ---.---.0.7 -> act061 TELNET C port=1235 e act061 -> ---.---.0.7 TELNET R port=1235 e ---.---.0.7 -> act061 TELNET C port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 Password: ---.---.0.7 -> act061 TELNET C port=1235 ---.---.0.7 -> act061 TELNET C port=1235 h act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 o act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 g act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 e act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 h act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 o act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 g act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 ---.---.0.7 -> act061 TELNET C port=1235 act061 -> ---.---.0.7 TELNET R port=1235 Last login: Sat Aug ---.---.0.7 -> act061 TELNET C port=1235 ^C# |
図2.5 snoopコマンドによる特定ノード間のパケットキャプチャ
パフォーマンスチューニングにおいて、nddコマンドを用いてネットワーク関連パラメタをチューニングすることが出来ます。個々のチューニングパラメタは、プロトコル毎に"/dev/xxx"のように指定します。xxxに、tcp、ip、icmp、udpなどのプロトコル(ドライバ名)を指定します。では、どれだけのパラメタがそのプロトコルにあるのでしょうか? 図3.1はTCPプロトコルの持つチューニングパラメタを表示したものです。先頭から3行目より、最後から2行目までがパラメタです。各々"()"(括弧)内に、そのパラメタが読み取りか書き込み、いずれが可能か表示されます。
# ndd /dev/tcp \? <CR> ? (read only) tcp_time_wait_interval (read and write) tcp_conn_req_max_q (read and write) tcp_conn_req_max_q0 (read and write) tcp_conn_req_min (read and write) tcp_conn_grace_period (read and write) tcp_cwnd_max (read and write) tcp_debug (read and write) tcp_smallest_nonpriv_port (read and write) tcp_ip_abort_cinterval (read and write) tcp_ip_abort_linterval (read and write) tcp_ip_abort_interval (read and write) tcp_ip_notify_cinterval (read and write) tcp_ip_notify_interval (read and write) tcp_ipv4_ttl (read and write) tcp_keepalive_interval (read and write) tcp_maxpsz_multiplier (read and write) tcp_mss_def_ipv4 (read and write) tcp_mss_max_ipv4 (read and write) tcp_mss_min (read and write) tcp_naglim_def (read and write) tcp_rexmit_interval_initial (read and write) tcp_rexmit_interval_max (read and write) tcp_rexmit_interval_min (read and write) tcp_deferred_ack_interval (read and write) tcp_snd_lowat_fraction (read and write) tcp_sth_rcv_hiwat (read and write) tcp_sth_rcv_lowat (read and write) tcp_dupack_fast_retransmit (read and write) tcp_ignore_path_mtu (read and write) tcp_rcv_push_wait (read and write) tcp_smallest_anon_port (read and write) tcp_largest_anon_port (read and write) tcp_xmit_hiwat (read and write) tcp_xmit_lowat (read and write) tcp_recv_hiwat (read and write) tcp_recv_hiwat_minmss (read and write) tcp_fin_wait_2_flush_interval (read and write) tcp_co_min (read and write) tcp_max_buf (read and write) tcp_strong_iss (read and write) tcp_rtt_updates (read and write) tcp_wscale_always (read and write) tcp_tstamp_always (read and write) tcp_tstamp_if_wscale (read and write) tcp_rexmit_interval_extra (read and write) tcp_deferred_acks_max (read and write) tcp_slow_start_after_idle (read and write) tcp_slow_start_initial (read and write) tcp_co_timer_interval (read and write) tcp_sack_permitted (read and write) tcp_trace (read and write) tcp_compression_enabled (read and write) tcp_ipv6_hoplimit (read and write) tcp_mss_def_ipv6 (read and write) tcp_mss_max_ipv6 (read and write) tcp_rev_src_routes (read and write) tcp_ndd_get_info_interval (read and write) tcp_wroff_xtra (read and write) tcp_extra_priv_ports (read only) tcp_extra_priv_ports_add (write only) tcp_extra_priv_ports_del (write only) tcp_status (read only) tcp_bind_hash (read only) tcp_listen_hash (read only) tcp_conn_hash (read only) tcp_acceptor_hash (read only) tcp_host_param (read and write) tcp_time_wait_stats (read only) tcp_host_param_ipv6 (read and write) tcp_1948_phrase (write only) tcp_reserved_port_list (read only) tcp_close_wait_interval(obsoleted- use tcp_time_wait_interval) (no read or write) # |
図3.1 TCPドライバのネットワークチューニングパラメタ
"write"の表示されているパラメタは、nddコマンドによって動的に変更することが出来ます。"read only"と表示されているパラメタは値の表示のみ出来ます。一部のパラメタはnddコマンドではなく、/etc/systemファイルに指定するものがあります。表3にネットワーク関連の/etc/systemファイルに記述するパラメタを示します(現在のところ、TCPドライバのみです)。
表3./etc/systemファイルに記述するネットワークチューニングパラメタ
ドライバ名 | パラメタ |
tcp | tcp_bind_hash |
tcp_listen_hash | |
tcp_conn_hash | |
tcp_acceptor_hash |
図3.1ではTCPドライバのパラメタ一覧を示しました。他のドライバのパラメタはどうなっているのでしょうか? 図3.2は、全部のネットワークドライバに関するパラメタを"ドライバ名_tags"のファイル、各パラメタの値を"ドライバ名_params"のファイルに書き出すシェルスクリプトです。なお、最初のfor文にある引数の"eri"は、LANドライバの名前です。システムに構成されているhme、qfe等のLANドライバ名に置き換えます。
for p in tcp ip udp icmp eri do ndd /dev/${p} \? | grep -v "?" | sort > ${p}_tags echo "${p}_parameters\n" > ${p}_params for i in `ndd /dev/${p} \? | grep -v obsoleted | grep -v "?" | sed "s/\(/ /g" | sort | awk '{ print $1 }'` do echo ${i} >> ${p}_params ndd /dev/${p} ${i} >> ${p}_params done done |
図3.2 全ネットワークドライバのパラメタを出力する
図3.3は、特定のパラメタの値を表示する例です。例はTCPドライバの"tcp_time_wait_interval"を表示したものです。値の単位はミリ秒です。秒に直すと240秒で、4分間のタイマです。
# ndd /dev/tcp tcp_time_wait_interval <CR> 240000 # |
図3.3 特定のパラメタ値を表示する
では、どのようにしてパラメタを変更するのでしょうか? 図3.4は前述の"tcp_time_wait_interval"を-setオプションで15秒(15000ミリ秒)に変更する例です。変更後、指定した通りに変わっているかを確かめる習慣をつけておきましょう。
# ndd -set /dev/tcp tcp_time_wait_interval 15000 <CR> # ndd /dev/tcp tcp_time_wait_interval <CR> 15000 # |
図3.4 特定のパラメタ値を変更する
nddコマンドで変更できないパラメタはシステムブート時にセットされます。このため、/etc/systemファイルに設定します。もちろん、図3.4にあるようにnddコマンド-setオプションでセットした一時的変更も、システムを再ブートすると元に戻ってしまいます。恒常的にパラメタをセットする場合は、/etc/systemファイルに設定して下さい。
set tcp:tcp_conn_hash_size=32768 |
図3.5 /etc/systemファイルの設定例
Copyright (C) 2004 by The Art of Computer Technologies, Corp. All rights reserved.