[DRBD-cvs] svn commit by phil - r2216 - in branches/drbd-0.7:
documentation drbd drbd/linux scripts user - Added a new run
time configuration parameter (bdev-tres
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Fri May 26 15:20:52 CEST 2006
Author: phil
Date: 2006-05-26 15:20:48 +0200 (Fri, 26 May 2006)
New Revision: 2216
Modified:
branches/drbd-0.7/documentation/drbdsetup.sgml
branches/drbd-0.7/drbd/drbd_receiver.c
branches/drbd-0.7/drbd/drbd_sizeof_sanity_check.c
branches/drbd-0.7/drbd/linux/drbd.h
branches/drbd-0.7/drbd/linux/drbd_config.h
branches/drbd-0.7/scripts/drbd.conf
branches/drbd-0.7/user/drbd_limits.h
branches/drbd-0.7/user/drbdadm_adjust.c
branches/drbd-0.7/user/drbdadm_parser.y
branches/drbd-0.7/user/drbdadm_scanner.fl
branches/drbd-0.7/user/drbdsetup.c
Log:
Added a new run time configuration parameter (bdev-treshold) to
be able to tune for special controllers. In this case HP's cciss.
Modified: branches/drbd-0.7/documentation/drbdsetup.sgml
===================================================================
--- branches/drbd-0.7/documentation/drbdsetup.sgml 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/documentation/drbdsetup.sgml 2006-05-26 13:20:48 UTC (rev 2216)
@@ -313,6 +313,21 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><option>-l</option>,
+ <option>--bdev-treshold <replaceable>val</replaceable></option></term>
+ <listitem>
+ <para>
+ When the number of pending write requests on the standby
+ (secondary) nodes goes over bdev-treshold we trigger
+ the request processing of out backing storage device.
+ Some storage controllers deliver better performance with small
+ values, other delivers beste performance when it is set to
+ the same value as max-buffers. Minimum 16, default 128, maximum
+ 131072.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><option>-d</option>,
<option>--on-disconnect <replaceable>discon_handler</replaceable></option></term>
<listitem>
Modified: branches/drbd-0.7/drbd/drbd_receiver.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_receiver.c 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/drbd/drbd_receiver.c 2006-05-26 13:20:48 UTC (rev 2216)
@@ -301,7 +301,8 @@
MUST_HOLD(&mdev->ee_lock);
- if(mdev->ee_vacant == EE_MININUM / 2) {
+ if(mdev->ee_vacant == EE_MININUM / 2 &&
+ (mdev->conf.bdev_treshold != mdev->conf.max_buffers) ) {
spin_unlock_irq(&mdev->ee_lock);
drbd_kick_lo(mdev);
spin_lock_irq(&mdev->ee_lock);
@@ -903,11 +904,8 @@
/* kick lower level device, if we have more than (arbitrary number)
* reference counts on it, which typically are locally submitted io
* requests. don't use unacked_cnt, so we speed up proto A and B, too.
- *
- * XXX maybe: make that arbitrary number configurable.
- * for now, I choose 1/16 of max-epoch-size.
*/
- if (atomic_read(&mdev->local_cnt) >= (mdev->conf.max_epoch_size>>4) ) {
+ if (atomic_read(&mdev->local_cnt) >= mdev->conf.bdev_treshold ) {
drbd_kick_lo(mdev);
}
mdev->writ_cnt+=data_size>>9;
Modified: branches/drbd-0.7/drbd/drbd_sizeof_sanity_check.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_sizeof_sanity_check.c 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/drbd/drbd_sizeof_sanity_check.c 2006-05-26 13:20:48 UTC (rev 2216)
@@ -12,13 +12,13 @@
{
int err = 0, s = 0;
SZO(struct disk_config, 24)
- SZO(struct net_config, 304)
+ SZO(struct net_config, 308)
SZO(struct syncer_config, 24)
SZO(struct ioctl_disk_config, 32)
- SZO(struct ioctl_net_config, 312)
+ SZO(struct ioctl_net_config, 316)
SZO(struct ioctl_syncer_config, 32)
SZO(struct ioctl_wait, 16)
- SZO(struct ioctl_get_config, 440)
+ SZO(struct ioctl_get_config, 444)
if (err) printk("<3>ioctls won't work, aborting\n");
return err;
}
Modified: branches/drbd-0.7/drbd/linux/drbd.h
===================================================================
--- branches/drbd-0.7/drbd/linux/drbd.h 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/drbd/linux/drbd.h 2006-05-26 13:20:48 UTC (rev 2216)
@@ -93,6 +93,7 @@
IN int ping_int; /* seconds */
IN int max_epoch_size;
IN int max_buffers;
+ IN int bdev_treshold;
IN int sndbuf_size; /* socket send buffer size */
IN unsigned int ko_count;
IN enum disconnect_handler on_disconnect;
Modified: branches/drbd-0.7/drbd/linux/drbd_config.h
===================================================================
--- branches/drbd-0.7/drbd/linux/drbd_config.h 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/drbd/linux/drbd_config.h 2006-05-26 13:20:48 UTC (rev 2216)
@@ -23,7 +23,7 @@
extern const char * drbd_buildtag(void);
#define REL_VERSION "0.7.19"
-#define API_VERSION 78
+#define API_VERSION 79
#define PRO_VERSION 74
//#define DBG_ALL_SYMBOLS // no static functs, improves quality of OOPS traces
Modified: branches/drbd-0.7/scripts/drbd.conf
===================================================================
--- branches/drbd-0.7/scripts/drbd.conf 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/scripts/drbd.conf 2006-05-26 13:20:48 UTC (rev 2216)
@@ -172,6 +172,18 @@
#
# max-buffers 2048;
+ # When the number of outstanding requests on a standby (secondary)
+ # node goes over bdev-reshold we start to kick the backing device
+ # to start its request processing. This is an advanced tuning
+ # parameter to get more performance out of capable storage controlers.
+ # Some controlers likes to be kicked often, other controlers
+ # deliver better performance when the are kicked less frequently.
+ # Set it to the value of max-buffers to get the least possible
+ # number of run_task_queue_disk() calls.
+ #
+ # bdev-treshold 128;
+
+
# The highest number of data blocks between two write barriers.
# If you set this < 10 you might decrease your performance.
# max-epoch-size 2048;
Modified: branches/drbd-0.7/user/drbd_limits.h
===================================================================
--- branches/drbd-0.7/user/drbd_limits.h 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/user/drbd_limits.h 2006-05-26 13:20:48 UTC (rev 2216)
@@ -52,6 +52,9 @@
/* @4k PageSize -> 128kB - 512MB */
RANGE(MAX_BUFFERS, 32, 131072);
+ /* @4k PageSize -> 64kB - 512MB */
+ RANGE(BDEV_TRESHOLD, 16, 131072);
+
/* 0 is disabled.
* 200 should be more than enough even for very short timeouts */
RANGE(KO_COUNT,0, 200);
Modified: branches/drbd-0.7/user/drbdadm_adjust.c
===================================================================
--- branches/drbd-0.7/user/drbdadm_adjust.c 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/user/drbdadm_adjust.c 2006-05-26 13:20:48 UTC (rev 2216)
@@ -337,6 +337,7 @@
do_connect |= check_opt_d(in,"ping-int",1,"sec",res->net_options);
do_connect |= check_opt_d(in,"max-epoch-size",1,"",res->net_options);
do_connect |= check_opt_d(in,"max-buffers",1,"",res->net_options);
+ do_connect |= check_opt_d(in,"bdev-treshold",1,"",res->net_options);
do_connect |= check_opt_d(in,"sndbuf-size",1,"",res->net_options);
do_connect |= check_opt_d(in,"ko-count",1,"",res->net_options);
do_connect |= check_opt_s(in,"on-disconnect",res->net_options);
Modified: branches/drbd-0.7/user/drbdadm_parser.y
===================================================================
--- branches/drbd-0.7/user/drbdadm_parser.y 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/user/drbdadm_parser.y 2006-05-26 13:20:48 UTC (rev 2216)
@@ -144,6 +144,7 @@
R_CONNECT_INT,
R_PING_INT,
R_MAX_BUFFERS,
+ R_BDEV_TRESHOLD,
R_MAX_EPOCH_SIZE,
R_SNDBUF_SIZE,
R_KO_COUNT,
@@ -192,6 +193,10 @@
m_strtoll_range(value, 1, name, DRBD_MAX_BUFFERS_MIN,
DRBD_MAX_BUFFERS_MAX);
break;
+ case R_BDEV_TRESHOLD:
+ m_strtoll_range(value, 1, name, DRBD_BDEV_TRESHOLD_MIN,
+ DRBD_BDEV_TRESHOLD_MAX);
+ break;
case R_MAX_EPOCH_SIZE:
m_strtoll_range(value, 1, name, DRBD_MAX_EPOCH_SIZE_MIN,
DRBD_MAX_EPOCH_SIZE_MAX);
@@ -328,7 +333,7 @@
%token <txt> TK_MINOR_COUNT TK_INTEGER TK_STRING
%token <txt> TK_ON_IO_ERROR TK_SIZE
%token <txt> TK_TIMEOUT TK_CONNECT_INT TK_PING_INT TK_MAX_BUFFERS TK_IPADDR
-%token <txt> TK_MAX_EPOCH_SIZE TK_SNDBUF_SIZE
+%token <txt> TK_BDEV_TRESHOLD TK_MAX_EPOCH_SIZE TK_SNDBUF_SIZE
%token <txt> TK_SKIP_SYNC TK_USE_CSUMS TK_RATE TK_SYNC_GROUP TK_AL_EXTENTS
%token <txt> TK_WFC_TIMEOUT TK_DEGR_WFC_TIMEOUT
%token <txt> TK_KO_COUNT TK_ON_DISCONNECT TK_DIALOG_REFRESH
@@ -452,6 +457,8 @@
{ range_check(R_PING_INT,$1,$2); $$=new_opt($1,$2); }
| TK_MAX_BUFFERS TK_INTEGER
{ range_check(R_MAX_BUFFERS,$1,$2); $$=new_opt($1,$2); }
+ | TK_BDEV_TRESHOLD TK_INTEGER
+ { range_check(R_BDEV_TRESHOLD,$1,$2); $$=new_opt($1,$2); }
| TK_MAX_EPOCH_SIZE TK_INTEGER
{ range_check(R_MAX_EPOCH_SIZE,$1,$2); $$=new_opt($1,$2); }
| TK_SNDBUF_SIZE TK_INTEGER
Modified: branches/drbd-0.7/user/drbdadm_scanner.fl
===================================================================
--- branches/drbd-0.7/user/drbdadm_scanner.fl 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/user/drbdadm_scanner.fl 2006-05-26 13:20:48 UTC (rev 2216)
@@ -258,10 +258,11 @@
ping-int do_assign(NUM); CP; return TK_PING_INT;
connect-int do_assign(NUM); CP; return TK_CONNECT_INT;
max-buffers do_assign(NUM); CP; return TK_MAX_BUFFERS;
+ bdev-treshold do_assign(NUM); CP; return TK_BDEV_TRESHOLD;
max-epoch-size do_assign(NUM); CP; return TK_MAX_EPOCH_SIZE;
ko-count do_assign(NUM); CP; return TK_KO_COUNT;
on-disconnect do_assign(ON_DISCONNECT); CP; return TK_ON_DISCONNECT;
- {NDELIM} expect_error("one of 'sndbuf-size|timeout|ping-int|connect-int|max-buffers|max-epoch-size|ko-count|on-disconnect'");
+ {NDELIM} expect_error("one of 'sndbuf-size|timeout|ping-int|connect-int|max-buffers|bdev-treshold|max-epoch-size|ko-count|on-disconnect'");
}
<SYNCER>{
Modified: branches/drbd-0.7/user/drbdsetup.c
===================================================================
--- branches/drbd-0.7/user/drbdsetup.c 2006-05-24 19:04:01 UTC (rev 2215)
+++ branches/drbd-0.7/user/drbdsetup.c 2006-05-26 13:20:48 UTC (rev 2216)
@@ -70,6 +70,7 @@
#define DEF_ON_IO_ERROR PassOn
#define DEF_KO_COUNT 0
#define DEF_ON_DISCONNECT Reconnect
+#define DEF_BDEV_TRESHOLD (DEF_MAX_BUFFERS/16)
#if 0
# define ioctl(X...) (fprintf(stderr,"ioctl(%s)\n",#X),0);
@@ -157,6 +158,7 @@
{ "timeout", required_argument, 0, 't' },
{ "max-epoch-size", required_argument, 0, 'e' },
{ "max-buffers",required_argument, 0, 'b' },
+ { "bdev-treshold",required_argument, 0, 'l' },
{ "connect-int",required_argument, 0, 'c' },
{ "ping-int", required_argument, 0, 'i' },
{ "sndbuf-size",required_argument, 0, 'S' },
@@ -562,6 +564,7 @@
cn->config.sndbuf_size = DEF_SNDBUF_SIZE ;
cn->config.on_disconnect = DEF_ON_DISCONNECT;
cn->config.ko_count = DEF_KO_COUNT;
+ cn->config.bdev_treshold = DEF_BDEV_TRESHOLD;
if(argc==0) return 0;
@@ -588,6 +591,10 @@
cn->config.max_buffers = m_strtoll_range(optarg,1, "max-buffers",
DRBD_MAX_BUFFERS_MIN, DRBD_MAX_BUFFERS_MAX);
break;
+ case 'l':
+ cn->config.bdev_treshold = m_strtoll_range(optarg,1, "bdev-treshold",
+ DRBD_BDEV_TRESHOLD_MIN, DRBD_BDEV_TRESHOLD_MAX);
+ break;
case 'c':
cn->config.try_connect_int = m_strtoll_range(optarg,1, "connect-int",
DRBD_CONNECT_INT_MIN, DRBD_CONNECT_INT_MAX);
@@ -1345,6 +1352,7 @@
SHOW_I("ping-int","sec", cn.nconf.ping_int, DEF_NET_PING_I);
SHOW_I("max-epoch-size","", cn.nconf.max_epoch_size, DEF_MAX_EPOCH_SIZE);
SHOW_I("max-buffers","", cn.nconf.max_buffers, DEF_MAX_BUFFERS);
+ SHOW_I("bdev-threshold","", cn.nconf.bdev_treshold, DEF_BDEV_TRESHOLD);
SHOW_I("sndbuf-size","", cn.nconf.sndbuf_size, DEF_SNDBUF_SIZE);
SHOW_I("ko-count","", cn.nconf.ko_count, DEF_KO_COUNT);
if( cn.nconf.on_disconnect != DEF_ON_DISCONNECT) {
More information about the drbd-cvs
mailing list