Author: trustin
Date: Mon Nov 5 00:33:26 2007
New Revision: 591910
URL: http://svn.apache.org/viewvc?rev=591910&view=rev
Log:
Related issue: DIRMINA-469 (Write throughput is horribly low)
* Improved the write operation loop more efficiently.
* Adjust the default write limit of AbstractIoProcessor to squeeze throughput.
Modified:
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java
Modified:
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL:
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=591910&r1=591909&r2=591910&view=diff
==============================================================================
---
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
(original)
+++
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
Mon Nov 5 00:33:26 2007
@@ -450,9 +450,10 @@
continue;
}
- writtenBytes += ch.write(buf.buf());
-
- if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
+ int localWrittenBytes = ch.write(buf.buf());
+ writtenBytes += localWrittenBytes;
+
+ if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes)
{
// Kernel buffer is full or wrote too much.
key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
return false;
Modified:
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL:
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=591910&r1=591909&r2=591910&view=diff
==============================================================================
---
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
(original)
+++
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
Mon Nov 5 00:33:26 2007
@@ -399,9 +399,10 @@
continue;
}
- writtenBytes += ch.write(buf.buf());
+ int localWrittenBytes = ch.write(buf.buf());
+ writtenBytes += localWrittenBytes;
- if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
+ if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes)
{
// Kernel buffer is full or wrote too much.
key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
return false;
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java?rev=591910&r1=591909&r2=591910&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java
Mon Nov 5 00:33:26 2007
@@ -433,8 +433,9 @@
Queue<WriteRequest> writeRequestQueue = session.getWriteRequestQueue();
// Set limitation for the number of written bytes for read-write
- // fairness.
- int maxWrittenBytes = session.getConfig().getMaxReadBufferSize();
+ // fairness. I doubled the maxReadBufferSize which yields best
+ // performance in my experience, while not breaking fairness much.
+ int maxWrittenBytes = session.getConfig().getMaxReadBufferSize() << 1;
int writtenBytes = 0;
do {
@@ -445,6 +446,7 @@
break;
}
+ long localWrittenBytes;
Object message = req.getMessage();
if (message instanceof FileRegion) {
FileRegion region = (FileRegion) message;
@@ -456,16 +458,8 @@
continue;
}
- long localWrittenBytes = transferFile(session, region);
+ localWrittenBytes = transferFile(session, region);
region.setPosition(region.getPosition() + localWrittenBytes);
- writtenBytes += localWrittenBytes;
-
- if (region.getCount() > 0 || writtenBytes >= maxWrittenBytes) {
- // Kernel buffer is full or wrote too much.
- setOpWrite(session, true);
- return false;
- }
-
} else {
IoBuffer buf = (IoBuffer) message;
if (buf.remaining() == 0) {
@@ -476,13 +470,15 @@
continue;
}
- writtenBytes += write(session, buf);
+ localWrittenBytes = write(session, buf);
+ }
+
+ writtenBytes += localWrittenBytes;
- if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
- // Kernel buffer is full or wrote too much.
- setOpWrite(session, true);
- return false;
- }
+ if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes) {
+ // Kernel buffer is full or wrote too much.
+ setOpWrite(session, true);
+ return false;
}
} while (writtenBytes < maxWrittenBytes);