Zum Hauptinhalt springen

Leistungsoptimierung

Überblick​

Die Leistung von PlantPulse wird verbessert, indem Engpässe in jeder Ebene der Kette Erfassung → Verarbeitung → Speicherung nacheinander beseitigt werden. Es geht nicht darum, einfach alle Werte zu erhöhen, sondern darum, anhand der Monitoring-Kennzahlen nur die Engpassstellen anzupassen.

3 Tuning-Prinzipien

  1. Nur eine Änderung pro Mal: Wenn mehrere Variablen gleichzeitig geändert werden, lässt sich nicht feststellen, welche Änderung den Effekt erzielt hat.
  2. Auf Basis von Betriebsdaten: Änderungen erst nach Reproduktion des realen Traffics in der stage-Umgebung vornehmen.
  3. Änderungen protokollieren: Geänderte Werte und Kennzahlen vor/nach der Änderung im GitOps / Betriebs-Wiki festhalten.

Empfohlene Ausgangswerte pro Betriebsumgebung​

UmgebungCPUSpeicherFestplatteEmpfohlene PIPELINE_THREADSEmpfohlene PIPELINE_RATELIMIT
Entwicklung16 vCPU64 GBSSD1610.000 MPS
Standard32 vCPU128 GBNVMe3640.000 MPS
Große Umgebung48+ vCPU200+ GBNVMe64100.000 MPS

Kern-Tuning-Variablen basierend auf env.sh​

Die in einer Betriebsumgebung am häufigsten angepassten Variablen werden in bin/env.sh und compose/docker-compose.yml des Hosts verwaltet → Referenz für Umgebungsvariablen

VariableStandardAuswirkung
PP_CLUSTER_CORES30Zuweisung für Spark / Analyse-Kern
PP_CLUSTER_MEMORY_BY_CORE2GSpark Executor Speicher/Kern
PP_LANG / PP_TZko / Asia/SeoulJVM Locale / Zeitzone
JAVA_TOOL_OPTIONSAutomatisch generiertAutomatische Anwendung auf alle Child-JVMs

Detaillierte Variablen finden Sie im env.sh-Variablenindex der Eigenschaften-Referenz.

Messwerkzeuge​

Werkzeuge zum Vergleich vor und nach dem Tuning:

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

Informationen zum externen Monitoring (Grafana / Prometheus) finden Sie auf der Seite System-Monitoring.

Hinweis: Die Leistungsoptimierung kann je nach Serverausstattung, Datenmenge und Nutzungsmuster unterschiedliche optimale Werte erfordern. Beginnen Sie mit den unten empfohlenen Einstellungen und passen Sie diese schrittweise an, während Sie die Monitoring-Ergebnisse überprüfen.

Engine-Pipeline-Tuning​

Konfigurationsdatei: plantpulse-server/config/plantpulse-engine.properties

Hinweis: Die Engine-Pipeline ist der Kernpfad, über den die von den Sensoren erfassten Daten verarbeitet werden. Mit diesen Einstellungen können Sie die Verarbeitungsgeschwindigkeit und -kapazität der Daten steuern.

Kernparameter der Pipeline​

ParameterStandardwertBeschreibungTuning-Anleitung
engine.pipeline.threads36Anzahl der Pipeline-Worker-Threads70–80 % der Host-Kernanzahl wird empfohlen (Testumgebung 48 Kerne → 36)
engine.pipeline.ratelimit40000Maximale Anzahl zu verarbeitender Nachrichten pro Sekunde (MPS)Passen Sie sie an die Serverausstattung an
engine.pipeline.queue.size1200000Maximale Größe der Pipeline-QueuePassen Sie sie an den verfügbaren Speicher an
engine.pipeline.queue.o3.delay50Verzögerungsverarbeitung bei Out-of-Order (ms)Passen Sie sie an die Netzwerkverzögerung an
engine.pipeline.task.modeSINGLEPipeline-Task-ModusSINGLE oder MULTI
engine.async.parallelism256Anzahl der asynchronen ParallelverarbeitungenDas 8- bis 16-fache der CPU-Kerne wird empfohlen

Streaming-Einstellungen​

ParameterStandardwertBeschreibung
engine.stream.processorDIRECTStream-Verarbeitungsmodus
engine.streaming.messaging.warning.ms5000Warnschwelle für Nachrichtenverzögerung (ms)
engine.streaming.messaging.timeout.ms10000Nachrichten-Timeout (ms)
engine.streaming.messaging.timeout.store.typeFILE_QUEUESpeichermethode für Timeout-Nachrichten
engine.streaming.messaging.timeout.recovery.typeDBWiederherstellungsmethode bei Timeout

Arbeits-Threads​

ParameterStandardwertBeschreibung
engine.job.thread.asset8Anzahl der Asset-Arbeits-Threads
engine.job.thread.point8Anzahl der Punkt-Arbeits-Threads

Empfohlene Einstellungen nach Spezifikation​

Die folgende Tabelle zeigt empfohlene Einstellungswerte basierend auf der Serverausstattung. Verwenden Sie die Spalte, die der Ausstattung Ihrer Betriebsumgebung entspricht.

ElementKlein (8 Kerne/64 GB)Mittel (16 Kerne/128 GB)Groß (32 Kerne/256 GB)
pipeline.threads163664
pipeline.ratelimit10.00040.000100.000
pipeline.queue.size300.0001.200.0003.000.000
async.parallelism64256512

Aster TSDB-Tuning​

Konfigurationsdatei: plantpulse-storage/db/cassandra/conf/cassandra.yaml

Hinweis: Aster TSDB ist die Kerndatenbank für die Speicherung von Zeitreihendaten. Je größer die Datenmenge wird, desto größer ist der Einfluss des Aster-TSDB-Tunings auf die Gesamtleistung. Daher wird empfohlen, es an die Betriebsumgebung anzupassen.

Speichereinstellungen​

ParameterStandardwertBeschreibung
memtable_heap_space2GiBMemtable-Heap-Speicher
memtable_offheap_space2GiBMemtable-Off-Heap-Speicher
memtable_allocation_typeoffheap_objectsSpeicherzuordnungstyp
memtable_flush_writers8Anzahl der Memtable-Flush-Threads

Parallelitätseinstellungen​

ParameterStandardwertBeschreibungTuning-Anleitung
concurrent_reads256Parallele Lese-ThreadsDas 16-fache der Anzahl der Festplatten wird empfohlen
concurrent_writes256Parallele Schreib-ThreadsDas 8-fache der CPU-Kerne wird empfohlen
concurrent_counter_writes256Parallele Zähler-SchreibvorgängeAuf denselben Wert wie concurrent_writes setzen
concurrent_compactors8Parallele Kompaktierungs-Threads1/4 der CPU-Kernanzahl wird empfohlen

Commit-Log​

ParameterStandardwertBeschreibung
commitlog_syncperiodicSynchronisationsmethode
commitlog_sync_period10000msSynchronisationsintervall
commitlog_segment_size320MiBSegmentgröße
commitlog_total_space32GiBGesamter Commit-Log-Speicherplatz

Timeouts​

ParameterStandardwertBeschreibung
read_request_timeout10000msLese-Timeout
write_request_timeout60000msSchreib-Timeout
counter_write_request_timeout10000msZähler-Schreib-Timeout
cas_contention_timeout1000msCAS-Konflikt-Timeout
truncate_request_timeout600000msTruncate-Timeout

Kompaktierungsstrategie​

PlantPulse verwendet eine UCS (Unified Compaction Strategy), die auf die Eigenschaften von Zeitreihendaten abgestimmt ist.

Hinweis: Kompaktierung ist der Vorgang, bei dem Aster TSDB die auf der Festplatte gespeicherten Datendateien (SSTables) bereinigt und zusammenführt. Eine geeignete Kompaktierungsstrategie kann Speicherplatz sparen und die Lesleistung verbessern.

storage.properties Einstellungen:

ParameterStandardwertBeschreibung
storage.table.compaction.strategyUCSKompaktierungsstrategie (UCS oder TWCS)
storage.table.compaction.strategy.ucs.scailing_parameterT8Skalierungsparameter
storage.table.compaction.strategy.ucs.min_sstable_size128MiBMinimale SSTable-Größe
storage.table.compaction.strategy.ucs.target_sstable_size512MiBZiel-SSTable-Größe
storage.table.compaction.strategy.ucs.base_shard_count8Anzahl der Basis-Shards
storage.table.compaction.strategy.ucs.max_sstables_to_compact6Maximale Anzahl zu kompaktierender SSTables

Kompression​

Es wird eine ZStandard-Wörterbuchkompression verwendet:

ParameterStandardwertBeschreibung
storage.compression.zstd.typeZstdDictionaryCompressorKompressionsmethode
storage.compression.zstd.level3Kompressionsstufe (1–22, höher = bessere Kompression, aber langsamere Geschwindigkeit)

TTL (Datenaufbewahrungsdauer)​

Die TTL pro Tabelle wird in storage.properties festgelegt. Nach Ablauf der TTL werden die entsprechenden Daten automatisch gelöscht. Bitte stellen Sie die TTL gemäß Ihren Datenaufbewahrungsanforderungen ein.

ParameterStandardwertBeschreibung
storage.tag.point.ttl62 (Tage)Originaldaten der Tag-Punkte
storage.tag.point.map.ttl1 (Tage)Tag-Punkt-Map
storage.tag.point.sampling.ttl93 (Tage)Abtastdaten
storage.tag.point.snapshot.ttl93 (Tage)Snapshot-Daten
storage.tag.point.aggregation.ttl93 (Tage)Aggregierte Daten
storage.tag.point.archive.ttl365 (Tage)Archivdaten
storage.tag.blob.ttl93 (Tage)BLOB-Daten
storage.asset.data.ttl10 (Tage)Asset-Daten
storage.asset.data.sampling.ttl31 (Tage)Asset-Abtastdaten

Befehle zur Leistungsprüfung von Aster TSDB​

Mit den folgenden Befehlen können Sie den Leistungsstatus von Aster TSDB prü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-Tuning​

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 Analyseaufträgen zu erhöhen.

Ressourcenzuweisung​

ParameterStandardwertBeschreibung
spark.cores.max16Maximale Anzahl der von Spark genutzten Kerne
spark.driver.cores2Anzahl der Treiber-Kerne
spark.driver.memory4gTreiber-Speicher
spark.executor.cores1Anzahl der Executor-Kerne
spark.executor.memory2GExecutor-Speicher
spark.executor.memoryOverhead2gExecutor-Overhead-Speicher

Dynamische Zuweisung​

ParameterStandardwertBeschreibung
spark.dynamicAllocation.enabledtrueDynamische Executor-Zuweisung
spark.dynamicAllocation.minExecutors2Minimale Anzahl der Executors
spark.dynamicAllocation.maxExecutors16Maximale Anzahl der Executors
spark.dynamicAllocation.executorIdleTimeout30Zeit bis zur Freigabe inaktiver Executors (Sekunden)

Shuffle und Parallelität​

ParameterStandardwertBeschreibung
spark.default.parallelism64Standardparallelität
spark.sql.shuffle.partitions128Anzahl der SQL-Shuffle-Partitionen
spark.sql.adaptive.enabledtrueAdaptive Query Execution
spark.sql.adaptive.coalescePartitions.enabledtrueAutomatische Partitionszusammenführung

JVM-Einstellungen​

Sowohl Spark-Treiber als auch Executors verwenden ZGC:

-XX:+UseZGC
-XX:+AlwaysPreTouch
-XX:+UseTLAB
-XX:+ResizeTLAB
-XX:+DisableExplicitGC

S3- (RustFS-) Integrationseinstellungen​

ParameterStandardwertBeschreibung
spark.hadoop.fs.s3a.connection.maximum400Maximale Anzahl der S3-Verbindungen
spark.hadoop.fs.s3a.threads.max128Maximale Anzahl der S3-Threads
spark.hadoop.fs.s3a.max.total.tasks1024Maximale Anzahl asynchroner Aufgaben
spark.hadoop.fs.s3a.fast.uploadtrueSchneller Upload aktiviert
spark.hadoop.fs.s3a.fast.upload.bufferdiskUpload-Puffertyp
spark.hadoop.fs.s3a.block.size128MBS3-Blockgröße

Iceberg-Einstellungen​

ParameterStandardwertBeschreibung
spark.sql.iceberg.write.target-file-size-bytes256MBZieldateigröße
spark.sql.iceberg.column-stats.enabledtrueSpaltenstatistik aktiviert
spark.sql.iceberg.vectorization.enabledtrueVektorisierte Lesevorgänge aktiviert
spark.sql.iceberg.manifest.merge.enabledtrueManifest-Zusammenführung
spark.sql.parquet.compression.codeczstdParquet-Kompressionscodec

Kafka-Tuning​

Konfigurationsdatei: plantpulse-messaging/kafka/config/server.properties

Hinweis: Kafka ist ein Nachrichtenbroker, der Sensordaten in Echtzeit überträgt. Bei großen Datenmengen kann die Verarbeitungsleistung durch Anpassung der Kafka-Einstellungen erhöht werden.

Kerneinstellungen​

ParameterStandardwertBeschreibung
num.network.threads3Threads für Netzwerkverarbeitung
num.io.threads8Threads für I/O-Verarbeitung
socket.send.buffer.bytes102400Sende-Puffer für Sockets
socket.receive.buffer.bytes102400Empfangs-Puffer für Sockets
socket.request.max.bytes104857600Maximale Anforderungsgröße (100 MB)
num.partitions1Standardanzahl der Partitionen
log.retention.hours168Aufbewahrungsdauer des Logs (7 Tage)
log.segment.bytes1073741824Log-Segmentgröße (1 GB)

Tuning für große Datenmengen​

Bei der Verarbeitung großer IoT-Datenmengen beachten Sie bitte 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

Nachrichteneinstellungen​

Konfigurationsdatei: plantpulse-server/config/plantpulse-mq.properties

Kafka-DDS-Themen​

ParameterStandardwertVerwendung
mq.dds.kafka.topic.tag.pointpp-tag-pointTag-Punkt-Wert
mq.dds.kafka.topic.tag.alarmpp-tag-alarmTag-Alarm
mq.dds.kafka.topic.asset.datapp-asset-dataAsset-Daten
mq.dds.kafka.topic.asset.alarmpp-asset-alarmAsset-Alarm
mq.dds.kafka.topic.asset.eventpp-asset-eventAsset-Ereignis
mq.dds.kafka.topic.asset.aggregationpp-asset-aggregationAsset-Aggregation
mq.dds.kafka.topic.domain.changed.eventpp-domain-changed-eventMetadatenänderung

MQTT-DDS-Themen​

ParameterStandardwertVerwendung
mq.dds.mqtt.topic.tag.pointtag/point/{tag_id}Punktwert pro Tag
mq.dds.mqtt.topic.tag.alarmtag/alarm/{tag_id}Alarm pro Tag
mq.dds.mqtt.topic.asset.dataasset/data/{asset_id}Daten pro Asset
mq.dds.mqtt.topic.asset.commandasset/command/{asset_id}Steuerbefehl pro Asset

Scheduler-Einstellungen​

Konfigurationsdatei: quartz.properties (Interne Klassenpfad-Ressource der Web-App — nicht externalisiert)

ParameterStandardwertBeschreibung
org.quartz.threadPool.threadCount8Anzahl der Scheduler-Threads
org.quartz.threadPool.threadPriority5Thread-Priorität

Einstellungen für E-Mail / Benachrichtigungen​

Einstellungsort: Tabelle pp.mm_config in PostgreSQL. Am 2026-09-17 wurde plantpulse-mail.properties entfernt und der Pfad, über den veraltete Kopien in externen conf-Dateien gelesen wurden, wurde am 2026-09-18 ebenfalls entfernt — Werte werden nur über die Konsole oder pp.mm_config eingegeben. Schlüsselnamen und Standardwerte bleiben unverändert.

ParameterStandardwertBeschreibung
mail.smtp.host192.168.0.41SMTP-Serveradresse
mail.smtp.port25SMTP-Port
mail.smtp.authfalseAuthentifizierung verwenden
mail.smtp.starttls.enablefalseTLS verwenden

Anwendungseinstellungen​

Die Datei application.properties wurde im Juni 2026 entfernt. Einstellungen für das Konsolenverhalten wie Theme / Startseite werden über System > Einstellungen verwalten in der Konsole (PostgreSQL-Tabelle mm_config) verwaltet, und alarm.duplicate.check.minutes(Intervall für die Prüfung auf doppelte Alarme, Minuten) wurde nach plantpulse-server/config/plantpulse-engine.properties verlagert.


Diagnose von Leistungsengpässen​

Bei Leistungsproblemen beachten Sie bitte die folgenden Diagnosemethoden und Lösungen je nach Symptom.

1. Pipeline-Queue-Stau​

Symptom: Die Warteschlange der Pipeline wächst kontinuierlich an

# PlantPulse Dashboard 에서 "파이프라인 대기 큐" 패널을 확인해 주세요
# 또는 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 Schreibleistung von Aster TSDB

2. Schreibverzögerung bei Aster TSDB​

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 Festplatten-I/O-Leistung (SSD-Nutzung wird empfohlen)

3. Speichermangel​

Symptom: Häufige JVM-GC oder Auftreten von OutOfMemoryError

Lösung:

  • Erhöhen Sie den Wert von -Xmx in bin/start.sh des Dienstmoduls
  • Reduzieren Sie den Wert von engine.pipeline.queue.size, um Speicher zu sparen
  • Deaktivieren Sie unnötige Caches

4. Netzwerkverzögerung​

Symptom: Die Verzögerung beim Datenempfang nimmt zu (im PlantPulse-Dashboard-Panel "Netzwerkverzögerung" sichtbar)

Lösung:

  • Überprüfen Sie den Netzwerkstatus zwischen OPC-Server und PlantPulse
  • Passen Sie den Wert von engine.streaming.messaging.timeout.ms an
  • Überprüfen Sie die MQTT-QoS-Stufe

Technischer Support​

Bei Fragen zur Leistungsoptimierung: webmaster@kopens.com