[Stgt-devel] sg_turs on stgt iscsi drive is very slow
Ming Zhang
blackmagic02881
Sat Jan 20 16:30:58 CET 2007
On Sun, 2007-01-21 at 00:22 +0900, FUJITA Tomonori wrote:
> From: Ming Zhang <blackmagic02881 at gmail.com>
> Subject: [Stgt-devel] sg_turs on stgt iscsi drive is very slow
> Date: Mon, 11 Dec 2006 11:58:27 -0500
>
> > Pulled out the linux-2.6-target git tree, compiled stgt and iet under
> > same kernel. Export a 4 disk raid0 device to ini. Ini is open-iscsi
> > r598.
> >
> > Want to know how efficient stgt handle context switch.
> >
> > run sg_turs -t -n=10000 /dev/sg0 on IET drive. results is 2521/sec.
>
> (snip)
>
> > run sg_turs -t -n=10000 /dev/sg0 on stgt drive. results is 250
> > operations/sec. yes, 250.
>
> OK. I did some tests too. As we know, aioepoll isn't effective.
>
> The sg_turs test doesn't need AIO code. So I just tried epoll for
> event notification.
>
> - tgt (patched)
>
> paris:~# sg_turs -t -n=1000 /dev/sg3
> time to perform commands was 0.125131 secs; 7991.62 operations/sec
> Completed 1000 Test Unit Ready commands with 0 errors
>
> - IET
>
> paris:~# sg_turs -t -n=1000 /dev/sg3
> time to perform commands was 0.128747 secs; 7767.17 operations/sec
> Completed 1000 Test Unit Ready commands with 0 errors
>
>
> Well, not bad at all. And I heard that kevent is more effective than
> epoll.
the # looks pretty good. thanks for testing. maybe it is bounded by your
network now? could you try a open-iscsi via loopback?
what is the CPU utilization during test?
>
>
> Note that aioepoll affects only user-mode target drivers (now only
> iSCSI). The kernel target drivers don't need AIO code (can use
> epoll). So they should have no performance problem. And as I said
> before, I think that the iSCSI target driver is ok in real workloads.
do you have a road map for stgt? see, need to read your reply for Pete
to know OSD is already under your plan.
>
> I've attached the patch for people who are interested:
>
>
> Index: usr/tgtd.c
> ===================================================================
> --- usr/tgtd.c (revision 767)
> +++ usr/tgtd.c (working copy)
> @@ -212,13 +212,13 @@
> return;
> }
>
> - iocb = iocbs;
> - io_prep_epoll_wait(iocb, ep_fd, events, ARRAY_SIZE(events), -1);
> - err = io_submit(ctx, 1, &iocb);
> -
> +/* iocb = iocbs; */
> +/* io_prep_epoll_wait(iocb, ep_fd, events, ARRAY_SIZE(events), -1); */
> +/* err = io_submit(ctx, 1, &iocb); */
> retry:
> - nevent = io_getevents(ctx, 1, ARRAY_SIZE(aioevents), aioevents, &timeout);
> +/* nevent = io_getevents(ctx, 1, ARRAY_SIZE(aioevents), aioevents, &timeout); */
>
> + nevent = epoll_wait(ep_fd, events, ARRAY_SIZE(events), -1);
> if (nevent < 0) {
> if (errno != EINTR) {
> eprintf("%m\n");
> @@ -226,18 +226,22 @@
> }
> } else if (nevent) {
> for (i = 0; i < nevent; i++) {
> - if (iocb == aioevents[i].obj) {
> - int j;
> - for (j = 0; j < aioevents[i].res; j++) {
> - tev = (struct tgt_event *) events[j].data.ptr;
> - tev->handler(tev->fd, events[j].events, tev->data);
> - }
>
> - err = io_submit(ctx, 1, &iocb);
> - } else {
> - /* FIXME */
> - target_cmd_io_done(aioevents[i].data, 0);
> - }
> + tev = (struct tgt_event *) events[i].data.ptr;
> + tev->handler(tev->fd, events[i].events, tev->data);
> +
> +/* if (iocb == aioevents[i].obj) { */
> +/* int j; */
> +/* for (j = 0; j < aioevents[i].res; j++) { */
> +/* tev = (struct tgt_event *) events[j].data.ptr; */
> +/* tev->handler(tev->fd, events[j].events, tev->data); */
> +/* } */
> +
> +/* err = io_submit(ctx, 1, &iocb); */
> +/* } else { */
> +/* /\* FIXME *\/ */
> +/* target_cmd_io_done(aioevents[i].data, 0); */
> +/* } */
> }
> } else
> schedule();
> Index: usr/bd_aio.c
> ===================================================================
> --- usr/bd_aio.c (revision 767)
> +++ usr/bd_aio.c (working copy)
> @@ -75,21 +75,21 @@
> struct iocb iocb, *io;
> int err;
>
> - *async = 1;
> + *async = 0;
>
> - io = &iocb;
> - memset(io, 0, sizeof(*io));
> +/* io = &iocb; */
> +/* memset(io, 0, sizeof(*io)); */
>
> - dprintf("%d %d %u %lx %" PRIx64 " %p %p\n", dev->fd, rw, datalen, *uaddr, offset,
> - io, key);
> +/* dprintf("%d %d %u %lx %" PRIx64 " %p %p\n", dev->fd, rw, datalen, *uaddr, offset, */
> +/* io, key); */
>
> - if (rw == READ)
> - io_prep_pread(io, dev->fd, (void *) *uaddr, datalen, offset);
> - else
> - io_prep_pwrite(io, dev->fd, (void *) *uaddr, datalen, offset);
> +/* if (rw == READ) */
> +/* io_prep_pread(io, dev->fd, (void *) *uaddr, datalen, offset); */
> +/* else */
> +/* io_prep_pwrite(io, dev->fd, (void *) *uaddr, datalen, offset); */
>
> - io->data = key;
> - err = io_submit(ctx, 1, &io);
> +/* io->data = key; */
> +/* err = io_submit(ctx, 1, &io); */
>
> return 0;
> }
--
http://blackmagic02881.wordpress.com/
More information about the stgt
mailing list