*情報開示機構

#contents

**本文

infomem.cは情報開示機構の中身をダンプするユーティリティです。

    volatile L_TASKINFO	*tinfop;
    volatile NODEINFO	*nodep;
    volatile NODELIST   *nl;
    int i;
 
    tinfop = get_taskinfo_address();
 /* tinfop->nodeinfopがノード単位の情報開示機構のベースになります。*/
 
    nodep = (tinfop->nodeinfop+tinfop->task[-1].node);
 /* tinfop->task[-1].nodeは自分のノード番号を示すので、このnodepは
   自分のノードの情報開示機構を指します。 */
 
 /* 現在、アクティブなノードについての情報は情報開示機構の最後にあって */
 
    nl = (NODELIST*)(tinfop->nodeinfop+N_OF_NODE);
 /* で獲得することができます。 */
 /* ただし、64ノード以下のSSS-PCではN_OF_NODE=64固定 */

NODEINFOやNODELISTの内容はsssinfo.hとcluster.hにあります。

NODELISTは以下の構造体で

 struct node_list {
    unsigned char bitmap[(N_OF_NODE+7)/8];
    int  max_id; /* max_node_id + 1 */
    int  n_of_node;
 };
 #define NODELIST struct node_list

n_of_nodeが生きているノードの数、
max_idが生きているノードのmax_ID + 1、
bitmapにはbit列でノード0(普通は使われない)から
1bitずつノードが生きているかどうかが示されます。
よって、infomem.cの
    for (i = 0; i < nl->max_id; i++) {
        if (i == tinfop->task[-1].node) continue;
	if ((nl->bitmap[i/8] & (1 << (i % 8))) != 0) {
	    nodep = (tinfop->nodeinfop+i);
	    nodep->......
	}
    }
で生きているノードだけを選んで情報開示機構を操作できます。

NODEINFOの内容ですが、
 struct Nodeinfo{
    unsigned int	arc_type; 	/* 0:Sun4M(SuperSPARC), 1:Sun4U(UltraSPARC),
					   2: PC-AT(IA32) */
    unsigned int	arc_subtype; 	/* IA32: CPUID */
    unsigned int	os_version; 	/* SSS-PC/SSS-CORE version */
    unsigned int	n_of_cpu;	/* SSS-COREが使用するノード内実プロセッサ数 */
    unsigned int	cpu_clock;	/* CPUのクロック周波数(MHz)単位 */
    unsigned int	page_size;	/* システムの最小ページサイズ(byte単位) */
    unsigned int	tick_unit; 	/* msec単位のtick時間 SSSMC_TIMER_UNIT */
    unsigned int	systime; 	/* tick単位のシステム時間 */
    unsigned int	ready_task;	/* ready状態のタスク数 */
    unsigned int	short_cpu_usage; /* 100tick平均 10tick毎更新 */
    unsigned int	middle_cpu_usage; /* 1000tick平均 100tick毎更新 */
    unsigned int	long_cpu_usage; /* 10000tick平均 1000tick毎更新 */
    unsigned int	sleep_task;	/* sleep状態のタスク数 */
    unsigned int	wait_task;	/* wait状態のタスク数 */
    unsigned int	phy_mem; /* all available phy_memory, 最小page 単位 */
    unsigned int	copy_mem; /* used copy_memory, 最小page 単位 */
    unsigned int	free_mem; /* 最小page 単位 */
    NETINFO		net[N_OF_ETHER_CONNECT];
    int			modify_ltime;	/* 構造体を更新した時間 */
    int			multicast_ltime;  /* 構造体を放送した時間 */
    int			r_timestamp;	/* 受け取った自ノード時間 */
 };
 #define	NODEINFO	struct Nodeinfo
となっています。

CPU負荷は
    unsigned int	short_cpu_usage; /* 100tick平均 10tick毎更新 */
    unsigned int	middle_cpu_usage; /* 1000tick平均 100tick毎更新 */
    unsigned int	long_cpu_usage; /* 10000tick平均 1000tick毎更新 */
でわかります。
# 平均とありますが、どんどん積算されます。
# 1tickに対して何taskのready taskがあるか知りたい場合は、
# それぞれ100,1000,10000で値を割ってください。

メモリ使用量は
    unsigned int	phy_mem; /* all available phy_memory, 最小page 単位 */
    unsigned int	free_mem; /* 最小page 単位 */
から、phy_mem - free_memでわかります。

ネットワークはdeviceが1個の環境でしたら、
 nodep->net[0]/* NETINFO */
でわかります。
NETINFOの内容は
 struct Netinfo{
    /* void*		plink;	       */ /* Lance*、ユーザは参照不能 */
    unsigned int	vip[2];
    unsigned int	vflags;
    unsigned char	connect_f;   /* MBCF使用中には1 */
    unsigned char	gnsb_latch; /* gnsb_statusのlatch用 */
    unsigned char	sque_usage; /* 未送信のパケットの数 
				       + (gnsb_status << 3) */ 
    unsigned char	gnsb_status; /* nsb_status異常の検出 
				      nsb_status |= 1 -> gnsb_status |= 1;
				      nsb_status |= 2 -> gnsb_status |= 4;
				      full_f |= 1 -> gnsb_status |= 2;
				      Send_ACK_REQ -> gnsb_status |= 8;
				      reset RETRY_MODE -> gnsb_status |= 0x10;
				      full_f |= 0x40 (send_full) -> gnsb_status |= 0x20;
				      */
    unsigned int	short_sque_usage; /* 10tick平均 1tick毎更新 */
    unsigned int	long_sque_usage; /* 100tick平均 10tick毎更新 */
 };
 #define	NETINFO		struct Netinfo
です。

    unsigned int	short_sque_usage; /* 10tick平均 1tick毎更新 */
    unsigned int	long_sque_usage; /* 100tick平均 10tick毎更新 */
の二つが送信キューの溜り具合(つまりネットワークの混雑度)
を示します。

**参考情報

元となるメール

> Subject: Re: ちょっと質問です
>    Date: Sat, 17 Sep 2005 07:09:25 +0900 (JST)

[[Lab/SSS-PC]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS