約2週間足らず前に、私は半接続TCPの現在の数のカーネルモジュールの統計情報を書いた:
https://blog.csdn.net/dog250/article/details/105013772
この実装はリスナーを使用すると、すべての方法をスキャンし、あるいは、それによってすべての接続がへの道を再濾過スキャン
代替の複雑
複雑。
その後、私は現在のハーフオープン接続がリアルタイムで値をカウント表示する方法を変更:
https://blog.csdn.net/dog250/article/details/105022347
この後、制御不能に、彼はバイナリフッククラフトツアーを開始しました。
戻る各スキャンリスナメソッドの先頭に、OKものの、しかし、半接続をサポートするために、読み取りデータ、統計的な機能を提供するためのprocfsファイルを維持する必要性、カーネルモジュールがロードされなければならない状態でした。
ワンショットモードでは、それを変更することはできませんか?すなわち、出力値の後に、即ち、モジュールアンロード。
それは、直接init関数モジュールの計算、および、出力値である後に、init関数は戻り-1。しかし、これはマネージャーの逆です...これはエレガントではありません。
ここでSTAPを使用して達人のエキスパートモードでは、コンソールへのワンショット出力値後に、終了します。コードは以下の通りであります:
// dump_halfconn_num.stp
%{
#include <linux/module.h>
#include <net/tcp.h>
%}
function dump_halfconn_num:long()
%{
unsigned int num = 0;
int i;
struct inet_hashinfo *hashinfo = &tcp_hashinfo;
for (i = 0; i < INET_LHTABLE_SIZE; i++) {
struct sock *sk;
struct hlist_nulls_node *node;
struct inet_listen_hashbucket *ilb;
ilb = &hashinfo->listening_hash[i];
spin_lock_bh(&ilb->lock);
sk_nulls_for_each(sk, node, &ilb->head) {
struct inet_connection_sock *icsk = inet_csk(sk);
struct listen_sock *lopt;
read_lock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
lopt = icsk->icsk_accept_queue.listen_opt;
if (lopt && lopt->qlen)
num += lopt->qlen;
read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
}
spin_unlock_bh(&ilb->lock);
}
STAP_PRINTF("系统中当前的半连接数量为:%d\n", num);
STAP_RETVALUE = 0;
%}
probe begin
{
dump_halfconn_num();
exit(); // oneshot模式,dump完直接退出!
}
使用するのは非常にシンプル:
[root@localhost test]# stap -g ./dump_halfconn_num.stp
302
[root@localhost test]#
もちろん、これは管理者が今日の靴を身に着けているためですが、また、白い靴下を産みました。
温州の靴は、雨水が脂肪ではありません、濡れました。