これは非常に主観的であり、多くの変数に依存していることを理解していますが、特定のシステムでパケット損失を診断する必要がある場合、ほとんどの人はどのような手順を踏むのでしょうか。
私はネットワークエンジニアですので、私の観点から説明します。
私にとって、パケット損失の診断は通常、「うまく機能していない」ことから始まります。そこから、私は通常、通信の両端(通常、オフィスのワークステーションとサーバーのどこか)にできるだけ近づいてキットを見つけ、可能な限りもう一方の端(理想的には「リモートエンドポイント」)にpingします。ただし、pingを送信できないファイアウォールが存在する場合があるため、ルーターのLANインターフェイスを解決する必要があり、損失がないかどうかを確認します。
損失が見られる場合は、通常、「帯域幅が不十分」または「問題のあるリンク」がその中間にあるため、ネットワークを介してルートを見つけ、途中から開始します。これにより、通常、どちらか一方の端が表示されます。
損失が見られない場合、次の2つのステップは「pingをさらに送信する」または「pingを大きくする」傾向があります。それがソートされない場合は問題が何であるかを示しているので、エンドポイント間のパス全体を通してQoSポリシーとインターフェース統計を調べ始める時間です。
それでも何も見つからない場合は、あなたの仮定に疑問を投げかける時が来ました。実際にパケット損失に苦しんでいますか?ホストでWireShark(または同等のもの)を使用するか、ネットワークタップを介して(おそらくWireSharkなどを使用して)スニファーマシンを接続することによって、両端で同時にキャプチャを行うことが唯一の確実な方法です。次に、2つのパケットキャプチャを比較する楽しみがあります...
場合によっては、「パケット損失」が原因であると考えられるのは、サーバー側の処理が著しく遅い(たとえば、データベースを「同じLAN上」から「20ミリ秒離れている」に移動し、非常に多くの処理を必要とするクエリを使用するなど)フロントエンドとデータベースの間を往復します)。
Linuxシステムの観点から、最初にethtool -S ethX
を使用してネットワークインターフェイスでのパケット損失を探します。
ほとんどの場合、ethtool -G ethX rx VALUE
を使用してリングバッファーを増やすと、これが解決します。
システムにirqbalanceサービスがないために割り込みがバランスしない場合があるため、chkconfig
(EL)またはupdate-rc
(Debuntu)を調べて、このサービスが実行されているかどうかを確認してください。 /proc/interrupts
はすべてのIRQチャネルにサービスを提供しているコア0のみを表示するため、割り込みがバランスしていないかどうかがわかります。
これに失敗すると、システムが数ギガビット以上のトラフィックを通過している場合はnet.core.netdev_max_backlog
を増やし、場合によってはnet.core.netdev_budget
を増やす必要があります。
それが機能しない場合は、ethtool -C
を使用して、割り込み合体値を微調整できます。
ネットワークインターフェースにパケットドロップがない場合は、netstat -s
を調べ、ソケットバッファーにドロップがないかどうかを確認します。これらは、「pruned from receive queue
」や「dropped from out-of-order queue
」などの統計で報告されます。 」.
適切なプロトコル(例:TCPの場合はnet.ipv4.tcp_rmem
)のデフォルトおよび最大ソケットバッファーを増やしてみてください。
アプリケーションが独自のソケットバッファーサイズを設定する場合、アプリケーションの構成変更が必要になる場合があります。アプリケーションにハードコーディングされたソケットバッファーサイズがある場合は、アプリケーションベンダーに不平を言ってください。
個人的には、NICへのプロトコルオフロード(チェックサム、セグメンテーションオフロード、大規模な受信オフロード)は、必要以上に問題を引き起こすように思われるため、嫌いです。 ethtool -K
を使用してこれらの設定をいじるのは一見の価値があります。
いくつかの機能を変更する必要があるかもしれないので、NIC(modinfo <drivername>
)のモジュールオプションを見てください。私が遭遇した1つの例を挙げると、インテルのFlow Directorを1つの大きなTCPストリームはおそらくそのストリームの効率を損なうため、FDirをオフにします。
さらに、この特定のシステムを特定のワークロードに合わせて手動で調整することになりますが、これは質問の範囲を超えていると思います。
まず、wireshark(Windows)やtcpdump(Linux端末)などのパケットキャプチャツールを使用します。
ファイアウォールの構成(ホストファイアウォールとネットワークファイアウォール)も確認します。
分離してから排除する。
問題のあるパスの最小サブセットを見つけます。これを行うには、さまざまな組み合わせをテストしたり、ユーザーレポートを抽出したりします。方程式の時間を考慮することを忘れないでください。たぶん、特定のネットワークへのすべてのトラフィックのパケットロスだけかもしれませんし、無線クライアントだけが影響を受けているかもしれません。さまざまなトラフィックタイプを考慮してください(pingのレート制限)。それをテストするための最も信頼性が高く、簡単に繰り返し可能な方法を見つけます。
次に、潜在的な原因を取り除きます。リンクのトラフィックを(一時的に)減らし、干渉源をスペクトルから削除し、特定のクライアントを切断します。最終的には、問題の原因を見つけることができます。
場合によっては、パケットダンプを見たり、推測したりして、ショートカットを作成することができます(常にビットトレントです)。また、教授のserverfaultがすばらしいことを伝えてください。
大きなpingを送信しない限り、pingでパケット損失が表示されない場合があります。ネットワークでパケットの損失がありましたが、pingパケットサイズを大きくするまで見えませんでした。
Windowsの場合:
ping -n 30 -l <largevalue> <target>
largevalue
には40960(40kパケット)を使用しました
target
の場合、tracert google.com
の最初のいくつかのIPアドレスを使用しました
(これは私のルーターとケーブルモデムでした)。チェーンのさらに下にあるデバイスの1つで、大きなパケットの場合はひどいパケット損失(> 60%)がありましたが、小さなパケットの場合は0%でした。再起動して修正しましたが、ケーブルまたは内部の交換が必要な場合もあります。