[sheepdog] [PATCH v1 1/4] sheep/http: add option 'buffer=' to adjust size of buffer for kv

Liu Yuan namei.unix at gmail.com
Wed Jan 29 10:56:37 CET 2014


On Wed, Jan 29, 2014 at 05:15:04PM +0800, Robin Dong wrote:
> In some testing environment, large size of buffer will make
> the performance of swift bad because kv will split buffer into too many
> requests and send out, which lead to congestion in network; but small size
> of buffer will make the speed of receiving http request slow. After all,
> we found out that 8MB is the best value for our environment.
> 
> Even the 8MB is good, the size of buffer is difficult to choose in different
> environment (different hardware of servers, different number of nodes, etc.),
> so we should add this option to let users choose buffer size.

> Signed-off-by: Robin Dong <sanbai at taobao.com>
> ---
>  sheep/http/http.c | 16 ++++++++++++++++
>  sheep/http/http.h |  4 ++++
>  sheep/http/kv.c   |  8 ++++----
>  sheep/sheep.c     |  5 +++--
>  4 files changed, 27 insertions(+), 6 deletions(-)
> 
> diff --git a/sheep/http/http.c b/sheep/http/http.c
> index cf658c6..c0b3287 100644
> --- a/sheep/http/http.c
> +++ b/sheep/http/http.c
> @@ -346,6 +346,21 @@ static int http_opt_port_parser(const char *s)
>  	return 0;
>  }
>  
> +#define UNIT		(UINT64_C(1) << 20)
> +#define MIN_RW_BUFFER	(SD_DATA_OBJ_SIZE / UNIT)
> +#define MAX_RW_BUFFER	1024
> +static int http_opt_buffer_parser(const char *s)
> +{
> +	char *endp;
> +	uint64_t val;
> +
> +	val = strtoll(s, &endp, 10);
> +	if (s != endp && val > MIN_RW_BUFFER && val < MAX_RW_BUFFER)
> +		kv_rw_buffer = round_up(val, MIN_RW_BUFFER);
> +	sd_debug("kv_rw_buffer: %"PRIu64"MB", kv_rw_buffer);
> +	return 0;
> +}
> +
>  static int http_opt_default_parser(const char *s)
>  {
>  	struct http_driver *hdrv;
> @@ -375,6 +390,7 @@ static int http_opt_default_parser(const char *s)
>  static struct option_parser http_opt_parsers[] = {
>  	{ "host=", http_opt_host_parser },
>  	{ "port=", http_opt_port_parser },
> +	{ "buffer=", http_opt_buffer_parser },
>  	{ "", http_opt_default_parser },
>  	{ NULL, NULL },
>  };
> diff --git a/sheep/http/http.h b/sheep/http/http.h
> index f437f82..21006b2 100644
> --- a/sheep/http/http.h
> +++ b/sheep/http/http.h
> @@ -115,6 +115,10 @@ int http_request_writef(struct http_request *req, const char *fmt, ...);
>  #define SD_MAX_BUCKET_NAME 256
>  #define SD_MAX_OBJECT_NAME 1024
>  
> +/* This default value shows best performance in test */
> +#define DEFAULT_KV_RW_BUFFER 8 

I suggest make it as 32M for defualt your help message says

>
> +extern uint64_t kv_rw_buffer;
> +
>  /* Account operations */
>  int kv_create_account(const char *account);
>  int kv_read_account_meta(struct http_request *req, const char *account);
> diff --git a/sheep/http/kv.c b/sheep/http/kv.c
> index bfbf305..f896ab1 100644
> --- a/sheep/http/kv.c
> +++ b/sheep/http/kv.c
> @@ -16,6 +16,8 @@
>  #include "sheep_priv.h"
>  #include "http.h"
>  
> +uint64_t kv_rw_buffer = DEFAULT_KV_RW_BUFFER;
> +
>  struct kv_bnode {
>  	char name[SD_MAX_BUCKET_NAME];
>  	uint64_t object_count;
> @@ -673,8 +675,6 @@ static int vdi_read_write(uint32_t vid, char *data, size_t length,
>  	return local_req_wait(iocb);
>  }
>  
> -#define MAX_RW_BUFFER (SD_DATA_OBJ_SIZE * 25) /* No rationale yet */
> -
>  static int onode_populate_extents(struct kv_onode *onode,
>  				  struct http_request *req)
>  {
> @@ -683,7 +683,7 @@ static int onode_populate_extents(struct kv_onode *onode,
>  	int ret;
>  	char *data_buf = NULL;
>  	uint32_t data_vid = onode->data_vid;
> -	uint64_t write_buffer_size = MIN(MAX_RW_BUFFER, req->data_length);
> +	uint64_t write_buffer_size = MIN(kv_rw_buffer, req->data_length);
>  
>  	count = DIV_ROUND_UP(req->data_length, SD_DATA_OBJ_SIZE);
>  	sys->cdrv->lock(data_vid);
> @@ -865,7 +865,7 @@ static int onode_read_extents(struct kv_onode *onode, struct http_request *req)
>  	uint64_t off = req->offset, len = req->data_length;
>  	int ret;
>  	char *data_buf = NULL;
> -	uint64_t read_buffer_size = MIN(MAX_RW_BUFFER, onode->size);
> +	uint64_t read_buffer_size = MIN(kv_rw_buffer, onode->size);
>  
>  	data_buf = xmalloc(read_buffer_size);
>  	total_size = len;
> diff --git a/sheep/sheep.c b/sheep/sheep.c
> index 7ef3746..7c1eaec 100644
> --- a/sheep/sheep.c
> +++ b/sheep/sheep.c
> @@ -47,10 +47,11 @@ static const char http_help[] =
>  "Available arguments:\n"
>  "\thost=: specify a host to communicate with http server (default: localhost)\n"
>  "\tport=: specify a port to communicate with http server (default: 8000)\n"
> +"\tbuffer=: specify buffer size (unit: MB) for http request (default: 32)\n"
>  "\tswift: enable swift API\n"
> -"Example:\n\t$ sheep -r host=localhost,port=7001,swift ...\n"
> +"Example:\n\t$ sheep -r host=localhost,port=7001,buffer=64,swift ...\n"
>  "This tries to enable Swift API and use localhost:7001 to\n"
> -"communicate with http server.\n";
> +"communicate with http server, using 64MB buffer.\n";

we should support 'buffer=64M' notation instead of 'buffer=64'
  
Thanks
Yuan



More information about the sheepdog mailing list