8

Linux の TCP ソケットで accept() を待っている現在の接続試行回数を調べる方法はありますか?

各イベント ループで EWOULDBLOCK をヒットする前に成功した accept() の数を数えることができると思いますが、これらの詳細を隠す高レベル ライブラリ (Python/Twisted) を使用しています。また、昔ながらの select()/poll() ループではなく、epoll() を使用しています。

高性能のノンブロッキング ネットワーク サーバーの負荷の一般的な感覚をつかもうとしていますが、この数値は適切な特性評価になると思います。並列ワーカー プロセスで多くのディスク I/O を実行しているため、負荷平均/CPU 統計はあまり役に立ちません。Linux に関するこれらの統計のほとんどは、負荷の一部としてディスク I/O の待機に費やされた時間をカウントします (私の特定のサーバー アーキテクチャではそうではありません)。accept() と応答の間のレイテンシーも適切な尺度ではありません。サーバーが処理を開始すると、各要求は通常、非常に迅速に処理されるためです。サーバーがリクエストを受信するよりも速くディスパッチできないという限界点にどれだけ近づいているかを調べようとしています.

4

3 に答える 3

2

私が今まで見たBSDSocketsAPIには、このための関数はありません。それが本当に有用な負荷の尺度であるかどうか疑問に思います。たとえば、クライアントによる接続プールがないと想定しています。また、遅延が完全に保留中の接続として明示されていると想定しています。しかし、とにかく番号を取得できないので、要点は議論の余地があります。

于 2012-06-20T19:52:41.977 に答える
2

SYN Cookie が有効になっていない (またはボリュームのためにトリガーされていない) と仮定すると、netstat の出力を調べて、SYN_RECV 状態にあるポートをターゲットとする接続の数を確認するだけで、おおよその数値を取得できるはずです。 .

これは、特定のリッスン ポートの数値を取得するためのちょっとした Python ハックです。

!/usr/bin/python

import sys

STATE_SYN_RECV = '03'

def count_state(find_port, find_state):
    count = 0
    with open('/proc/net/tcp', 'r') as f:
        first = True
        for line in f:
            if first:
                first = False
                continue
            entries = line.split()
            local_addr, local_port = entries[1].split(':')
            local_port = int(local_port, 16)
            if local_port != find_port:
                continue
            state = entries[3]
            if state == find_state:
                count += 1
    return count


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "Usage: count_syn_recv.py <port>"
        sys.exit(1)

    port = int(sys.argv[1])

    count = count_state(port, STATE_SYN_RECV)
    print "syn_recv_count=%d" % count
于 2012-11-14T01:54:01.477 に答える