統計ワンショットSystemTapのエキスパートモードTCP接続の数

約2週間足らず前に、私は半接続TCPの現在の数のカーネルモジュールの統計情報を書いた:
https://blog.csdn.net/dog250/article/details/105013772
この実装はリスナーを使用すると、すべての方法をスキャンし、あるいは、それによってすべての接続がへの道を再濾過スキャン O ( 1 ) O(1) 代替の複雑 O ( n ) O(N) 複雑。

その後、私は現在のハーフオープン接続がリアルタイムで値をカウント表示する方法を変更:
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]#

もちろん、これは管理者が今日の靴を身に着けているためですが、また、白い靴下を産みました。


温州の靴は、雨水が脂肪ではありません、濡れました。

发布了1583 篇原创文章 · 获赞 5118 · 访问量 1114万+

おすすめ

転載: blog.csdn.net/dog250/article/details/105278395