[prev in list] [next in list] [prev in thread] [next in thread]
List: drbd-cvs
Subject: [DRBD-cvs] svn commit by phil - r2648 - trunk/drbd - With this
From: drbd-cvs () linbit ! com
Date: 2006-12-28 12:07:31
Message-ID: 20061228120731.EE1022DEACCF () mail ! linbit ! com
[Download RAW message or body]
Author: phil
Date: 2006-12-28 13:07:12 +0100 (Thu, 28 Dec 2006)
New Revision: 2648
Modified:
trunk/drbd/drbd_int.h
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_worker.c
Log:
With this patch I try to make DRBD to send more big packets,
and less small packets. Somethimes I experienced that enabling
Jumbo frames decreased DRBD's preformance. Altough, I could
not reproduce this at time of writing the patch, I managed to
measure the distribution of the packet's sizes. This indicates
that the patch has the intended effect:
Distribution of packet sizen when writing 512MB of zeros:
pkt old-code new-code
sizes send recv send recv
---------- ------------------------------
1 to 450: 42047 42259 38629 38784
451 to 900: 4057 4230 2023 2176
901 to 1350: 112 2919 54 2289
1351 to 1800: 6697 7439 6698 7368
1801 to 2250: 11 43 4 8
2251 to 2700: 1643 1684 1838 2307
2701 to 3150: 5 43 3 18
3151 to 3600: 2 70 0 51
3601 to 4050: 95 218 2 251
4051 to 4500: 3159 3296 1 58
4501 to 4950: 45 270 6 176
4951 to 5400: 75 717 60 453
5401 to 5850: 867 901 1376 1383
5851 to 6300: 683 696 245 251
6301 to 6750: 129 214 44 47
6751 to 7200: 24 39 266 274
7201 to 7650: 101 118 256 263
7651 to 8100: 30 1829 70 2109
8101 to 8550: 36 48 49 56
8551 to 9000+: 14971 53657 15755 54992
-Phil
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2006-12-27 15:45:41 UTC (rev 2647)
+++ trunk/drbd/drbd_int.h 2006-12-28 12:07:12 UTC (rev 2648)
@@ -35,6 +35,8 @@
#include <linux/bitops.h>
#include <linux/slab.h>
#include <linux/crypto.h>
+#include <linux/tcp.h>
+#include <net/tcp.h>
#include "lru_cache.h"
// module parameter, defined in drbd_main.c
@@ -1336,6 +1338,35 @@
extern void drbd_set_recv_tcq(drbd_dev *mdev, int tcq_enabled);
extern void _drbd_clear_done_ee(drbd_dev *mdev);
+static inline void drbd_tcp_cork(struct socket *sock)
+{
+#if 1
+ mm_segment_t oldfs = get_fs();
+ int val = 1;
+
+ set_fs(KERNEL_DS);
+ tcp_setsockopt(sock->sk, SOL_TCP, TCP_CORK, (char*)&val, sizeof(val) );
+ set_fs(oldfs);
+#else
+ tcp_sk(sock->sk)->nonagle |= TCP_NAGLE_CORK;
+#endif
+}
+
+static inline void drbd_tcp_flush(struct socket *sock)
+{
+#if 1
+ mm_segment_t oldfs = get_fs();
+ int val = 0;
+
+ set_fs(KERNEL_DS);
+ tcp_setsockopt(sock->sk, SOL_TCP, TCP_CORK, (char*)&val, sizeof(val) );
+ set_fs(oldfs);
+#else
+ tcp_sk(sock->sk)->nonagle &= ~TCP_NAGLE_CORK;
+ tcp_push_pending_frames(sock->sk, tcp_sk(sock->sk));
+#endif
+}
+
// drbd_proc.c
extern struct proc_dir_entry *drbd_proc;
extern struct file_operations drbd_proc_fops;
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2006-12-27 15:45:41 UTC (rev 2647)
+++ trunk/drbd/drbd_receiver.c 2006-12-28 12:07:12 UTC (rev 2648)
@@ -31,8 +31,6 @@
#include <asm/uaccess.h>
#include <net/sock.h>
-#include <linux/tcp.h>
-
#include <linux/version.h>
#include <linux/fs.h>
#include <linux/file.h>
@@ -764,7 +762,6 @@
msock->sk->sk_allocation = GFP_NOIO;
sock->sk->sk_priority=TC_PRIO_BULK;
- tcp_sk(sock->sk)->nonagle = 0;
// FIXME fold to limits. should be done in drbd_ioctl
sock->sk->sk_sndbuf = mdev->net_conf->sndbuf_size;
sock->sk->sk_rcvbuf = mdev->net_conf->sndbuf_size;
@@ -777,7 +774,6 @@
sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK | SOCK_RCVBUF_LOCK;
msock->sk->sk_priority=TC_PRIO_INTERACTIVE;
- tcp_sk(sock->sk)->nonagle = 1;
msock->sk->sk_sndbuf = 2*32767;
msock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10;
msock->sk->sk_rcvtimeo = mdev->net_conf->ping_int*HZ;
@@ -3279,12 +3275,16 @@
clear_bit(SIGNAL_ASENDER, &mdev->flags);
flush_signals(current);
}
+ drbd_tcp_flush(mdev->meta.socket);
+
rv = drbd_recv_short(mdev, mdev->meta.socket,
buf,expect-received);
clear_bit(SIGNAL_ASENDER, &mdev->flags);
flush_signals(current);
+ drbd_tcp_cork(mdev->meta.socket);
+
/* Note:
* -EINTR (on meta) we got a signal
* -EAGAIN (on meta) rcvtimeo expired
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2006-12-27 15:45:41 UTC (rev 2647)
+++ trunk/drbd/drbd_worker.c 2006-12-28 12:07:12 UTC (rev 2648)
@@ -850,13 +850,24 @@
drbd_dev *mdev = thi->mdev;
struct drbd_work *w = 0;
LIST_HEAD(work_list);
- int intr,i;
+ int intr=0,i;
sprintf(current->comm, "drbd%d_worker", mdev_to_minor(mdev));
while (get_t_state(thi) == Running) {
- intr = down_interruptible(&mdev->data.work.s);
+ if(down_trylock(&mdev->data.work.s)) {
+ down(&mdev->data.mutex);
+ if(mdev->data.socket)drbd_tcp_flush(mdev->data.socket);
+ up(&mdev->data.mutex);
+
+ intr = down_interruptible(&mdev->data.work.s);
+
+ down(&mdev->data.mutex);
+ if(mdev->data.socket) drbd_tcp_cork(mdev->data.socket);
+ up(&mdev->data.mutex);
+ }
+
if (intr) {
D_ASSERT(intr == -EINTR);
flush_signals(current);
_______________________________________________
drbd-cvs mailing list
drbd-cvs@lists.linbit.com
http://lists.linbit.com/mailman/listinfo/drbd-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic