Unixドメインソケットのソケットバッファがいっぱいになったときにメッセージが失われるのを見ると、プロセス/ソケットごとに失われたパケットをどのように確認できますか? netstat および ss ツールは、接続タイプに基づいてすべての統計情報を提供します。しかし、バッファがいっぱいになったときにプロセス/ソケットごとに破棄されたパケットを確認する方法はありますか?
ベストアンサー1
Unixドメインソケットは本質的に「信頼でき、」データを「失うべきではない」からです。 「unix」タイプのローカルソケットは「メモリ内データ構造」であり、ネットワークソケット(TCP / UDPなど)とは若干異なる動作をします。最大の混乱は、ソケット抽象化がデータがプロセス(メモリ、ファイル、ディスク、ネットワーク)の内外に移動できるさまざまな方法に対処しようとしていることです。
この場合、データはパケットネットワーク(インターネット)ではなくコンピュータのメモリバスを介して転送されるため、パケット消去の概念は意味がありません。
しかし、ネットワーク転送は別の話です。リモートネットワークの送信者はいつ停止するかを知ることができず、データはどこにも行くことができません。ネットワークカードバッファがいっぱいになったか、データがネットワークのどこかに削除された可能性があります。
Unixソケットは「安定」ですが、この抽象化は多くの基本的な転送とバッファリングの種類をカバーしています。 (パケットネットワーク(ip/x25/etc.)、プロトコル(udp/tcp/etc.)、またはメモリ転送を介して直接(同じ物理コンピュータ上)。
これらの条件の追跡は実際にはアプリケーションによって異なります。特に、「unix」タイプのUnixドメインソケットを使用する場合はさらにそうです。リンクされたアプリケーションは、これらのイベントを記録したり統計を表示したりできます。
ss -a --unix -p
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_dgr UNCONN 0 0 /run/systemd/cgroups-agent 9338 * 0
u_str LISTEN 0 128 /run/systemd/private 9339 * 0
u_str ESTAB 300 768 /var/run/dbus/system_bus_socket 13910 * 13895
ご覧のとおり、「unix」タイプのドメインソケットの送受信キュー内のデータ量を確認できます。
netstat -x
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ N ] DGRAM 9481 /run/systemd/cgroups-agent
unix 2 [ W ] DGRAM 38742 /run/user/0/systemd/notify
フラグ:通常SO_ACCEPTONを表すACCに設定され、ソケットが接続要求を待っていることを示します。 Wとして表示されるSO_WAITDATAは、読み取り待機中のデータがあることを示します。 SO_NOSPACEはNです。これは、ソケットにデータを書き込むスペースがないことを意味します(つまり、転送バッファがいっぱいです)。