Author: remm
Date: Fri Mar 24 10:15:16 2006
New Revision: 388594

URL: http://svn.apache.org/viewcvs?rev=388594&view=rev
Log:
- Add many threading options, the most useful being multiple pollers for Win 
(after testing, it's
  really not possible to have large pollers and reasonable performance).

Modified:
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/AprEndpoint.java

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=388594&r1=388593&r2=388594&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/AprEndpoint.java 
(original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/AprEndpoint.java 
Fri Mar 24 10:15:16 2006
@@ -92,19 +92,19 @@
     /**
      * The acceptor thread.
      */
-    protected Thread acceptorThread = null;
+    //protected Thread[] acceptorThreads = null;
 
 
     /**
      * The socket poller thread.
      */
-    protected Thread pollerThread = null;
+    //protected Thread[] pollerThreads = null;
 
 
     /**
      * The sendfile thread.
      */
-    protected Thread sendfileThread = null;
+    //protected Thread[] sendfileThreads = null;
 
 
     /**
@@ -195,7 +195,7 @@
     /**
      * Size of the socket poller.
      */
-    protected int pollerSize = 16 * 1024;
+    protected int pollerSize = 8 * 1024;
     public void setPollerSize(int pollerSize) { this.pollerSize = pollerSize; }
     public int getPollerSize() { return pollerSize; }
 
@@ -269,7 +269,7 @@
     /**
      * Timeout on first request read before going to the poller, in ms.
      */
-    protected int firstReadTimeout = 100;
+    protected int firstReadTimeout = -1;
     public int getFirstReadTimeout() { return firstReadTimeout; }
     public void setFirstReadTimeout(int firstReadTimeout) { 
this.firstReadTimeout = firstReadTimeout; }
 
@@ -310,31 +310,49 @@
 
 
     /**
-     * Number of keepalive sockets.
+     * Acceptor thread count.
      */
-    protected int keepAliveCount = 0;
-    public int getKeepAliveCount() { return keepAliveCount; }
+    protected int acceptorThreadCount = 0;
+    public void setAcceptorThreadCount(int acceptorThreadCount) { 
this.acceptorThreadCount = acceptorThreadCount; }
+    public int getAcceptorThreadCount() { return acceptorThreadCount; }
 
 
     /**
-     * Number of sendfile sockets.
+     * Sendfile thread count.
+     */
+    protected int sendfileThreadCount = 0;
+    public void setSendfileThreadCount(int sendfileThreadCount) { 
this.sendfileThreadCount = sendfileThreadCount; }
+    public int getSendfileThreadCount() { return sendfileThreadCount; }
+
+
+    /**
+     * Poller thread count.
      */
-    protected int sendfileCount = 0;
-    public int getSendfileCount() { return sendfileCount; }
+    protected int pollerThreadCount = 0;
+    public void setPollerThreadCount(int pollerThreadCount) { 
this.pollerThreadCount = pollerThreadCount; }
+    public int getPollerThreadCount() { return pollerThreadCount; }
 
 
     /**
      * The socket poller.
      */
-    protected Poller poller = null;
-    public Poller getPoller() { return poller; }
+    protected Poller[] pollers = null;
+    protected int pollerRoundRobin = 0;
+    public Poller getPoller() {
+        pollerRoundRobin = (pollerRoundRobin + 1) % pollers.length;
+        return pollers[pollerRoundRobin];
+    }
 
 
     /**
      * The static file sender.
      */
-    protected Sendfile sendfile = null;
-    public Sendfile getSendfile() { return sendfile; }
+    protected Sendfile[] sendfiles = null;
+    protected int sendfileRoundRobin = 0;
+    public Sendfile getSendfile() {
+        sendfileRoundRobin = (sendfileRoundRobin + 1) % sendfiles.length;
+        return sendfiles[sendfileRoundRobin];
+    }
 
 
     /**
@@ -458,6 +476,38 @@
 
 
     /**
+     * Number of keepalive sockets.
+     */
+    public int getKeepAliveCount() {
+        if (pollers == null) {
+            return 0;
+        } else {
+            int keepAliveCount = 0;
+            for (int i = 0; i < pollers.length; i++) {
+                keepAliveCount += pollers[i].getKeepAliveCount();
+            }
+            return keepAliveCount;
+        }
+    }
+
+
+    /**
+     * Number of sendfile sockets.
+     */
+    public int getSendfileCount() {
+        if (sendfiles == null) {
+            return 0;
+        } else {
+            int sendfileCount = 0;
+            for (int i = 0; i < sendfiles.length; i++) {
+                sendfileCount += sendfiles[i].getSendfileCount();
+            }
+            return sendfileCount;
+        }
+    }
+
+
+    /**
      * Return the amount of threads that are managed by the pool.
      *
      * @return the amount of threads that are managed by the pool
@@ -554,6 +604,35 @@
             useSendfile = false;
         }
 
+        // Initialize thread count defaults for acceptor, poller and sendfile
+        if (acceptorThreadCount == 0) {
+            // FIXME: Default to one per CPU ?
+            acceptorThreadCount = 1;
+        }
+        if (pollerThreadCount == 0) {
+            if ((OS.IS_WIN32 || OS.IS_WIN64) && (pollerSize > 1024)) {
+                // The maximum per poller to get reasonable performance is 1024
+                pollerThreadCount = pollerSize / 1024;
+                // Adjust poller size so that it won't reach the limit
+                pollerSize = pollerSize - (pollerSize % 1024);
+            } else {
+                // No explicit poller size limitation
+                pollerThreadCount = 1;
+            }
+        }
+        if (sendfileThreadCount == 0) {
+            if ((OS.IS_WIN32 || OS.IS_WIN64) && (sendfileSize > 1024)) {
+                // The maximum per poller to get reasonable performance is 1024
+                sendfileThreadCount = sendfileSize / 1024;
+                // Adjust poller size so that it won't reach the limit
+                sendfileSize = sendfileSize - (sendfileSize % 1024);
+            } else {
+                // No explicit poller size limitation
+                // FIXME: Default to one per CPU ?
+                sendfileThreadCount = 1;
+            }
+        }
+        
         // Delay accepting of new connections until data is available
         // Only Linux kernels 2.4 + have that implemented
         // on other platforms this call is noop and will return APR_ENOTIMPL.
@@ -627,27 +706,35 @@
             workers = new WorkerStack(maxThreads);
 
             // Start acceptor thread
-            acceptorThread = new Thread(new Acceptor(), getName() + 
"-Acceptor");
-            acceptorThread.setPriority(threadPriority);
-            acceptorThread.setDaemon(daemon);
-            acceptorThread.start();
+            for (int i = 0; i < acceptorThreadCount; i++) {
+                Thread acceptorThread = new Thread(new Acceptor(), getName() + 
"-Acceptor-" + i);
+                acceptorThread.setPriority(threadPriority);
+                acceptorThread.setDaemon(daemon);
+                acceptorThread.start();
+            }
 
             // Start poller thread
-            poller = new Poller();
-            poller.init();
-            pollerThread = new Thread(poller, getName() + "-Poller");
-            pollerThread.setPriority(threadPriority);
-            pollerThread.setDaemon(true);
-            pollerThread.start();
+            pollers = new Poller[pollerThreadCount];
+            for (int i = 0; i < pollerThreadCount; i++) {
+                pollers[i] = new Poller();
+                pollers[i].init();
+                Thread pollerThread = new Thread(pollers[i], getName() + 
"-Poller-" + i);
+                pollerThread.setPriority(threadPriority);
+                pollerThread.setDaemon(true);
+                pollerThread.start();
+            }
 
             // Start sendfile thread
             if (useSendfile) {
-                sendfile = new Sendfile();
-                sendfile.init();
-                sendfileThread = new Thread(sendfile, getName() + "-Sendfile");
-                sendfileThread.setPriority(threadPriority);
-                sendfileThread.setDaemon(true);
-                sendfileThread.start();
+                sendfiles = new Sendfile[sendfileThreadCount];
+                for (int i = 0; i < sendfileThreadCount; i++) {
+                    sendfiles[i] = new Sendfile();
+                    sendfiles[i].init();
+                    Thread sendfileThread = new Thread(sendfiles[i], getName() 
+ "-Sendfile-" + i);
+                    sendfileThread.setPriority(threadPriority);
+                    sendfileThread.setDaemon(true);
+                    sendfileThread.start();
+                }
             }
         }
     }
@@ -682,13 +769,16 @@
         if (running) {
             running = false;
             unlockAccept();
-            poller.destroy();
+            for (int i = 0; i < pollers.length; i++) {
+                pollers[i].destroy();
+            }
+            pollers = null;
             if (useSendfile) {
-                sendfile.destroy();
+                for (int i = 0; i < sendfiles.length; i++) {
+                    sendfiles[i].destroy();
+                }
+                sendfiles = null;
             }
-            acceptorThread = null;
-            pollerThread = null;
-            sendfileThread = null;
         }
     }
 
@@ -959,6 +1049,9 @@
 
         protected long[] addS;
         protected int addCount = 0;
+        
+        protected int keepAliveCount = 0;
+        public int getKeepAliveCount() { return keepAliveCount; }
 
         /**
          * Create the poller. With some versions of APR, the maximum poller 
size will
@@ -966,7 +1059,7 @@
          */
         protected void init() {
             pool = Pool.create(serverSockPool);
-            int size = pollerSize;
+            int size = pollerSize / pollerThreadCount;
             serverPollset = allocatePoller(size, pool, soTimeout);
             if (serverPollset == 0 && size > 1024) {
                 size = 1024;
@@ -1270,6 +1363,9 @@
         protected long pool = 0;
         protected long[] desc;
         protected HashMap sendfileData;
+        
+        protected int sendfileCount;
+        public int getSendfileCount() { return sendfileCount; }
 
         protected ArrayList addS;
 
@@ -1279,8 +1375,8 @@
          */
         protected void init() {
             pool = Pool.create(serverSockPool);
-            int size = sendfileSize;
-            sendfilePollset = allocatePoller(sendfileSize, pool, soTimeout);
+            int size = sendfileSize / sendfileThreadCount;
+            sendfilePollset = allocatePoller(size, pool, soTimeout);
             if (sendfilePollset == 0 && size > 1024) {
                 size = 1024;
                 sendfilePollset = allocatePoller(size, pool, soTimeout);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to