← Назад к вопросам
Можно ли управлять допустимым количеством запросов для Tomcat?
2.3 Middle🔥 71 комментариев
#Docker, Kubernetes и DevOps
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Да, можно управлять допустимым количеством запросов для Tomcat
Томкат предоставляет множество параметров для контроля количества одновременных и общих запросов через конфигурацию Connectors и Thread Pools.
Основные параметры управления запросами
1. Connector параметры (server.xml)
<!-- conf/server.xml -->
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
<!-- Максимальное количество одновременных соединений -->
maxConnections="10000"
<!-- Размер пула потоков (рабочих потоков) -->
minSpareThreads="50"
maxThreads="300"
<!-- Максимум соединений в очереди -->
acceptCount="100"
/>
Параметры Connector
-
maxConnections — максимальное количество одновременных TCP соединений
- По умолчанию: 10000 для BIO, 8192 для NIO
- Когда достигнут лимит — новые соединения отклоняются
-
acceptCount — размер очереди для принятия соединений
- По умолчанию: 100
- Когда очередь переполнена — соединения отклоняются (Connection Refused)
-
maxThreads — максимальное количество рабочих потоков
- По умолчанию: 200
- Каждый поток обслуживает один запрос
-
minSpareThreads — минимальное количество готовых потоков
- По умолчанию: 10
- Потоки создаются заранее для быстрого ответа
2. Spring Boot конфигурация (application.properties)
# Максимальное количество потоков
server.tomcat.threads.max=300
# Минимальное количество готовых потоков
server.tomcat.threads.min-spare=20
# Максимальное количество соединений
server.tomcat.max-connections=10000
# Размер очереди для принятия соединений
server.tomcat.accept-count=100
# Timeout для соединения (в мс)
server.tomcat.connection-timeout=20000
# URI кодирование
server.tomcat.uri-encoding=UTF-8
# Максимальный размер запроса (байт)
server.tomcat.max-http-post-size=2097152 # 2MB
# Максимальное количество параметров запроса
server.tomcat.max-http-form-post-size=2097152
# Размер буфера для HTTP запроса
server.tomcat.max-http-header-size=8192
3. YAML конфигурация (application.yml)
server:
tomcat:
# Потоки
threads:
max: 300
min-spare: 20
# Соединения
max-connections: 10000
accept-count: 100
connection-timeout: 20000
# Размеры
max-http-header-size: 8192
max-http-post-size: 2097152
# Производительность
keep-alive-timeout: 60000 # 60 сек
# Thread pool
threads-per-core: 2 # количество потоков на ядро процессора
4. Программная конфигурация (Java код)
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TomcatConfiguration {
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
TomcatServletWebServerFactory factory =
new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(connector -> {
// Максимальные потоки
connector.setMaxThreads(300);
// Минимальные запасные потоки
connector.setMinSpareThreads(20);
// Максимальные соединения
connector.setMaxConnections(10000);
// Очередь принятия соединений
connector.setAcceptCount(100);
// Timeout соединения (мс)
connector.setConnectionTimeout(20000);
// Максимум HTTP заголовков
connector.setMaxHttpHeaderSize(8192);
});
return factory;
}
}
5. Мониторинг текущих запросов
import org.apache.catalina.manager.ManagerServlet;
import org.springframework.boot.actuate.endpoint.web.annotation.RestControllerEndpoint;
import org.springframework.stereotype.Component;
@Component
@RestControllerEndpoint(id = "tomcat-stats")
public class TomcatStatsEndpoint {
@GetMapping(path = "/status")
public Map<String, Object> getTomcatStatus() {
Map<String, Object> stats = new HashMap<>();
// Получить информацию о текущих соединениях
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
try {
ObjectName name = new ObjectName(
"Catalina:type=ThreadPool,name=\"http-nio-8080\""
);
int currentThreadCount =
(Integer) mBeanServer.getAttribute(name, "currentThreadCount");
int currentThreadsBusy =
(Integer) mBeanServer.getAttribute(name, "currentThreadsBusy");
int maxThreads =
(Integer) mBeanServer.getAttribute(name, "maxThreads");
stats.put("currentThreads", currentThreadCount);
stats.put("busyThreads", currentThreadsBusy);
stats.put("maxThreads", maxThreads);
stats.put("availableThreads", currentThreadCount - currentThreadsBusy);
} catch (Exception e) {
e.printStackTrace();
}
return stats;
}
}
6. Стратегии управления нагрузкой
Стратегия 1: Консервативная (много потоков)
server.tomcat.threads.max=500
server.tomcat.threads.min-spare=100
server.tomcat.max-connections=20000
server.tomcat.accept-count=200
Стратегия 2: Сбалансированная (стандартная)
server.tomcat.threads.max=300
server.tomcat.threads.min-spare=50
server.tomcat.max-connections=10000
server.tomcat.accept-count=100
Стратегия 3: Агрессивная (мало потоков, быстрый отказ)
server.tomcat.threads.max=100
server.tomcat.threads.min-spare=10
server.tomcat.max-connections=1000
server.tomcat.accept-count=50
7. Обработка переполнения
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class TomcatOverloadHandler {
@ExceptionHandler(RejectedExecutionException.class)
public ResponseEntity<?> handleOverload(RejectedExecutionException e) {
return ResponseEntity
.status(HttpStatus.SERVICE_UNAVAILABLE)
.body(new ErrorResponse("Server is overloaded. Please try again later."));
}
}
8. Формула для расчёта правильных параметров
Оптимальное количество потоков = (Ядра процессора) × 2-4
Если запросы блокирующие (wait на БД, IO):
Потоки = Ядра × (1 + Wait_Time / Compute_Time)
Пример:
- 8-ядерный процессор
- Среднее время ожидания на БД: 100ms
- Среднее время вычисления: 20ms
- Потоки = 8 × (1 + 100/20) = 8 × 6 = 48 потоков
9. Тестирование под нагрузкой
# Используй Apache Bench (ab)
ab -n 10000 -c 100 http://localhost:8080/api/test
# Или JMeter для более сложных сценариев
# jmeter -n -t test_plan.jmx -l results.jtl
10. Мониторинг JVM и потоков
public class SystemMonitor {
public static void printThreadStats() {
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
System.out.println("Всего потоков: " + threadBean.getThreadCount());
System.out.println("Пиковое количество: " + threadBean.getPeakThreadCount());
System.out.println("Потоков демонов: " + threadBean.getDaemonThreadCount());
}
public static void printMemoryStats() {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
System.out.println("Heap used: " + heapUsage.getUsed() / 1024 / 1024 + "MB");
System.out.println("Heap max: " + heapUsage.getMax() / 1024 / 1024 + "MB");
}
}
Заключение
Томкат позволяет управлять запросами через:
- maxConnections — ограничение одновременных TCP соединений
- maxThreads — ограничение рабочих потоков
- acceptCount — размер очереди соединений
- minSpareThreads —预подготовленные потоки
Правильная конфигурация критична для:
- Высокопроизводительных систем
- Эффективного использования ресурсов
- Graceful degradation под нагрузкой
- Предотвращения OutOfMemory ошибок