jar包

Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.7.RELEASE

springboot-tomcat配置参数_sed

设置参数

springboot-tomcat配置参数_java_02

  配置
server:
  port: 10000
  servlet:
    context-path: /
  tomcat:
    max-connections: 10 #默认10000  接受和处理的最大连接数
    accept-count: 100  #默认100
    #默认10 初始化时创建的线程数 适当增大一些,以便应对突然增长的访问量100
    min-spare-threads: 10 
    max-threads: 200 #默认200  最大并发数
accept-count

org.apache.tomcat.util.net.NioEndpoint


# accept-count 其实就是backlog

serverSock = ServerSocketChannel.open();
            socketProperties.setProperties(serverSock.socket());
            InetSocketAddress addr = new InetSocketAddress(getAddress(), getPortWithOffset());
            serverSock.socket().bind(addr,getAcceptCount());

 

max-connections
public class LimitLatch {

    private static final Log log = LogFactory.getLog(LimitLatch.class);

    private class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = 1L;

        public Sync() {
        }

        @Override
        protected int tryAcquireShared(int ignored) {
            long newCount = count.incrementAndGet();
            if (!released && newCount > limit) {
                // Limit exceeded
                count.decrementAndGet();
                return -1;
            } else {
                return 1;
            }
        }

        @Override
        protected boolean tryReleaseShared(int arg) {
            count.decrementAndGet();
            return true;
        }
    }

    private final Sync sync;
    private final AtomicLong count;
    private volatile long limit;
    private volatile boolean released = false;

    /**
     * Instantiates a LimitLatch object with an initial limit.
     * @param limit - maximum number of concurrent acquisitions of this latch
     */
    public LimitLatch(long limit) {
        this.limit = limit;
        this.count = new AtomicLong(0);
        this.sync = new Sync();
    }

    /**
     * Returns the current count for the latch
     * @return the current count for latch
     */
    public long getCount() {
        return count.get();
    }

    /**
     * Obtain the current limit.
     * @return the limit
     */
    public long getLimit() {
        return limit;
    }


    /**
     * Sets a new limit. If the limit is decreased there may be a period where
     * more shares of the latch are acquired than the limit. In this case no
     * more shares of the latch will be issued until sufficient shares have been
     * returned to reduce the number of acquired shares of the latch to below
     * the new limit. If the limit is increased, threads currently in the queue
     * may not be issued one of the newly available shares until the next
     * request is made for a latch.
     *
     * @param limit The new limit
     */
    public void setLimit(long limit) {
        this.limit = limit;
    }


    /**
     * Acquires a shared latch if one is available or waits for one if no shared
     * latch is current available.
     * @throws InterruptedException If the current thread is interrupted
     */
    public void countUpOrAwait() throws InterruptedException {
        if (log.isDebugEnabled()) {
            log.debug("Counting up["+Thread.currentThread().getName()+"] latch="+getCount());
        }
        sync.acquireSharedInterruptibly(1);
    }

    /**
     * Releases a shared latch, making it available for another thread to use.
     * @return the previous counter value
     */
    public long countDown() {
        sync.releaseShared(0);
        long result = getCount();
        if (log.isDebugEnabled()) {
            log.debug("Counting down["+Thread.currentThread().getName()+"] latch="+result);
    }
        return result;
    }

    /**
     * Releases all waiting threads and causes the {@link #limit} to be ignored
     * until {@link #reset()} is called.
     * @return <code>true</code> if release was done
     */
    public boolean releaseAll() {
        released = true;
        return sync.releaseShared(0);
    }

    /**
     * Resets the latch and initializes the shared acquisition counter to zero.
     * @see #releaseAll()
     */
    public void reset() {
        this.count.set(0);
        released = false;
    }

    /**
     * Returns <code>true</code> if there is at least one thread waiting to
     * acquire the shared lock, otherwise returns <code>false</code>.
     * @return <code>true</code> if threads are waiting
     */
    public boolean hasQueuedThreads() {
        return sync.hasQueuedThreads();
    }

    /**
     * Provide access to the list of threads waiting to acquire this limited
     * shared latch.
     * @return a collection of threads
     */
    public Collection<Thread> getQueuedThreads() {
        return sync.getQueuedThreads();
    }
}

org.apache.tomcat.util.net.AbstractEndpoint

private int maxConnections = 10000;
    public void setMaxConnections(int maxCon) {
        this.maxConnections = maxCon;
        LimitLatch latch = this.connectionLimitLatch;
        if (latch != null) {
            // Update the latch that enforces this
            if (maxCon == -1) {
                releaseConnectionLatch();
            } else {
                latch.setLimit(maxCon);
            }
        } else if (maxCon > 0) {
            initializeConnectionLatch();
        }
    }


 

min-spare-threads

如果是ThreadPoolExecutor,那就是corePoolSize

private int minSpareThreads = 10;
public void setMinSpareThreads(int minSpareThreads) {
	this.minSpareThreads = minSpareThreads;
	Executor executor = this.executor;
	if (internalExecutor && executor instanceof java.util.concurrent.ThreadPoolExecutor) {
		// The internal executor should always be an instance of
		// j.u.c.ThreadPoolExecutor but it may be null if the endpoint is
		// not running.
		// This check also avoids various threading issues.
		((java.util.concurrent.ThreadPoolExecutor) executor).setCorePoolSize(minSpareThreads);
	}
}

max-threads
如果是ThreadPoolExecutor,那就是maximumPoolSize
private int maxThreads = 200;
public void setMaxThreads(int maxThreads) {
	this.maxThreads = maxThreads;
	Executor executor = this.executor;
	if (internalExecutor && executor instanceof java.util.concurrent.ThreadPoolExecutor) {
		// The internal executor should always be an instance of
		// j.u.c.ThreadPoolExecutor but it may be null if the endpoint is
		// not running.
		// This check also avoids various threading issues.
		((java.util.concurrent.ThreadPoolExecutor) executor).setMaximumPoolSize(maxThreads);
	}
}

 

例子1
server:
  port: 10000
  servlet:
    context-path: /
  tomcat:
    max-connections: 10 #默认10000
    accept-count: 5  #默认100

max-connections配置10,accept-count配置5,这样就是tomcat最多可以接收15个connection,

现在jmeter发送20个请求,则有5个连接被拒绝

springboot-tomcat配置参数_java_03