Author: fhanik Date: Mon Aug 6 16:19:37 2007 New Revision: 563331 URL: http://svn.apache.org/viewvc?view=rev&rev=563331 Log: Improve poller timeout handling to not waste cycles
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?view=diff&rev=563331&r1=563330&r2=563331 ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Mon Aug 6 16:19:37 2007 @@ -1582,8 +1582,11 @@ long now = System.currentTimeMillis(); //don't process timeouts too frequently, but if the selector simply timed out //then we can check timeouts to avoid gaps - if ( (now < nextExpiration) && (keyCount>0 || hasEvents) && (!close) ) return; - nextExpiration = now + (long)socketProperties.getSoTimeout(); + if ( ((keyCount>0 || hasEvents) ||(now < nextExpiration)) && (!close) ) { + return; + } + long prevExp = nextExpiration; + nextExpiration = now + socketProperties.getTimeoutInterval(); //timeout Set<SelectionKey> keys = selector.keys(); int keycount = 0; @@ -1618,7 +1621,9 @@ cancelledKey(key, SocketStatus.ERROR,false); } }//for - if ( log.isDebugEnabled() ) log.debug("Poller processed "+keycount+" keys through timeout"); + if ( log.isDebugEnabled() ) log.debug("timeout completed: keycount="+keycount+"; now="+now+"; nextExpiration="+prevExp+"; "+ + "keyCount="+keyCount+"; hasEvents="+hasEvents +"; eval="+( (now < prevExp) && (keyCount>0 || hasEvents) && (!close) )); + } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java?view=diff&rev=563331&r1=563330&r2=563331 ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java Mon Aug 6 16:19:37 2007 @@ -1,354 +1,370 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.tomcat.util.net; - -import java.net.Socket; -import java.net.SocketException; -/** - * Properties that can be set in the <Connector> element - * in server.xml. All properties are prefixed with "socket." - * and are currently only working for the Nio connector - * - * @author Filip Hanik - */ -public class SocketProperties { - /** - * Enable/disable key cache, this bounded cache stores - * KeyAttachment objects to reduce GC - * Default is 500 - * -1 is unlimited - * 0 is disabled - */ - protected int keyCache = 500; - - /** - * Enable/disable socket processor cache, this bounded cache stores - * SocketProcessor objects to reduce GC - * Default is 500 - * -1 is unlimited - * 0 is disabled - */ - protected int processorCache = 500; - - - - /** - * Enable/disable poller event cache, this bounded cache stores - * PollerEvent objects to reduce GC for the poller - * Default is 500 - * -1 is unlimited - * 0 is disabled - * >0 the max number of objects to keep in cache. - */ - protected int eventCache = 500; - - - /** - * Enable/disable direct buffers for the network buffers - * Default value is enabled - */ - protected boolean directBuffer = false; - /** - * Socket receive buffer size in bytes (SO_RCVBUF) - * Default value is 25188 - */ - protected int rxBufSize = 25188; - /** - * Socket send buffer size in bytes (SO_SNDBUF) - * Default value is 43800 - */ - protected int txBufSize = 43800; - - /** - * The application read buffer size in bytes. - * Default value is rxBufSize - */ - protected int appReadBufSize = 8192; - - /** - * The application write buffer size in bytes - * Default value is txBufSize - */ - protected int appWriteBufSize = 8192; - - /** - * NioChannel pool size for the endpoint, - * this value is how many channels - * -1 means unlimited cached, 0 means no cache - * Default value is 500 - */ - protected int bufferPool = 500; - - - /** - * Buffer pool size in bytes to be cached - * -1 means unlimited, 0 means no cache - * Default value is 100MB (1024*1024*100 bytes) - */ - protected int bufferPoolSize = 1024*1024*100; - - /** - * TCP_NO_DELAY option, default is true - */ - protected boolean tcpNoDelay = true; - /** - * SO_KEEPALIVE option, default is false - */ - protected boolean soKeepAlive = false; - /** - * OOBINLINE option, default is true - */ - protected boolean ooBInline = true; - /** - * SO_REUSEADDR option, default is true - */ - protected boolean soReuseAddress = true; - /** - * SO_LINGER option, default is true, paired with the <code>soLingerTime</code> value - */ - protected boolean soLingerOn = true; - /** - * SO_LINGER option, default is 25 seconds. - */ - protected int soLingerTime = 25; - /** - * SO_TIMEOUT option, default is 5000 milliseconds - */ - protected int soTimeout = 5000; - /** - * Traffic class option, value between 0 and 255 - * IPTOS_LOWCOST (0x02) - * IPTOS_RELIABILITY (0x04) - * IPTOS_THROUGHPUT (0x08) - * IPTOS_LOWDELAY (0x10) - * Default value is 0x04 | 0x08 | 0x010 - */ - protected int soTrafficClass = 0x04 | 0x08 | 0x010; - /** - * Performance preferences according to - * http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) - * Default value is 1 - */ - protected int performanceConnectionTime = 1; - /** - * Performance preferences according to - * http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) - * Default value is 0 - */ - protected int performanceLatency = 0; - /** - * Performance preferences according to - * http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) - * Default value is 1 - */ - protected int performanceBandwidth = 1; - private Socket properties; - - public void setProperties(Socket socket) throws SocketException{ - socket.setReceiveBufferSize(rxBufSize); - socket.setSendBufferSize(txBufSize); - socket.setOOBInline(ooBInline); - socket.setKeepAlive(soKeepAlive); - socket.setPerformancePreferences(performanceConnectionTime,performanceLatency,performanceBandwidth); - socket.setReuseAddress(soReuseAddress); - socket.setSoLinger(soLingerOn,soLingerTime); - socket.setSoTimeout(soTimeout); - socket.setTcpNoDelay(tcpNoDelay); - socket.setTrafficClass(soTrafficClass); - } - - public boolean getDirectBuffer() { - return directBuffer; - } - - public boolean getOoBInline() { - return ooBInline; - } - - public int getPerformanceBandwidth() { - return performanceBandwidth; - } - - public int getPerformanceConnectionTime() { - return performanceConnectionTime; - } - - public int getPerformanceLatency() { - return performanceLatency; - } - - public int getRxBufSize() { - return rxBufSize; - } - - public boolean getSoKeepAlive() { - return soKeepAlive; - } - - public boolean getSoLingerOn() { - return soLingerOn; - } - - public int getSoLingerTime() { - return soLingerTime; - } - - public boolean getSoReuseAddress() { - return soReuseAddress; - } - - public int getSoTimeout() { - return soTimeout; - } - - public int getSoTrafficClass() { - return soTrafficClass; - } - - public boolean getTcpNoDelay() { - return tcpNoDelay; - } - - public int getTxBufSize() { - return txBufSize; - } - - public int getBufferPool() { - return bufferPool; - } - - public int getBufferPoolSize() { - return bufferPoolSize; - } - - public int getEventCache() { - return eventCache; - } - - public int getKeyCache() { - return keyCache; - } - - public Socket getProperties() { - return properties; - } - - public int getAppReadBufSize() { - return appReadBufSize; - } - - public int getAppWriteBufSize() { - return appWriteBufSize; - } - - public int getProcessorCache() { - return processorCache; - } - - public int getDirectBufferPool() { - return bufferPool; - } - - public void setPerformanceConnectionTime(int performanceConnectionTime) { - this.performanceConnectionTime = performanceConnectionTime; - } - - public void setTxBufSize(int txBufSize) { - this.txBufSize = txBufSize; - } - - public void setTcpNoDelay(boolean tcpNoDelay) { - this.tcpNoDelay = tcpNoDelay; - } - - public void setSoTrafficClass(int soTrafficClass) { - this.soTrafficClass = soTrafficClass; - } - - public void setSoTimeout(int soTimeout) { - this.soTimeout = soTimeout; - } - - public void setSoReuseAddress(boolean soReuseAddress) { - this.soReuseAddress = soReuseAddress; - } - - public void setSoLingerTime(int soLingerTime) { - this.soLingerTime = soLingerTime; - } - - public void setSoKeepAlive(boolean soKeepAlive) { - this.soKeepAlive = soKeepAlive; - } - - public void setRxBufSize(int rxBufSize) { - this.rxBufSize = rxBufSize; - } - - public void setPerformanceLatency(int performanceLatency) { - this.performanceLatency = performanceLatency; - } - - public void setPerformanceBandwidth(int performanceBandwidth) { - this.performanceBandwidth = performanceBandwidth; - } - - public void setOoBInline(boolean ooBInline) { - this.ooBInline = ooBInline; - } - - public void setDirectBuffer(boolean directBuffer) { - this.directBuffer = directBuffer; - } - - public void setSoLingerOn(boolean soLingerOn) { - this.soLingerOn = soLingerOn; - } - - public void setBufferPool(int bufferPool) { - this.bufferPool = bufferPool; - } - - public void setBufferPoolSize(int bufferPoolSize) { - this.bufferPoolSize = bufferPoolSize; - } - - public void setEventCache(int eventCache) { - this.eventCache = eventCache; - } - - public void setKeyCache(int keyCache) { - this.keyCache = keyCache; - } - - public void setAppReadBufSize(int appReadBufSize) { - this.appReadBufSize = appReadBufSize; - } - - public void setAppWriteBufSize(int appWriteBufSize) { - this.appWriteBufSize = appWriteBufSize; - } - - public void setProcessorCache(int processorCache) { - this.processorCache = processorCache; - } - - public void setDirectBufferPool(int directBufferPool) { - this.bufferPool = directBufferPool; - } - +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomcat.util.net; + +import java.net.Socket; +import java.net.SocketException; +/** + * Properties that can be set in the <Connector> element + * in server.xml. All properties are prefixed with "socket." + * and are currently only working for the Nio connector + * + * @author Filip Hanik + */ +public class SocketProperties { + /** + * Enable/disable key cache, this bounded cache stores + * KeyAttachment objects to reduce GC + * Default is 500 + * -1 is unlimited + * 0 is disabled + */ + protected int keyCache = 500; + + /** + * Enable/disable socket processor cache, this bounded cache stores + * SocketProcessor objects to reduce GC + * Default is 500 + * -1 is unlimited + * 0 is disabled + */ + protected int processorCache = 500; + + + + /** + * Enable/disable poller event cache, this bounded cache stores + * PollerEvent objects to reduce GC for the poller + * Default is 500 + * -1 is unlimited + * 0 is disabled + * >0 the max number of objects to keep in cache. + */ + protected int eventCache = 500; + + + /** + * Enable/disable direct buffers for the network buffers + * Default value is enabled + */ + protected boolean directBuffer = false; + /** + * Socket receive buffer size in bytes (SO_RCVBUF) + * Default value is 25188 + */ + protected int rxBufSize = 25188; + /** + * Socket send buffer size in bytes (SO_SNDBUF) + * Default value is 43800 + */ + protected int txBufSize = 43800; + + /** + * The application read buffer size in bytes. + * Default value is rxBufSize + */ + protected int appReadBufSize = 8192; + + /** + * The application write buffer size in bytes + * Default value is txBufSize + */ + protected int appWriteBufSize = 8192; + + /** + * NioChannel pool size for the endpoint, + * this value is how many channels + * -1 means unlimited cached, 0 means no cache + * Default value is 500 + */ + protected int bufferPool = 500; + + + /** + * Buffer pool size in bytes to be cached + * -1 means unlimited, 0 means no cache + * Default value is 100MB (1024*1024*100 bytes) + */ + protected int bufferPoolSize = 1024*1024*100; + + /** + * TCP_NO_DELAY option, default is true + */ + protected boolean tcpNoDelay = true; + /** + * SO_KEEPALIVE option, default is false + */ + protected boolean soKeepAlive = false; + /** + * OOBINLINE option, default is true + */ + protected boolean ooBInline = true; + /** + * SO_REUSEADDR option, default is true + */ + protected boolean soReuseAddress = true; + /** + * SO_LINGER option, default is true, paired with the <code>soLingerTime</code> value + */ + protected boolean soLingerOn = true; + /** + * SO_LINGER option, default is 25 seconds. + */ + protected int soLingerTime = 25; + /** + * SO_TIMEOUT option, default is 5000 milliseconds + */ + protected int soTimeout = 5000; + /** + * Traffic class option, value between 0 and 255 + * IPTOS_LOWCOST (0x02) + * IPTOS_RELIABILITY (0x04) + * IPTOS_THROUGHPUT (0x08) + * IPTOS_LOWDELAY (0x10) + * Default value is 0x04 | 0x08 | 0x010 + */ + protected int soTrafficClass = 0x04 | 0x08 | 0x010; + /** + * Performance preferences according to + * http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) + * Default value is 1 + */ + protected int performanceConnectionTime = 1; + /** + * Performance preferences according to + * http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) + * Default value is 0 + */ + protected int performanceLatency = 0; + /** + * Performance preferences according to + * http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int) + * Default value is 1 + */ + protected int performanceBandwidth = 1; + + /** + * The minimum frequency of the timeout interval to avoid the + * poller going boinkers during high traffic + */ + protected long timeoutInterval = 1000; + + + private Socket properties; + + public void setProperties(Socket socket) throws SocketException{ + socket.setReceiveBufferSize(rxBufSize); + socket.setSendBufferSize(txBufSize); + socket.setOOBInline(ooBInline); + socket.setKeepAlive(soKeepAlive); + socket.setPerformancePreferences(performanceConnectionTime,performanceLatency,performanceBandwidth); + socket.setReuseAddress(soReuseAddress); + socket.setSoLinger(soLingerOn,soLingerTime); + socket.setSoTimeout(soTimeout); + socket.setTcpNoDelay(tcpNoDelay); + socket.setTrafficClass(soTrafficClass); + } + + public boolean getDirectBuffer() { + return directBuffer; + } + + public boolean getOoBInline() { + return ooBInline; + } + + public int getPerformanceBandwidth() { + return performanceBandwidth; + } + + public int getPerformanceConnectionTime() { + return performanceConnectionTime; + } + + public int getPerformanceLatency() { + return performanceLatency; + } + + public int getRxBufSize() { + return rxBufSize; + } + + public boolean getSoKeepAlive() { + return soKeepAlive; + } + + public boolean getSoLingerOn() { + return soLingerOn; + } + + public int getSoLingerTime() { + return soLingerTime; + } + + public boolean getSoReuseAddress() { + return soReuseAddress; + } + + public int getSoTimeout() { + return soTimeout; + } + + public int getSoTrafficClass() { + return soTrafficClass; + } + + public boolean getTcpNoDelay() { + return tcpNoDelay; + } + + public int getTxBufSize() { + return txBufSize; + } + + public int getBufferPool() { + return bufferPool; + } + + public int getBufferPoolSize() { + return bufferPoolSize; + } + + public int getEventCache() { + return eventCache; + } + + public int getKeyCache() { + return keyCache; + } + + public Socket getProperties() { + return properties; + } + + public int getAppReadBufSize() { + return appReadBufSize; + } + + public int getAppWriteBufSize() { + return appWriteBufSize; + } + + public int getProcessorCache() { + return processorCache; + } + + public long getTimeoutInterval() { + return timeoutInterval; + } + + public int getDirectBufferPool() { + return bufferPool; + } + + public void setPerformanceConnectionTime(int performanceConnectionTime) { + this.performanceConnectionTime = performanceConnectionTime; + } + + public void setTxBufSize(int txBufSize) { + this.txBufSize = txBufSize; + } + + public void setTcpNoDelay(boolean tcpNoDelay) { + this.tcpNoDelay = tcpNoDelay; + } + + public void setSoTrafficClass(int soTrafficClass) { + this.soTrafficClass = soTrafficClass; + } + + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } + + public void setSoReuseAddress(boolean soReuseAddress) { + this.soReuseAddress = soReuseAddress; + } + + public void setSoLingerTime(int soLingerTime) { + this.soLingerTime = soLingerTime; + } + + public void setSoKeepAlive(boolean soKeepAlive) { + this.soKeepAlive = soKeepAlive; + } + + public void setRxBufSize(int rxBufSize) { + this.rxBufSize = rxBufSize; + } + + public void setPerformanceLatency(int performanceLatency) { + this.performanceLatency = performanceLatency; + } + + public void setPerformanceBandwidth(int performanceBandwidth) { + this.performanceBandwidth = performanceBandwidth; + } + + public void setOoBInline(boolean ooBInline) { + this.ooBInline = ooBInline; + } + + public void setDirectBuffer(boolean directBuffer) { + this.directBuffer = directBuffer; + } + + public void setSoLingerOn(boolean soLingerOn) { + this.soLingerOn = soLingerOn; + } + + public void setBufferPool(int bufferPool) { + this.bufferPool = bufferPool; + } + + public void setBufferPoolSize(int bufferPoolSize) { + this.bufferPoolSize = bufferPoolSize; + } + + public void setEventCache(int eventCache) { + this.eventCache = eventCache; + } + + public void setKeyCache(int keyCache) { + this.keyCache = keyCache; + } + + public void setAppReadBufSize(int appReadBufSize) { + this.appReadBufSize = appReadBufSize; + } + + public void setAppWriteBufSize(int appWriteBufSize) { + this.appWriteBufSize = appWriteBufSize; + } + + public void setProcessorCache(int processorCache) { + this.processorCache = processorCache; + } + + public void setTimeoutInterval(long timeoutInterval) { + this.timeoutInterval = timeoutInterval; + } + + public void setDirectBufferPool(int directBufferPool) { + this.bufferPool = directBufferPool; + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]