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毎更新 */
の二つが送信キューの溜り具合(つまりネットワークの混雑度) を示します。