lst.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 2,162 行 · 第 1/5 页

C
2,162
字号
                        break;                default:                        lst_print_usage(argv[0]);                        return -1;                }        }        if (optind == argc) {                /* no group is specified, list name of all groups */                rc = lst_list_group_all();                return rc;        }        if (!verbose)                fprintf(stdout, LST_NODES_TITLE);        /* list nodes in specified groups */        for (i = optind; i < argc; i++) {                rc = lst_info_group_ioctl(argv[i], &gent, NULL, NULL, NULL);                if (rc != 0) {                        if (errno == ENOENT) {                                rc = 0;                                break;                        }                        lst_print_error("group", "Failed to list group\n",                                        strerror(errno));                        break;                }                if (!verbose) {                        fprintf(stdout, "\t%d\t%d\t%d\t%d\t%d\t%s\n",                                gent.nle_nactive, gent.nle_nbusy,                                gent.nle_ndown, gent.nle_nunknown,                                gent.nle_nnode, argv[i]);                        continue;                }                fprintf(stdout, "Group [ %s ]\n", argv[i]);                if (gent.nle_nnode == 0) {                        fprintf(stdout, "No nodes found [ %s ]\n", argv[i]);                        continue;                }                count = gent.nle_nnode;                dents = malloc(count * sizeof(lstcon_node_ent_t));                if (dents == NULL) {                        fprintf(stderr, "Failed to malloc: %s\n",                                strerror(errno));                        return -1;                }                index = 0;                rc = lst_info_group_ioctl(argv[i], &gent, &index, &count, dents);                if (rc != 0) {                        lst_print_error("group", "Failed to list group: %s\n",                                        strerror(errno));                        free(dents);                        return -1;                }                for (j = 0, c = 0; j < count; j++) {                        if (all ||                            ((active  &&  dents[j].nde_state == LST_NODE_ACTIVE) ||                             (busy    &&  dents[j].nde_state == LST_NODE_BUSY)   ||                             (down    &&  dents[j].nde_state == LST_NODE_DOWN)   ||                             (unknown &&  dents[j].nde_state == LST_NODE_UNKNOWN))) {                                fprintf(stdout, "\t%s: %s\n",                                        libcfs_id2str(dents[j].nde_id),                                        lst_node_state2str(dents[j].nde_state));                                c++;                        }                }                fprintf(stdout, "Total %d nodes [ %s ]\n", c, argv[i]);                free(dents);        }        return rc;}intlst_stat_ioctl (char *name, int count, lnet_process_id_t *idsp,                int timeout, struct list_head *resultp){        lstio_stat_args_t  args = {                .lstio_sta_key           = session_key,                .lstio_sta_timeout       = timeout,                .lstio_sta_nmlen         = strlen(name),                .lstio_sta_namep         = name,                .lstio_sta_count         = count,                .lstio_sta_idsp          = idsp,                .lstio_sta_resultp       = resultp,        };        return lst_ioctl (LSTIO_STAT_QUERY, &args, sizeof(args));}typedef struct {        struct list_head        srp_link;        int                     srp_count;        char                   *srp_name;        lnet_process_id_t      *srp_ids;        struct list_head        srp_result[2];} lst_stat_req_param_t;static voidlst_stat_req_param_free(lst_stat_req_param_t *srp){        int     i;        for (i = 0; i < 2; i++)                 lst_free_rpcent(&srp->srp_result[i]);        if (srp->srp_ids != NULL)                free(srp->srp_ids);        free(srp);}static intlst_stat_req_param_alloc(char *name, lst_stat_req_param_t **srpp, int save_old){        lst_stat_req_param_t *srp = NULL;        int                   count = save_old ? 2 : 1;        int                   rc;        int                   i;        srp = malloc(sizeof(*srp));        if (srp == NULL)                return -ENOMEM;        memset(srp, 0, sizeof(*srp));        CFS_INIT_LIST_HEAD(&srp->srp_result[0]);        CFS_INIT_LIST_HEAD(&srp->srp_result[1]);        rc = lst_get_node_count(LST_OPC_GROUP, name,                                &srp->srp_count, NULL);        if (rc != 0 && errno == ENOENT) {                rc = lst_get_node_count(LST_OPC_NODES, name,                                        &srp->srp_count, &srp->srp_ids);        }        if (rc != 0) {                fprintf(stderr,                        "Failed to get count of nodes from %s: %s\n",                        name, strerror(errno));                lst_stat_req_param_free(srp);                return rc;        }        srp->srp_name = name;        for (i = 0; i < count; i++) {                rc = lst_alloc_rpcent(&srp->srp_result[i], srp->srp_count,                                      sizeof(sfw_counters_t)  +                                      sizeof(srpc_counters_t) +                                      sizeof(lnet_counters_t));                if (rc != 0) {                        fprintf(stderr, "Out of memory\n");                        break;                }        }        if (rc == 0) {                *srpp = srp;                return 0;        }        lst_stat_req_param_free(srp);        return rc;}typedef struct {        /* TODO */} lst_srpc_stat_result;#define LST_LNET_AVG    0#define LST_LNET_MIN    1#define LST_LNET_MAX    2typedef struct {        float           lnet_avg_sndrate;        float           lnet_min_sndrate;        float           lnet_max_sndrate;        float           lnet_total_sndrate;        float           lnet_avg_rcvrate;        float           lnet_min_rcvrate;        float           lnet_max_rcvrate;        float           lnet_total_rcvrate;        float           lnet_avg_sndperf;        float           lnet_min_sndperf;        float           lnet_max_sndperf;        float           lnet_total_sndperf;        float           lnet_avg_rcvperf;        float           lnet_min_rcvperf;        float           lnet_max_rcvperf;        float           lnet_total_rcvperf;        int             lnet_stat_count;} lst_lnet_stat_result_t;lst_lnet_stat_result_t lnet_stat_result;static floatlst_lnet_stat_value(int bw, int send, int off){        float  *p;        p = bw ? &lnet_stat_result.lnet_avg_sndperf :                 &lnet_stat_result.lnet_avg_sndrate;        if (!send)                p += 4;         p += off;        return *p;}static voidlst_timeval_diff(struct timeval *tv1,                 struct timeval *tv2, struct timeval *df){        if (tv1->tv_usec >= tv2->tv_usec) {                df->tv_sec  = tv1->tv_sec - tv2->tv_sec;                df->tv_usec = tv1->tv_usec - tv2->tv_usec;                return;        }        df->tv_sec  = tv1->tv_sec - 1 - tv2->tv_sec;        df->tv_usec = tv1->tv_sec + 1000000 - tv2->tv_usec;        return;}voidlst_cal_lnet_stat(float delta, lnet_counters_t *lnet_new,                  lnet_counters_t *lnet_old){        float perf;        float rate;        perf = (float)(lnet_new->send_length -                       lnet_old->send_length) / (1024 * 1024) / delta;        lnet_stat_result.lnet_total_sndperf += perf;        if (lnet_stat_result.lnet_min_sndperf > perf ||            lnet_stat_result.lnet_min_sndperf == 0)                lnet_stat_result.lnet_min_sndperf = perf;        if (lnet_stat_result.lnet_max_sndperf < perf)                lnet_stat_result.lnet_max_sndperf = perf;        perf = (float)(lnet_new->recv_length -                       lnet_old->recv_length) / (1024 * 1024) / delta;        lnet_stat_result.lnet_total_rcvperf += perf;        if (lnet_stat_result.lnet_min_rcvperf > perf ||            lnet_stat_result.lnet_min_rcvperf == 0)                lnet_stat_result.lnet_min_rcvperf = perf;        if (lnet_stat_result.lnet_max_rcvperf < perf)                lnet_stat_result.lnet_max_rcvperf = perf;        rate = (lnet_new->send_count - lnet_old->send_count) / delta;        lnet_stat_result.lnet_total_sndrate += rate;        if (lnet_stat_result.lnet_min_sndrate > rate ||            lnet_stat_result.lnet_min_sndrate == 0)                lnet_stat_result.lnet_min_sndrate = rate;        if (lnet_stat_result.lnet_max_sndrate < rate)                lnet_stat_result.lnet_max_sndrate = rate;        rate = (lnet_new->recv_count - lnet_old->recv_count) / delta;        lnet_stat_result.lnet_total_rcvrate += rate;        if (lnet_stat_result.lnet_min_rcvrate > rate ||            lnet_stat_result.lnet_min_rcvrate == 0)                lnet_stat_result.lnet_min_rcvrate = rate;        if (lnet_stat_result.lnet_max_rcvrate < rate)                lnet_stat_result.lnet_max_rcvrate = rate;        lnet_stat_result.lnet_stat_count ++;        lnet_stat_result.lnet_avg_sndrate = lnet_stat_result.lnet_total_sndrate /                                            lnet_stat_result.lnet_stat_count;        lnet_stat_result.lnet_avg_rcvrate = lnet_stat_result.lnet_total_rcvrate /                                            lnet_stat_result.lnet_stat_count;        lnet_stat_result.lnet_avg_sndperf = lnet_stat_result.lnet_total_sndperf /                                            lnet_stat_result.lnet_stat_count;        lnet_stat_result.lnet_avg_rcvperf = lnet_stat_result.lnet_total_rcvperf /                                            lnet_stat_result.lnet_stat_count;}voidlst_print_lnet_stat(char *name, int bwrt, int rdwr, int type){        int     start1 = 0;        int     end1   = 1;        int     start2 = 0;        int     end2   = 1;        int     i;        int     j;        if (lnet_stat_result.lnet_stat_count == 0)                return;        if (bwrt == 1) /* bw only */                start1 = 1;        if (bwrt == 2) /* rates only */                end1 = 0;        if (rdwr == 1) /* recv only */                start2 = 1;        if (rdwr == 2) /* send only */                end2 = 0;        for (i = start1; i <= end1; i++) {                fprintf(stdout, "[LNet %s of %s]\n",                        i == 0 ? "Rates" : "Bandwidth", name);                for (j = start2; j <= end2; j++) {                        fprintf(stdout, "[%c] ", j == 0 ? 'R' : 'W');                        if ((type & 1) != 0) {                                fprintf(stdout, i == 0 ? "Avg: %-8.0f RPC/s " :                                                         "Avg: %-8.2f MB/s  ",                                        lst_lnet_stat_value(i, j, 0));                        }                        if ((type & 2) != 0) {                                fprintf(stdout, i == 0 ? "Min: %-8.0f RPC/s " :                                                         "Min: %-8.2f MB/s  ",                                        lst_lnet_stat_value(i, j, 1));                        }                        if ((type & 4) != 0) {                                fprintf(stdout, i == 0 ? "Max: %-8.0f RPC/s" :                                                         "Max: %-8.2f MB/s",                                        lst_lnet_stat_value(i, j, 2));                        }                        fprintf(stdout, "\n");                }        }}voidlst_print_stat(char *name, struct list_head *resultp,               int idx, int lnet, int bwrt, int rdwr, int type){        struct list_head  tmp[2];        lstcon_rpc_ent_t *new;        lstcon_rpc_ent_t *old;        sfw_counters_t   *sfwk_new;        sfw_counters_t   *sfwk_old;        srpc_counters_t  *srpc_new;        srpc_counters_t  *srpc_old;        lnet_counters_t  *lnet_new;        lnet_counters_t  *lnet_old;        struct timeval    tv;        float             delta;        int               errcount = 0;        CFS_INIT_LIST_HEAD(&tmp[0]);        CFS_INIT_LIST_HEAD(&tmp[1]);        memset(&lnet_stat_result, 0, sizeof(lnet_stat_result));        while (!list_empty(&resultp[idx])) {                if (list_empty(&resultp[1 - idx])) {                        fprintf(stderr, "Group is changed, re-run stat\n");                        break;                }                new = list_entry(resultp[idx].next, lstcon_rpc_ent_t, rpe_link);                old = list_entry(resultp[1 - idx].next, lstcon_rpc_ent_t, rpe_link);                /* first time get stats result, can't calculate diff */                if (new->rpe_peer.nid == LNET_NID_ANY)                        break;                if (new->rpe_peer.nid != old->rpe_peer.nid ||                    new->rpe_peer.pid != old->rpe_peer.pid) {                        /* Something wrong. i.e, somebody change the group */                        break;                }                list_del(&new->rpe_link);                list_add_tail(&new->rpe_link, &tmp[idx]);                list_del(&old->rpe_link);                list_add_tail(&old->rpe_link, &tmp[1 - idx]);                if (new->rpe_rpc_errno != 0 || new->rpe_fwk_errno != 0 ||                    old->rpe_rpc_errno != 0 || old->rpe_fwk_errno != 0) {                        errcount ++;                        continue;                }                sfwk_new = (sfw_counters_t *)&new->rpe_payload[0];                sfwk_old = (sfw_counters_t *)&old->rpe_payload[0];                srpc_new = (srpc_counters_t *)((char *)sfwk_new + sizeof(*sfwk_new));                srpc_old = (srpc_counters_t *)((char *)sfwk_old + sizeof(*sfwk_old));                lnet_new = (lnet_counters_t *)((char *)srpc_new + sizeof(*srpc_new));                lnet_old = (lnet_counters_t *)((char *)srpc_old + sizeof(*srpc_old));                lst_timeval_diff(&new->rpe_stamp, &old->rpe_stamp, &tv);                delta = tv.tv_sec + (float)tv.tv_usec/1000000;                if (!lnet) /* TODO */                        continue;                

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?