TCPソケットの送信/受信バッファサイズを検索する方法はありますか?
私はnetstatとssの両方、および生の/ proc/net/tcpを試しました。飛行中のバイト数、タイマー、プロセス名など、たくさんの便利な機能があります。
しかし、いくつかのプロセスがSO_ {SND、RCV} BUFを設定しているかどうか、さらに興味深いことに、カーネルが各SKBに実際に使用している値を診断できるようにしたいと思います。
lsof FAQ (「なぜlsofがソケットオプションをレポートしないのか」を検索)から、Linuxはあなたが入手した情報を入手できないと思います。 (少なくとも/ proc経由ではない)
その場合、lsof -i <pid> -a -i tcp -T f
を使用できますが、-Tは "qs"のみを取り、Linuxではfを取りません。 netstat(netstat --tcp -p -o -e -e -v | grep <pid>
)から、送信キューと受信キューおよびいくつかのタイマー情報を含むその他の情報を取得できます。
あなたができることはstraceを使うことです。 strace(strace -ff -e network,ioctl PROGRAM
)またはTCPソケット(strace -fff -e network,ioctl -p PID
)を設定する前に、プログラムを実行する必要があります。ioctl
はこれらのオプションがどのように設定されるか、およびnetwork
はそれらがどの接続であるかを通知するのに十分にキャッチする必要があります(ただし、ioctlを使用し、lsofを使用して、接続先が機能する場所も特定します)。
実際にはhttps://github.com/veithen/knetstat
。
例えば。ために nc -I 8192 -O 8192 www.google.com 80
これは与えるでしょう(SO_RCVBUF
およびSO_SNDBUF
3行目):
$ cat /proc/net/tcpstat
Recv-Q Send-Q Local Address Foreign Address Stat Diag Options
0 0 0.0.0.0:22 0.0.0.0:* LSTN SO_REUSEADDR=1,SO_REUSEPORT=0,SO_KEEPALIVE=0,TCP_NODELAY=0
0 0 10.132.0.4:22 74.125.73.164:38922 ESTB SO_REUSEADDR=1,SO_REUSEPORT=0,SO_KEEPALIVE=1,TCP_NODELAY=1
0 0 10.132.0.4:44058 74.125.206.103:80 ESTB SO_REUSEADDR=0,SO_REUSEPORT=0,SO_KEEPALIVE=0,SO_RCVBUF=8192,SO_SNDBUF=8192,TCP_NODELAY=0
0 0 10.132.0.4:44054 74.125.206.103:80 TIMW
0 0 10.132.0.4:22 74.125.73.96:45722 ESTB SO_REUSEADDR=1,SO_REUSEPORT=0,SO_KEEPALIVE=1,TCP_NODELAY=1
次のように、受信バッファと送信バッファのサイズを変更できます(送信バッファを示しています)。
int buffersize = 64*1024; // 64k
setsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char *) &buffersize, sizeof(buffersize));
現在のサイズを取得するには、次を使用します:
socklen_t buffersize_len = sizeof(buffersize); // in/out parameter
getsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char *) &buffersize, &buffersize_len);
Linuxには、現在のバッファサイズを設定値の1/2として報告する既知のバグがあります。内部値が要求されたものの1/2であるのか、またはレポートが実際のものの1/2であるのかを思い出せません。