loadgen.c

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

C
1,038
字号
        pthread_mutex_lock(&m_config);        args[0] = cmdname;        /* OSC */        /* attach "osc" oscname oscuuid */        args[1] = "osc";        args[2] = args[3] = oname;        rc = jt_lcfg_attach(4, args);        if (rc) {                fprintf(stderr, "%s: can't attach osc '%s' (%d)\n",                        cmdname, oname, rc);                /* Assume we want e.g. an old one cleaned anyhow. */                goto clean;        }        /* setup ostname "OSS_UUID" */        args[1] = target;        args[2] = "OSS_UUID";        rc = jt_lcfg_setup(3, args);        if (rc) {                fprintf(stderr, "%s: can't setup osc '%s' (%d)\n",                        cmdname, oname, rc);                goto clean;        }        /* Large grants cause ENOSPC to be reported, even though           there's space left.  We can reduce the grant size by           minimizing these */        sprintf(proc_path, "/proc/fs/lustre/osc/%s/max_dirty_mb", oname);        rc = write_proc(proc_path, "1");        sprintf(proc_path, "/proc/fs/lustre/osc/%s/max_rpcs_in_flight", oname);        rc = write_proc(proc_path, "1");        /* ECHO CLI */        /* attach "echo_client" echoname echouuid */        args[1] = "echo_client";        args[2] = args[3] = ename;        rc = jt_lcfg_attach(4, args);        if (rc) {                fprintf(stderr, "%s: can't attach '%s' (%d)\n",                        cmdname, ename, rc);                if (rc == ENODEV)                        fprintf(stderr, "%s: is the obdecho module loaded?\n",                                cmdname);                goto clean;        }        /* setup oscname */        args[1] = oname;        rc = jt_lcfg_setup(2, args);        if (rc) {                fprintf(stderr, "%s: can't setup '%s' (%d)\n",                        cmdname, ename, rc);                goto clean;        }        args[1] = ename;        rc = jt_obd_device(2, args);        if (rc) {                fprintf(stderr, "%s: can't set device '%s' (%d)\n",                        cmdname, ename, rc);                goto clean;        }        if (!rc)                *dev = jt_obd_get_device();        pthread_mutex_unlock(&m_config);        return rc;clean:        pthread_mutex_unlock(&m_config);        cleanup(ename, 1);        cleanup(oname, 1);        return rc;}/* We can't use the libptlctl library fns because they are not shared-memory   safe with respect to the ioctl device (cur_dev) */static int obj_ioctl(int cmd, struct obd_ioctl_data *data, int unpack){        char *buf = NULL;        int rc;        //IOC_PACK(cmdname, data);        if (obd_ioctl_pack(data, &buf, sizeof(*data))) {                fprintf(stderr, "dev %d invalid ioctl\n", data->ioc_dev);                rc = EINVAL;                goto out;        }        rc = l_ioctl(OBD_DEV_ID, cmd, buf);        if (unpack) {                //IOC_UNPACK(argv[0], data);                if (obd_ioctl_unpack(data, buf, sizeof(*data))) {                        fprintf(stderr, "dev %d invalid reply\n", data->ioc_dev);                        rc = EINVAL;                        goto out;                }        }out:        if (buf)                free(buf);        return rc;}/* See jt_obd_create */static int obj_create(struct kid_t *kid){        struct obd_ioctl_data data;        int rc;        memset(&data, 0, sizeof(data));        data.ioc_dev = kid->k_dev;        data.ioc_obdo1.o_mode = 0100644;        data.ioc_obdo1.o_id = 0;        data.ioc_obdo1.o_uid = 0;        data.ioc_obdo1.o_gid = 0;        data.ioc_obdo1.o_valid = OBD_MD_FLTYPE | OBD_MD_FLMODE |                OBD_MD_FLID | OBD_MD_FLUID | OBD_MD_FLGID;        rc = obj_ioctl(OBD_IOC_CREATE, &data, 1);        if (rc) {                fprintf(stderr, "%d: create (%d) %s\n",                        kid->k_id, rc, strerror(errno));                return rc;        }        if (!(data.ioc_obdo1.o_valid & OBD_MD_FLID)) {                fprintf(stderr, "%d: create oid not valid "LPX64"\n",                        kid->k_id, data.ioc_obdo1.o_valid);                return rc;        }        kid->k_objid = data.ioc_obdo1.o_id;        if (o_verbose > 4)                printf("%d: cr "LPX64"\n", kid->k_id, kid->k_objid);        return rc;}/* See jt_obd_destroy */static int obj_delete(struct kid_t *kid){        struct obd_ioctl_data data;        int rc;        if (o_verbose > 4)                printf("%d: del "LPX64"\n", kid->k_id, kid->k_objid);        memset(&data, 0, sizeof(data));        data.ioc_dev = kid->k_dev;        data.ioc_obdo1.o_id = kid->k_objid;        data.ioc_obdo1.o_mode = S_IFREG | 0644;        data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLMODE;        rc = obj_ioctl(OBD_IOC_DESTROY, &data, 1);        if (rc)                fprintf(stderr, "%s-%d: can't destroy obj "LPX64" (%d)\n",                        cmdname, kid->k_id, kid->k_objid, rc);        kid->k_objid = 0;        return rc;}#define difftime(a, b)                                  \        ((a)->tv_sec - (b)->tv_sec +                    \         ((a)->tv_usec - (b)->tv_usec) / 1000000.0)/* See jt_obd_test_brw */static int obj_write(struct kid_t *kid){        struct obd_ioctl_data data;        struct timeval start;        __u64 count, len;        int rc = 0, i, pages = 0;        if (o_verbose > 4)                printf("%d: wr "LPX64"\n", kid->k_id, kid->k_objid);        count = 10;        pages = 32;        len = pages * getpagesize();        memset(&data, 0, sizeof(data));        data.ioc_dev = kid->k_dev;        /* communicate the 'type' of brw test and batching to echo_client.         * don't start.  we'd love to refactor this lctl->echo_client         * interface */        data.ioc_pbuf1 = (void *)1;        data.ioc_plen1 = 1;        data.ioc_obdo1.o_id = kid->k_objid;        data.ioc_obdo1.o_mode = S_IFREG;        data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE |                OBD_MD_FLFLAGS;        data.ioc_obdo1.o_flags = OBD_FL_DEBUG_CHECK;        data.ioc_count = len;        data.ioc_offset = 0;        gettimeofday(&start, NULL);        for (i = 1; i <= count; i++) {                data.ioc_obdo1.o_valid &= ~(OBD_MD_FLBLOCKS|OBD_MD_FLGRANT);                rc = obj_ioctl(OBD_IOC_BRW_WRITE, &data, 0);                if (rc) {                        fprintf(stderr, "%d: write %s\n", kid->k_id,                                strerror(rc = errno));                        break;                }                data.ioc_offset += len;        }        if (!rc) {                struct timeval end;                double diff;                gettimeofday(&end, NULL);                diff = difftime(&end, &start);                --i;                pthread_mutex_lock(&m_count);                write_bytes += i * len;                pthread_mutex_unlock(&m_count);                if (o_verbose > 4)                        printf("%d: wrote %dx%d pages in %.3fs (%.3f MB/s): %s",                               kid->k_id, i, pages, diff,                               ((double)i * len) / (diff * 1048576.0),                               ctime(&end.tv_sec));        }        if (rc)                fprintf(stderr, "%s-%d: err test_brw obj "LPX64" (%d)\n",                        cmdname, kid->k_id, kid->k_objid, rc);        return rc;}static int do_work(struct kid_t *kid){        int rc = 0, err, iter = 0;        if (!(kid->k_cmd.c_flags & C_CREATE_EVERY))                rc = obj_create(kid);        for (iter = 0; iter < kid->k_cmd.c_rpt; iter++) {                if (rc || sig_received)                        break;                if (kid->k_cmd.c_flags & C_CREATE_EVERY) {                        rc = obj_create(kid);                        if (rc)                                break;                }                if (kid->k_cmd.c_flags & C_WRITE) {                        rc = obj_write(kid);                        grant_estimate(kid->k_id);                }                if (kid->k_cmd.c_flags & C_CREATE_EVERY) {                        err = obj_delete(kid);                        if (!rc) rc = err;                }                if ((o_verbose > 3) && (iter % 10 == 0))                        printf("%d: i%d\n", kid->k_id, iter);                if (!rc)                        sleep(kid->k_cmd.c_delay);        }        if (!(kid->k_cmd.c_flags & C_CREATE_EVERY)) {                err = obj_delete(kid);                if (!rc) rc = err;        }        if (o_verbose > 2)                printf("%d: done (%d)\n", kid->k_id, rc);        return rc;}static void report_perf(){        struct timeval end;        double diff;        gettimeofday(&end, NULL);        diff = difftime(&end, &trigger_start);        if (o_verbose > 2) {                pthread_mutex_lock(&m_count);                printf("wrote %lluMB in %.3fs (%.3f MB/s)\n",                       write_bytes >> 20, diff,                       (write_bytes >> 20) / diff);                pthread_mutex_unlock(&m_count);        }}static void *run_one_child(void *threadvp){        struct kid_t *kid;        char oname[10], ename[10];        int thread = (long)threadvp, dev;        int rc = 0, err;        if (o_verbose > 2)                printf("%s: running thread #%d\n", cmdname, thread);        sprintf(oname, "o%.5d", thread);        sprintf(ename, "e%.5d", thread);        rc = echocli_setup(oname, ename, &dev);        if (rc) {                fprintf(stderr, "%s: can't setup '%s/%s' (%d)\n",                        cmdname, oname, ename, rc);                pthread_exit((void *)(long)rc);        }        kid = push_kid(thread);        if (!kid) {                rc = -ENOMEM;                goto out;        }        kid->k_dev = dev;        while(!(rc || sig_received)) {                pthread_mutex_lock(&m_trigger);                waiting_count++;                if ((waiting_count == live_threads) && timer_on) {                        report_perf();                        timer_on = 0;                        all_done = 1;                }                pthread_cond_wait(&cv_trigger, &m_trigger);                waiting_count--;                all_done = 0;                /* First trigger_count threads will do the work, the rest                   will block again */                if (trigger_count) {                        if (o_verbose > 4)                                printf("%d: trigger %d cmd %x\n",                                       kid->k_id, trigger_count,

⌨️ 快捷键说明

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