情報開示機構

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毎更新 */

の二つが送信キューの溜り具合(つまりネットワークの混雑度) を示します。

Lab/SSS-PC


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS