Zum Hauptinhalt springen

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

  1. Immer nur eine Änderung: Mehrere Variablen gleichzeitig zu ändern macht es unmöglich zu erkennen, welche Änderung wirksam war.
  2. Datengestützt: Testsystem + realistische Last reproduzieren, dann ändern.
  3. Dokumentieren: Änderungen, Werte vorher/nachher in GitOps / Betriebs-Wiki festhalten.

Empfohlene Ausgangspunkte nach Umgebung

UmgebungCPURAMLaufwerkEmpf. PIPELINE_THREADSEmpf. PIPELINE_RATELIMIT
Entwicklung16 vCPU64 GBSSD1610.000 MPS
Standard32 vCPU128 GBNVMe3640.000 MPS
Große Skalierung48+ vCPU200+ GBNVMe64100.000 MPS

Kernoptimierungsvariablen aus env.sh

Die am häufigsten angepassten Variablen in Produktionsumgebungen befinden sich in bin/env.sh und compose/docker-compose.ymlUmgebungsvariablen-Referenz

VariableStandardAuswirkung
PP_CLUSTER_CORES30Spark / Analysen-Kern-Zuteilung
PP_CLUSTER_MEMORY_BY_CORE2GSpark Executor-Speicher/Kern
PP_LANG / PP_TZko / Asia/SeoulJVM-Locale / Zeitzone
JAVA_TOOL_OPTIONSAuto-generiertAutomatisch 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

ParameterStandardBeschreibungOptimierungsleitfaden
engine.pipeline.threads36Anzahl Pipeline-Worker-ThreadsWir empfehlen 70–80 % der Host-Kerne (validierte Umgebung 48 Kerne → 36)
engine.pipeline.ratelimit40000Max. Nachrichten pro Sekunde (MPS)Passen Sie an die Serverkonfiguration an
engine.pipeline.queue.size1200000Max. Pipeline-WarteschlangengrößePassen Sie an verfügbaren Speicher an
engine.pipeline.queue.o3.delay50Out-of-Order-Verzögerungsbehandlung (ms)Passen Sie an Netzwerkverzögerung an
engine.pipeline.task.modeSINGLEPipeline-Task-ModusSINGLE oder MULTI
engine.async.parallelism256Asynchrone parallele VerarbeitungWir empfehlen das 8–16-fache der CPU-Kerne

Streaming-Konfiguration

ParameterStandardBeschreibung
engine.stream.processorDIRECTStream-Verarbeitungsmodus
engine.streaming.messaging.warning.ms5000Schwellenwert für Nachrichtenverzögerungswarnung (ms)
engine.streaming.messaging.timeout.ms10000Nachrichten-Timeout (ms)
engine.streaming.messaging.timeout.store.typeFILE_QUEUESpeichermethode für Timeout-Nachrichten
engine.streaming.messaging.timeout.recovery.typeDBTimeout-Wiederherstellungsmethode

Arbeits-Threads

ParameterStandardBeschreibung
engine.job.thread.asset8Anzahl Asset-Arbeits-Threads
engine.job.thread.point8Anzahl 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.

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

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

ParameterStandardBeschreibung
memtable_heap_space2GiBMemtable-Heap-Speicher
memtable_offheap_space2GiBMemtable-Off-Heap-Speicher
memtable_allocation_typeoffheap_objectsSpeicher-Zuordnungstyp
memtable_flush_writers8Anzahl Memtable-Flush-Threads

Parallelitätseinstellung

ParameterStandardBeschreibungOptimierungsleitfaden
concurrent_reads256Parallele Lese-ThreadsWir empfehlen Datenträgeranzahl × 16
concurrent_writes256Parallele Schreib-ThreadsWir empfehlen CPU-Kerne × 8
concurrent_counter_writes256Parallele Counter-SchreibvorgängeGleich wie concurrent_writes setzen
concurrent_compactors8Parallele Compaction-ThreadsWir empfehlen 1/4 der CPU-Kerne

Commit-Log

ParameterStandardBeschreibung
commitlog_syncperiodicSynchronisierungsmodus
commitlog_sync_period10000msSynchronisierungszyklus
commitlog_segment_size320MiBSegmentgröße
commitlog_total_space32GiBGesamter Commit-Log-Speicherplatz

Timeouts

ParameterStandardBeschreibung
read_request_timeout10000msLese-Timeout
write_request_timeout60000msSchreib-Timeout
counter_write_request_timeout10000msCounter-Schreib-Timeout
cas_contention_timeout1000msCAS-Konkurrenz-Timeout
truncate_request_timeout600000msTruncate-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:

ParameterStandardBeschreibung
storage.table.compaction.strategyUCSCompaction-Strategie (UCS oder TWCS)
storage.table.compaction.strategy.ucs.scailing_parameterT8Skalierungsparameter
storage.table.compaction.strategy.ucs.min_sstable_size128MiBMin. SSTable-Größe
storage.table.compaction.strategy.ucs.target_sstable_size512MiBZiel-SSTable-Größe
storage.table.compaction.strategy.ucs.base_shard_count8Basis-Shard-Anzahl
storage.table.compaction.strategy.ucs.max_sstables_to_compact6Max. Compaction-SSTables

Komprimierung

Verwendet ZStandard-Wörterbuch-Komprimierung:

ParameterStandardBeschreibung
storage.compression.zstd.typeZstdDictionaryCompressorKomprimierungsmethode
storage.compression.zstd.level3Komprimierungsstufe (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.

ParameterStandardBeschreibung
storage.tag.point.ttl62 (Tage)Tag-Punkt Original-Daten
storage.tag.point.map.ttl1 (Tage)Tag-Punkt-Map
storage.tag.point.sampling.ttl93 (Tage)Sampling-Daten
storage.tag.point.snapshot.ttl93 (Tage)Snapshot-Daten
storage.tag.point.aggregation.ttl93 (Tage)Aggregations-Daten
storage.tag.point.archive.ttl365 (Tage)Archiv-Daten
storage.tag.blob.ttl93 (Tage)BLOB-Daten
storage.asset.data.ttl10 (Tage)Asset-Daten
storage.asset.data.sampling.ttl31 (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

ParameterStandardBeschreibung
spark.cores.max16Max. Spark-Kerne
spark.driver.cores2Treiber-Kernnummer
spark.driver.memory4gTreiber-Speicher
spark.executor.cores1Executor-Kernnummer
spark.executor.memory2GExecutor-Speicher
spark.executor.memoryOverhead2gExecutor-Overhead-Speicher

Dynamische Zuteilung

ParameterStandardBeschreibung
spark.dynamicAllocation.enabledtrueDynamische Executor-Zuteilung
spark.dynamicAllocation.minExecutors2Min. Executor-Anzahl
spark.dynamicAllocation.maxExecutors16Max. Executor-Anzahl
spark.dynamicAllocation.executorIdleTimeout30Leerlauf-Executor-Freigabezeit (Sekunden)

Shuffle und Parallelität

ParameterStandardBeschreibung
spark.default.parallelism64Standard-Parallelität
spark.sql.shuffle.partitions128SQL-Shuffle-Partitionsanzahl
spark.sql.adaptive.enabledtrueAdaptive Query Execution
spark.sql.adaptive.coalescePartitions.enabledtrueAuto-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

ParameterStandardBeschreibung
spark.hadoop.fs.s3a.connection.maximum400Max. S3-Verbindungen
spark.hadoop.fs.s3a.threads.max128Max. S3-Threads
spark.hadoop.fs.s3a.max.total.tasks1024Max. async. Vorgänge
spark.hadoop.fs.s3a.fast.uploadtrueSchneller Upload aktiviert
spark.hadoop.fs.s3a.fast.upload.bufferdiskUpload-Puffer-Typ
spark.hadoop.fs.s3a.block.size128MBS3-Blockgröße

Iceberg-Einstellung

ParameterStandardBeschreibung
spark.sql.iceberg.write.target-file-size-bytes256MBZieldateigröße
spark.sql.iceberg.column-stats.enabledtrueSpalten-Statistiken aktiviert
spark.sql.iceberg.vectorization.enabledtrueVektorisiertes Lesen aktiviert
spark.sql.iceberg.manifest.merge.enabledtrueManifest-Merge
spark.sql.parquet.compression.codeczstdParquet-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

ParameterStandardBeschreibung
num.network.threads3Netzwerk-Verarbeitungs-Threads
num.io.threads8I/O-Verarbeitungs-Threads
socket.send.buffer.bytes102400Socket-Sendepuffer
socket.receive.buffer.bytes102400Socket-Empfangspuffer
socket.request.max.bytes104857600Max. Anfragegröße (100 MB)
num.partitions1Standard-Partitionsanzahl
log.retention.hours168Log-Aufbewahrungsdauer (7 Tage)
log.segment.bytes1073741824Log-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

ParameterStandardZweck
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 Topics

ParameterStandardZweck
mq.dds.mqtt.topic.tag.pointtag/point/{tag_id}Tag-spezifischer Punkt-Wert
mq.dds.mqtt.topic.tag.alarmtag/alarm/{tag_id}Tag-spezifischer Alarm
mq.dds.mqtt.topic.asset.dataasset/data/{asset_id}Asset-spezifische Daten
mq.dds.mqtt.topic.asset.commandasset/command/{asset_id}Asset-Steuerbefehle

Scheduler-Konfiguration

Konfigurationsdatei: quartz.properties (interner Klassenpath-Resource der Web-App — kein Externalisierungsziel)

ParameterStandardBeschreibung
org.quartz.threadPool.threadCount8Scheduler-Thread-Anzahl
org.quartz.threadPool.threadPriority5Thread-Priorität

Mail- / Benachrichtigungseinstellung

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

ParameterStandardBeschreibung
mail.smtp.host192.168.0.41SMTP-Serveradresse
mail.smtp.port25SMTP-Port
mail.smtp.authfalseAuthentifizierung verwenden
mail.smtp.starttls.enablefalseTLS 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.sh des Service-Moduls den Wert von -Xmx
  • Senken Sie den Wert von engine.pipeline.queue.size um 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.ms an
  • Überprüfen Sie das MQTT-QoS-Niveau

Technischer Support

Anfragen zur Leistungsoptimierung: webmaster@kopens.com