At Thu, 10 Nov 2011 14:22:30 -0500,
Christoph Hellwig wrote:
> 
> Writing zeroes into the last sector of an object is not going to
> preallocate it, but just allocates the last sector.  This leads
> to fairly nasty fragmentation.  Use fallocate on the whole object
> instead.  On my test setup with XFS this speeds up writes to an
> unallocate volume from ~73MB/s to ~80MB/s.
> 
> This was benchmarked using an O_DIRECT dd call of 1GB size.
> 
> Signed-off-by: Christoph Hellwig <[email protected]>
> 
> Index: sheepdog/sheep/store.c
> ===================================================================
> --- sheepdog.orig/sheep/store.c       2011-11-10 19:15:46.796295077 +0100
> +++ sheepdog/sheep/store.c    2011-11-10 19:25:14.603795482 +0100
> @@ -639,19 +640,8 @@ static int store_queue_request_local(str
>                       free(buf);
>                       buf = NULL;
>               } else {
> -                     int size = SECTOR_SIZE;
> -                     buf = valloc(size);
> -                     if (!buf) {
> -                             eprintf("failed to allocate memory\n");
> -                             ret = SD_RES_NO_MEM;
> -                             goto out;
> -                     }
> -                     memset(buf, 0, size);
> -                     ret = pwrite64(fd, buf, size, SD_DATA_OBJ_SIZE - size);
> -                     free(buf);
> -                     buf = NULL;
> -
> -                     if (ret != size) {
> +                     ret = posix_fallocate(fd, 0, SD_DATA_OBJ_SIZE);
> +                     if (ret == -1) {

posix_fallocate() shows very poor performance if the underlying
filesystem doesn't support fallocate() (e.g. ext3).  How about using
fallocate() instead of posix_fallocate(), and if it returns
EOPNOTSUPP, writing SD_DATA_OBJ_SIZE bytes with one pwrite() call?

The other four patches you sent are okay to me.  I've applied them,
thanks a lot!

Kazutaka


>                               if (errno == ENOSPC)
>                                       ret = SD_RES_NO_SPACE;
>                               else {
> 
> -- 
> sheepdog mailing list
> [email protected]
> http://lists.wpkg.org/mailman/listinfo/sheepdog
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to