23년 5월에 작성한 글입니다.
org.apache.tomcat.util.thread.ThreadPoolExecutor
)server.tomcat.threads.max
: 최대 스레드 갯수server.tomcat.threads.min-spare
: 최소 스레드 갯수org.apache.tomcat.util.thread.ThreadPoolExecutor
을 사용합니다.org.apache.tomcat.util.threads.TaskQueue
통해 관리합니다.TaskQueue
은 LinkedBlockingQueue
을 상속하여 요청량이 스레드 갯수를 넘어도 문제없이 큐에 요청을 저장합니다.server.tomcat.max-connections
: 최대 커넥션 갯수server.tomcat.accept-count
: 연결 요청에 대한 최대 대기열 길이// server.tomcat.max-connections
public class Acceptor<U> implements Runnable {
public void run() {
...
// 커넥션 갯수 카운트 업
// 최대 커넥션 수(max-connections) 를 넘는 경우 대기
endpoint.countUpOrAwaitConnection();
if (endpoint.isPaused()) {
continue;
}
U socket = null;
try {
// 커넥션 생성
socket = endpoint.serverSocketAccept();
} catch (Exception ioe) {
// 커넥션 생성 실패시, 카운트 다운
endpoint.countDownConnection();
if (endpoint.isRunning()) {
errorDelay = handleExceptionWithDelay(errorDelay);
throw ioe;
} else {
break;
}
}
}
}
// server.tomcat.accept-count
public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel> {
protected void initServerSocket() throws Exception {
...
else if (getUnixDomainSocketPath() != null) {
SocketAddress sa = JreCompat.getInstance().getUnixDomainSocketAddress(getUnixDomainSocketPath());
serverSock = JreCompat.getInstance().openUnixDomainServerSocketChannel();
// 소켓을 로컬 주소에 바인드
// 최대 대기열 길이를 두번째 인자로 넘김
serverSock.bind(sa, getAcceptCount());
...
}
}
}