*情報開示機構 #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]]