- Causas Raíz de Cuellos de Botella en Kafka
El rendimiento de Kafka depende críticamente de tres recursos: memoria, disco y red. Errores comunes incluyen:
1.1 Configuración Incorrecta de Memoria
Kafka utiliza principalmente el PageCache del SO para almacenar mensajes, no el heap de la JVM. Un heap excesivo reduce memoria disponible para PageCache y causa pausas prolongadas de GC.
graph LR
Productor-->|envía|Broker
Broker-->|escribe|PageCache
PageCache-->|persiste|Archivos[Archivos .log]
Broker-->|metadatos|Heap[JVM Heap]
style PageCache fill:#ccffcc,stroke:#393
style Heap fill:#ffe6e6,stroke:#f66
1.2 Limitaciones de Disco
Kafka usa escritura secuencial. Para réplicas y compactación, priorice discos con alto throughput (ej. SATA SSD) sobre alta IOPS.
1.3 Problemas de Red
Configuraciones TCP inadecuadas causan problemas como acumulación de conexiones TIME_WAIT y cuelllos de botella en ventanas de recepción.
- Optimización de Memoria
2.1 Configuarción de Heap JVM
| RAM Física | Heap Recomendado | Notas |
|---|---|---|
| 32 GB | 8-12 GB | Mantener ≤32GB para usar Compressed Oops |
| 64 GB | 12-16 GB | |
| 128 GB+ | 16-24 GB |
#!/bin/bash
KAFKA_HEAP_OPTS="-Xmx16g -Xms16g"
KAFKA_JVM_PERFORMANCE_OPTS="
-server
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
"
bin/kafka-server-start.sh config/server.properties
2.2 Maximización de PageCache
# /etc/sysctl.conf
vm.dirty_ratio = 80
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 12000
vm.swappiness = 1
- Optimización de Disco
3.1 Sistema de Archivos y Montaje
# /etc/fstab
/dev/nvme0n1 /datos-kafka xfs noatime,nodiratime,largeio 0 0
3.2 Arquitectura de Almacenamiento
- Discos dedicados para datos de Kafka
- RAID 10 para redundancia
- Evitar LVM y particiones lógicas
- Optimización de Red
4.1 Balanceo de Interrupciones
echo "0-3" > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
4.2 Parámetros TCP
net.core.rmem_max = 134217728
net.ipv4.tcp_rmem = 4096 65536 134217728
net.ipv4.tcp_tw_reuse = 1
4.3 Configuración de Broker
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=1048576
- Configuraciones Clave de Broker
log.segment.bytes=1073741824
min.insync.replicas=2
compression.type=producer
- Monnitoreo Esencial
| Métrica JMX | Umbral Crítico |
|---|---|
| NetworkProcessorAvgIdlePercent | < 20% |
| RequestHandlerAvgIdlePercent | < 30% |
- Herramientas de Prueba
7.1 Productor de Alto Rendimiento
public class ProductorAltoRendimiento {
public static void main(String[] args) {
Properties config = new Properties();
config.put("bootstrap.servers", "localhost:9092");
config.put("batch.size", 65536);
Producer<string string=""> productor = new KafkaProducer<>(config);
for (int i = 0; i < 1_000_000; i++) {
productor.send(new ProducerRecord<>("prueba", "clave", "valor"));
}
productor.close();
}
}
</string>
7.2 Consumidor de Baja Latencia
public class ConsumidorBajaLatencia {
public static void main(String[] args) {
Properties config = new Properties();
config.put("bootstrap.servers", "localhost:9092");
config.put("fetch.max.wait.ms", 10);
KafkaConsumer<string string=""> consumidor = new KafkaConsumer<>(config);
consumidor.subscribe(Arrays.asList("prueba"));
while (true) {
ConsumerRecords<string string=""> registros = consumidor.poll(Duration.ofMillis(100));
}
}
}
</string></string>
- Errores Comunes
- Habilitar log.flush: Reduce throughput 10x
- Heap JVM excesivo: Reduce memoria para PageCache
- Buffer TCP pequeño: Limita throughput de red