Leistungsoptimierung
Übersicht
Die Leistung von PlantPulse wird durch schrittweise Beseitigung von Engpässen in den einzelnen Schichten Erfassung → Verarbeitung → Speicherung verbessert. Es geht nicht darum, alle Werte wahllos zu erhöhen, sondern darum, nur die Engpässe anhand von Überwachungskennzahlen zu beheben.
3 Optimierungsprinzipien
- Immer nur eine Änderung: Mehrere Variablen gleichzeitig zu ändern macht es unmöglich zu erkennen, welche Änderung wirksam war.
- Datengestützt: Testsystem + realistische Last reproduzieren, dann ändern.
- Dokumentieren: Änderungen, Werte vorher/nachher in GitOps / Betriebs-Wiki festhalten.
Empfohlene Ausgangspunkte nach Umgebung
| Umgebung | CPU | RAM | Laufwerk | Empf. PIPELINE_THREADS | Empf. PIPELINE_RATELIMIT |
|---|---|---|---|---|---|
| Entwicklung | 16 vCPU | 64 GB | SSD | 16 | 10.000 MPS |
| Standard | 32 vCPU | 128 GB | NVMe | 36 | 40.000 MPS |
| Große Skalierung | 48+ vCPU | 200+ GB | NVMe | 64 | 100.000 MPS |
Kernoptimierungsvariablen aus env.sh
Die am häufigsten angepassten Variablen in Produktionsumgebungen befinden sich in bin/env.sh und compose/docker-compose.yml → Umgebungsvariablen-Referenz
| Variable | Standard | Auswirkung |
|---|---|---|
PP_CLUSTER_CORES | 30 | Spark / Analysen-Kern-Zuteilung |
PP_CLUSTER_MEMORY_BY_CORE | 2G | Spark Executor-Speicher/Kern |
PP_LANG / PP_TZ | ko / Asia/Seoul | JVM-Locale / Zeitzone |
JAVA_TOOL_OPTIONS | Auto-generiert | Automatisch auf alle untergeordneten JVMs angewendet |
Detaillierte Variablen siehe Eigenschaften-Referenz, Index env.sh-Variablen.
Messinstrumente
Werkzeuge zum Vergleich vor und nach der Optimierung:
cd /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin
./status.sh # 모듈별 CPU / 메모리(PSS) 요약
./ops-check.sh # 헬스 + critical log
./memory-check.sh # 모듈별 메모리 상세
./memory-rank.sh # 메모리 순위
./pd node tpstats # Cassandra 스레드풀
./pd node compactionstats # Cassandra 컴팩션
./pd node table-stats # 테이블별 통계
./pd node proxyhistograms # Cassandra 지연 히스토그램
# Kafka consumer lag
./pd node topic
# JVM Heap / GC (컨테이너 진입 후)
./shell.sh
jcmd <pid> GC.heap_info
jcmd <pid> GC.heap_dump /tmp/heap.hprof
Externe Überwachung (Grafana / Prometheus) siehe Systemüberwachung.
Hinweis: Die optimalen Werte für die Leistungsoptimierung hängen von der Serverkonfiguration, dem Datenumfang und dem Nutzungsmuster ab. Wir empfehlen, mit den folgenden Empfehlungen zu beginnen und die Einstellungen schrittweise anhand der Überwachungsergebnisse anzupassen.
Engine-Pipeline-Optimierung
Konfigurationsdatei: plantpulse-server/config/plantpulse-engine.properties
Hinweis: Die Engine-Pipeline ist der kritische Pfad, auf dem von Sensoren erfasste Daten verarbeitet werden. Über diese Einstellung können Sie die Verarbeitungsgeschwindigkeit und -kapazität der Daten steuern.
Kernparameter der Pipeline
| Parameter | Standard | Beschreibung | Optimierungsleitfaden |
|---|---|---|---|
engine.pipeline.threads | 36 | Anzahl Pipeline-Worker-Threads | Wir empfehlen 70–80 % der Host-Kerne (validierte Umgebung 48 Kerne → 36) |
engine.pipeline.ratelimit | 40000 | Max. Nachrichten pro Sekunde (MPS) | Passen Sie an die Serverkonfiguration an |
engine.pipeline.queue.size | 1200000 | Max. Pipeline-Warteschlangengröße | Passen Sie an verfügbaren Speicher an |
engine.pipeline.queue.o3.delay | 50 | Out-of-Order-Verzögerungsbehandlung (ms) | Passen Sie an Netzwerkverzögerung an |
engine.pipeline.task.mode | SINGLE | Pipeline-Task-Modus | SINGLE oder MULTI |
engine.async.parallelism | 256 | Asynchrone parallele Verarbeitung | Wir empfehlen das 8–16-fache der CPU-Kerne |
Streaming-Konfiguration
| Parameter | Standard | Beschreibung |
|---|---|---|
engine.stream.processor | DIRECT | Stream-Verarbeitungsmodus |
engine.streaming.messaging.warning.ms | 5000 | Schwellenwert für Nachrichtenverzögerungswarnung (ms) |
engine.streaming.messaging.timeout.ms | 10000 | Nachrichten-Timeout (ms) |
engine.streaming.messaging.timeout.store.type | FILE_QUEUE | Speichermethode für Timeout-Nachrichten |
engine.streaming.messaging.timeout.recovery.type | DB | Timeout-Wiederherstellungsmethode |
Arbeits-Threads
| Parameter | Standard | Beschreibung |
|---|---|---|
engine.job.thread.asset | 8 | Anzahl Asset-Arbeits-Threads |
engine.job.thread.point | 8 | Anzahl Punkt-Arbeits-Threads |
Empfohlene Einstellungen nach Serverkonfiguration
Die folgende Tabelle zeigt empfohlene Werte basierend auf der Serverkonfiguration. Konsultieren Sie die Spalte, die Ihrer Produktionsumgebung entspricht.
| Element | Klein (8 Kerne / 64 GB) | Mittel (16 Kerne / 128 GB) | Groß (32 Kerne / 256 GB) |
|---|---|---|---|
pipeline.threads | 16 | 36 | 64 |
pipeline.ratelimit | 10.000 | 40.000 | 100.000 |
pipeline.queue.size | 300.000 | 1.200.000 | 3.000.000 |
async.parallelism | 64 | 256 | 512 |
Cassandra-Optimierung
Konfigurationsdatei: plantpulse-storage/db/cassandra/conf/cassandra.yaml
Hinweis: Cassandra ist die Kernlösung für die Speicherung von Zeitreihendaten. Mit zunehmender Datengröße hat die Cassandra-Optimierung erhebliche Auswirkungen auf die Gesamtleistung. Wir empfehlen, die Einstellungen an Ihre Produktionsumgebung anzupassen.
Speichereinstellung
| Parameter | Standard | Beschreibung |
|---|---|---|
memtable_heap_space | 2GiB | Memtable-Heap-Speicher |
memtable_offheap_space | 2GiB | Memtable-Off-Heap-Speicher |
memtable_allocation_type | offheap_objects | Speicher-Zuordnungstyp |
memtable_flush_writers | 8 | Anzahl Memtable-Flush-Threads |
Parallelitätseinstellung
| Parameter | Standard | Beschreibung | Optimierungsleitfaden |
|---|---|---|---|
concurrent_reads | 256 | Parallele Lese-Threads | Wir empfehlen Datenträgeranzahl × 16 |
concurrent_writes | 256 | Parallele Schreib-Threads | Wir empfehlen CPU-Kerne × 8 |
concurrent_counter_writes | 256 | Parallele Counter-Schreibvorgänge | Gleich wie concurrent_writes setzen |
concurrent_compactors | 8 | Parallele Compaction-Threads | Wir empfehlen 1/4 der CPU-Kerne |
Commit-Log
| Parameter | Standard | Beschreibung |
|---|---|---|
commitlog_sync | periodic | Synchronisierungsmodus |
commitlog_sync_period | 10000ms | Synchronisierungszyklus |
commitlog_segment_size | 320MiB | Segmentgröße |
commitlog_total_space | 32GiB | Gesamter Commit-Log-Speicherplatz |
Timeouts
| Parameter | Standard | Beschreibung |
|---|---|---|
read_request_timeout | 10000ms | Lese-Timeout |
write_request_timeout | 60000ms | Schreib-Timeout |
counter_write_request_timeout | 10000ms | Counter-Schreib-Timeout |
cas_contention_timeout | 1000ms | CAS-Konkurrenz-Timeout |
truncate_request_timeout | 600000ms | Truncate-Timeout |
Compaction-Strategie
PlantPulse verwendet UCS (Unified Compaction Strategy), die für Zeitreihendaten-Charakteristiken geeignet ist.
Hinweis: Compaction ist der Prozess, bei dem Cassandra Datendateien (SSTables) auf der Festplatte bereinigt und zusammenführt. Eine angepasste Compaction-Strategie spart Speicherplatz und verbessert die Leseleistung.
storage.properties Einstellung:
| Parameter | Standard | Beschreibung |
|---|---|---|
storage.table.compaction.strategy | UCS | Compaction-Strategie (UCS oder TWCS) |
storage.table.compaction.strategy.ucs.scailing_parameter | T8 | Skalierungsparameter |
storage.table.compaction.strategy.ucs.min_sstable_size | 128MiB | Min. SSTable-Größe |
storage.table.compaction.strategy.ucs.target_sstable_size | 512MiB | Ziel-SSTable-Größe |
storage.table.compaction.strategy.ucs.base_shard_count | 8 | Basis-Shard-Anzahl |
storage.table.compaction.strategy.ucs.max_sstables_to_compact | 6 | Max. Compaction-SSTables |
Komprimierung
Verwendet ZStandard-Wörterbuch-Komprimierung:
| Parameter | Standard | Beschreibung |
|---|---|---|
storage.compression.zstd.type | ZstdDictionaryCompressor | Komprimierungsmethode |
storage.compression.zstd.level | 3 | Komprimierungsstufe (1–22, höher = bessere Komprimierung, aber langsamere Verarbeitung) |
TTL (Aufbewahrungsdauer)
TTL pro Tabelle wird in storage.properties gesetzt. Daten werden nach Ablauf der TTL automatisch gelöscht. Passen Sie dies an Ihre Datenschutzanforderungen an.
| Parameter | Standard | Beschreibung |
|---|---|---|
storage.tag.point.ttl | 62 (Tage) | Tag-Punkt Original-Daten |
storage.tag.point.map.ttl | 1 (Tage) | Tag-Punkt-Map |
storage.tag.point.sampling.ttl | 93 (Tage) | Sampling-Daten |
storage.tag.point.snapshot.ttl | 93 (Tage) | Snapshot-Daten |
storage.tag.point.aggregation.ttl | 93 (Tage) | Aggregations-Daten |
storage.tag.point.archive.ttl | 365 (Tage) | Archiv-Daten |
storage.tag.blob.ttl | 93 (Tage) | BLOB-Daten |
storage.asset.data.ttl | 10 (Tage) | Asset-Daten |
storage.asset.data.sampling.ttl | 31 (Tage) | Asset-Sampling-Daten |
Cassandra-Leistungsprüfungs-Befehle
Mit den folgenden Befehlen können Sie den Cassandra-Leistungsstatus überprüfen:
# 컴팩션 상태 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node compactionstats
# 테이블별 통계 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node table-stats
# 테이블 히스토그램 (읽기/쓰기 지연)
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node table-histograms
# SSTable 크기 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node sstable-size
# 스레드풀 통계
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node tpstats
Spark-Optimierung
Konfigurationsdatei: plantpulse-analytics/spark/conf/spark-defaults.conf
Hinweis: Apache Spark ist eine verteilte Verarbeitungs-Engine für die Analyse großer Datenmengen. Beachten Sie die folgenden Einstellungen, um die Geschwindigkeit und Stabilität von Analysevorgängen zu verbessern.
Ressourcen-Zuteilung
| Parameter | Standard | Beschreibung |
|---|---|---|
spark.cores.max | 16 | Max. Spark-Kerne |
spark.driver.cores | 2 | Treiber-Kernnummer |
spark.driver.memory | 4g | Treiber-Speicher |
spark.executor.cores | 1 | Executor-Kernnummer |
spark.executor.memory | 2G | Executor-Speicher |
spark.executor.memoryOverhead | 2g | Executor-Overhead-Speicher |
Dynamische Zuteilung
| Parameter | Standard | Beschreibung |
|---|---|---|
spark.dynamicAllocation.enabled | true | Dynamische Executor-Zuteilung |
spark.dynamicAllocation.minExecutors | 2 | Min. Executor-Anzahl |
spark.dynamicAllocation.maxExecutors | 16 | Max. Executor-Anzahl |
spark.dynamicAllocation.executorIdleTimeout | 30 | Leerlauf-Executor-Freigabezeit (Sekunden) |
Shuffle und Parallelität
| Parameter | Standard | Beschreibung |
|---|---|---|
spark.default.parallelism | 64 | Standard-Parallelität |
spark.sql.shuffle.partitions | 128 | SQL-Shuffle-Partitionsanzahl |
spark.sql.adaptive.enabled | true | Adaptive Query Execution |
spark.sql.adaptive.coalescePartitions.enabled | true | Auto-Partition-Merge |
JVM-Einstellung
Sowohl Spark-Treiber als auch Executor verwenden ZGC:
-XX:+UseZGC
-XX:+AlwaysPreTouch
-XX:+UseTLAB
-XX:+ResizeTLAB
-XX:+DisableExplicitGC
S3 (MinIO) Integrations-Einstellung
| Parameter | Standard | Beschreibung |
|---|---|---|
spark.hadoop.fs.s3a.connection.maximum | 400 | Max. S3-Verbindungen |
spark.hadoop.fs.s3a.threads.max | 128 | Max. S3-Threads |
spark.hadoop.fs.s3a.max.total.tasks | 1024 | Max. async. Vorgänge |
spark.hadoop.fs.s3a.fast.upload | true | Schneller Upload aktiviert |
spark.hadoop.fs.s3a.fast.upload.buffer | disk | Upload-Puffer-Typ |
spark.hadoop.fs.s3a.block.size | 128MB | S3-Blockgröße |
Iceberg-Einstellung
| Parameter | Standard | Beschreibung |
|---|---|---|
spark.sql.iceberg.write.target-file-size-bytes | 256MB | Zieldateigröße |
spark.sql.iceberg.column-stats.enabled | true | Spalten-Statistiken aktiviert |
spark.sql.iceberg.vectorization.enabled | true | Vektorisiertes Lesen aktiviert |
spark.sql.iceberg.manifest.merge.enabled | true | Manifest-Merge |
spark.sql.parquet.compression.codec | zstd | Parquet-Komprimierungs-Codec |
Kafka-Optimierung
Konfigurationsdatei: plantpulse-messaging/kafka/config/server.properties
Hinweis: Kafka ist der Message-Broker, der Sensordaten in Echtzeit überträgt. Wenn der Datenumfang zunimmt, können Sie Kafka-Einstellungen anpassen, um die Verarbeitungsleistung zu verbessern.
Kerneinstellungen
| Parameter | Standard | Beschreibung |
|---|---|---|
num.network.threads | 3 | Netzwerk-Verarbeitungs-Threads |
num.io.threads | 8 | I/O-Verarbeitungs-Threads |
socket.send.buffer.bytes | 102400 | Socket-Sendepuffer |
socket.receive.buffer.bytes | 102400 | Socket-Empfangspuffer |
socket.request.max.bytes | 104857600 | Max. Anfragegröße (100 MB) |
num.partitions | 1 | Standard-Partitionsanzahl |
log.retention.hours | 168 | Log-Aufbewahrungsdauer (7 Tage) |
log.segment.bytes | 1073741824 | Log-Segmentgröße (1 GB) |
Optimierung für große Datenmengen
Wenn Sie große Mengen IoT-Daten verarbeiten, konsultieren Sie die folgenden Einstellungen:
# 파티션 수 증가 (메시지 병렬 처리)
num.partitions=4
# I/O 스레드 증가
num.io.threads=16
# 네트워크 스레드 증가
num.network.threads=8
# 소켓 버퍼 증가
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
Messaging-Konfiguration
Konfigurationsdatei: plantpulse-server/config/plantpulse-mq.properties
Kafka DDS Topics
| Parameter | Standard | Zweck |
|---|---|---|
mq.dds.kafka.topic.tag.point | pp-tag-point | Tag-Punkt-Wert |
mq.dds.kafka.topic.tag.alarm | pp-tag-alarm | Tag-Alarm |
mq.dds.kafka.topic.asset.data | pp-asset-data | Asset-Daten |
mq.dds.kafka.topic.asset.alarm | pp-asset-alarm | Asset-Alarm |
mq.dds.kafka.topic.asset.event | pp-asset-event | Asset-Ereignis |
mq.dds.kafka.topic.asset.aggregation | pp-asset-aggregation | Asset-Aggregation |
mq.dds.kafka.topic.domain.changed.event | pp-domain-changed-event | Metadaten-Änderung |
MQTT DDS Topics
| Parameter | Standard | Zweck |
|---|---|---|
mq.dds.mqtt.topic.tag.point | tag/point/{tag_id} | Tag-spezifischer Punkt-Wert |
mq.dds.mqtt.topic.tag.alarm | tag/alarm/{tag_id} | Tag-spezifischer Alarm |
mq.dds.mqtt.topic.asset.data | asset/data/{asset_id} | Asset-spezifische Daten |
mq.dds.mqtt.topic.asset.command | asset/command/{asset_id} | Asset-Steuerbefehle |
Scheduler-Konfiguration
Konfigurationsdatei: quartz.properties (interner Klassenpath-Resource der Web-App — kein Externalisierungsziel)
| Parameter | Standard | Beschreibung |
|---|---|---|
org.quartz.threadPool.threadCount | 8 | Scheduler-Thread-Anzahl |
org.quartz.threadPool.threadPriority | 5 | Thread-Priorität |
Mail- / Benachrichtigungseinstellung
Konfigurationsdatei: plantpulse-server/config/plantpulse-mail.properties
| Parameter | Standard | Beschreibung |
|---|---|---|
mail.smtp.host | 192.168.0.41 | SMTP-Serveradresse |
mail.smtp.port | 25 | SMTP-Port |
mail.smtp.auth | false | Authentifizierung verwenden |
mail.smtp.starttls.enable | false | TLS verwenden |
Anwendungs-Konfiguration
Datei application.properties wurde in Version 2026.06 entfernt. Konsolen-Betriebseinstellungen wie Design / Startseite werden jetzt in der Konsole unter System > Konfiguration (PostgreSQL mm_config Tabelle) verwaltet, und alarm.duplicate.check.minutes (Doppelte Alarm-Prüfintervall, Minuten) wurde zu plantpulse-server/config/plantpulse-engine.properties migriert.
Leistungs-Engpass-Diagnose
Wenn Leistungsprobleme auftreten, konsultieren Sie die folgenden symptomspezifischen Diagnoseverfahren und Lösungen.
1. Pipeline-Warteschlangen-Rückstau
Symptom: Die Pipeline-Warteschlange wächst kontinuierlich
# Grafana 대시보드에서 "파이프라인 대기 큐" 패널을 확인해 주세요
# 또는 JMX: pipeline.queue.size 값을 확인해 주세요
Lösung:
- Erhöhen Sie den Wert von
engine.pipeline.threads - Erhöhen Sie den Wert von
engine.pipeline.ratelimit - Überprüfen Sie die Cassandra-Schreibleistung
2. Cassandra-Schreibverzögerung
Symptom: Schreib-Timeout oder WriteTimeoutException tritt auf
# 컴팩션 상태 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node compactionstats
# Memtable 플러시
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node flush
Lösung:
- Erhöhen Sie den Wert von
concurrent_writes - Erhöhen Sie den Wert von
compaction_throughput - Überprüfen Sie die Festplatte I/O-Leistung (SSD empfohlen)
3. Unzureichender Speicher
Symptom: JVM GC tritt häufig auf oder OutOfMemoryError tritt auf
Lösung:
- Erhöhen Sie in
bin/start.shdes Service-Moduls den Wert von-Xmx - Senken Sie den Wert von
engine.pipeline.queue.sizeum Speichernutzung zu sparen - Deaktivieren Sie unnötige Caches
4. Netzwerkverzögerung
Symptom: Datenempfangsverzögerung nimmt zu (überprüfbar im Grafana-Panel „Netzwerkverzögerung")
Lösung:
- Überprüfen Sie den Netzwerkzustand zwischen OPC-Server und PlantPulse
- Passen Sie den Wert von
engine.streaming.messaging.timeout.msan - Überprüfen Sie das MQTT-QoS-Niveau
Technischer Support
Anfragen zur Leistungsoptimierung: webmaster@kopens.com