← Назад к вопросам

Можно ли управлять допустимым количеством запросов для 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 ошибок
Можно ли управлять допустимым количеством запросов для Tomcat? | PrepBro