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
- Nur eine Änderung pro Mal: Wenn mehrere Variablen gleichzeitig geändert werden, lässt sich nicht feststellen, welche Änderung den Effekt erzielt hat.
- Auf Basis von Betriebsdaten: Änderungen erst nach Reproduktion des realen Traffics in der stage-Umgebung vornehmen.
- Änderungen protokollieren: Geänderte Werte und Kennzahlen vor/nach der Änderung im GitOps / Betriebs-Wiki festhalten.
Empfohlene Ausgangswerte pro Betriebsumgebung
| Umgebung | CPU | Speicher | Festplatte | Empfohlene PIPELINE_THREADS | Empfohlene PIPELINE_RATELIMIT |
|---|---|---|---|---|---|
| Entwicklung | 16 vCPU | 64 GB | SSD | 16 | 10.000 MPS |
| Standard | 32 vCPU | 128 GB | NVMe | 36 | 40.000 MPS |
| Große Umgebung | 48+ vCPU | 200+ GB | NVMe | 64 | 100.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
| Variable | Standard | Auswirkung |
|---|---|---|
PP_CLUSTER_CORES | 30 | Zuweisung für Spark / Analyse-Kern |
PP_CLUSTER_MEMORY_BY_CORE | 2G | Spark Executor Speicher/Kern |
PP_LANG / PP_TZ | ko / Asia/Seoul | JVM Locale / Zeitzone |
JAVA_TOOL_OPTIONS | Automatisch generiert | Automatische 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
| Parameter | Standardwert | Beschreibung | Tuning-Anleitung |
|---|---|---|---|
engine.pipeline.threads | 36 | Anzahl der Pipeline-Worker-Threads | 70–80 % der Host-Kernanzahl wird empfohlen (Testumgebung 48 Kerne → 36) |
engine.pipeline.ratelimit | 40000 | Maximale Anzahl zu verarbeitender Nachrichten pro Sekunde (MPS) | Passen Sie sie an die Serverausstattung an |
engine.pipeline.queue.size | 1200000 | Maximale Größe der Pipeline-Queue | Passen Sie sie an den verfügbaren Speicher an |
engine.pipeline.queue.o3.delay | 50 | Verzögerungsverarbeitung bei Out-of-Order (ms) | Passen Sie sie an die Netzwerkverzögerung an |
engine.pipeline.task.mode | SINGLE | Pipeline-Task-Modus | SINGLE oder MULTI |
engine.async.parallelism | 256 | Anzahl der asynchronen Parallelverarbeitungen | Das 8- bis 16-fache der CPU-Kerne wird empfohlen |
Streaming-Einstellungen
| Parameter | Standardwert | Beschreibung |
|---|---|---|
engine.stream.processor | DIRECT | Stream-Verarbeitungsmodus |
engine.streaming.messaging.warning.ms | 5000 | Warnschwelle für Nachrichtenverzögerung (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 | Wiederherstellungsmethode bei Timeout |
Arbeits-Threads
| Parameter | Standardwert | Beschreibung |
|---|---|---|
engine.job.thread.asset | 8 | Anzahl der Asset-Arbeits-Threads |
engine.job.thread.point | 8 | Anzahl 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.
| 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 |
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
| Parameter | Standardwert | Beschreibung |
|---|---|---|
memtable_heap_space | 2GiB | Memtable-Heap-Speicher |
memtable_offheap_space | 2GiB | Memtable-Off-Heap-Speicher |
memtable_allocation_type | offheap_objects | Speicherzuordnungstyp |
memtable_flush_writers | 8 | Anzahl der Memtable-Flush-Threads |
Parallelitätseinstellungen
| Parameter | Standardwert | Beschreibung | Tuning-Anleitung |
|---|---|---|---|
concurrent_reads | 256 | Parallele Lese-Threads | Das 16-fache der Anzahl der Festplatten wird empfohlen |
concurrent_writes | 256 | Parallele Schreib-Threads | Das 8-fache der CPU-Kerne wird empfohlen |
concurrent_counter_writes | 256 | Parallele Zähler-Schreibvorgänge | Auf denselben Wert wie concurrent_writes setzen |
concurrent_compactors | 8 | Parallele Kompaktierungs-Threads | 1/4 der CPU-Kernanzahl wird empfohlen |
Commit-Log
| Parameter | Standardwert | Beschreibung |
|---|---|---|
commitlog_sync | periodic | Synchronisationsmethode |
commitlog_sync_period | 10000ms | Synchronisationsintervall |
commitlog_segment_size | 320MiB | Segmentgröße |
commitlog_total_space | 32GiB | Gesamter Commit-Log-Speicherplatz |
Timeouts
| Parameter | Standardwert | Beschreibung |
|---|---|---|
read_request_timeout | 10000ms | Lese-Timeout |
write_request_timeout | 60000ms | Schreib-Timeout |
counter_write_request_timeout | 10000ms | Zähler-Schreib-Timeout |
cas_contention_timeout | 1000ms | CAS-Konflikt-Timeout |
truncate_request_timeout | 600000ms | Truncate-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:
| Parameter | Standardwert | Beschreibung |
|---|---|---|
storage.table.compaction.strategy | UCS | Kompaktierungsstrategie (UCS oder TWCS) |
storage.table.compaction.strategy.ucs.scailing_parameter | T8 | Skalierungsparameter |
storage.table.compaction.strategy.ucs.min_sstable_size | 128MiB | Minimale 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 | Anzahl der Basis-Shards |
storage.table.compaction.strategy.ucs.max_sstables_to_compact | 6 | Maximale Anzahl zu kompaktierender SSTables |
Kompression
Es wird eine ZStandard-Wörterbuchkompression verwendet:
| Parameter | Standardwert | Beschreibung |
|---|---|---|
storage.compression.zstd.type | ZstdDictionaryCompressor | Kompressionsmethode |
storage.compression.zstd.level | 3 | Kompressionsstufe (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.
| Parameter | Standardwert | Beschreibung |
|---|---|---|
storage.tag.point.ttl | 62 (Tage) | Originaldaten der Tag-Punkte |
storage.tag.point.map.ttl | 1 (Tage) | Tag-Punkt-Map |
storage.tag.point.sampling.ttl | 93 (Tage) | Abtastdaten |
storage.tag.point.snapshot.ttl | 93 (Tage) | Snapshot-Daten |
storage.tag.point.aggregation.ttl | 93 (Tage) | Aggregierte Daten |
storage.tag.point.archive.ttl | 365 (Tage) | Archivdaten |
storage.tag.blob.ttl | 93 (Tage) | BLOB-Daten |
storage.asset.data.ttl | 10 (Tage) | Asset-Daten |
storage.asset.data.sampling.ttl | 31 (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
| Parameter | Standardwert | Beschreibung |
|---|---|---|
spark.cores.max | 16 | Maximale Anzahl der von Spark genutzten Kerne |
spark.driver.cores | 2 | Anzahl der Treiber-Kerne |
spark.driver.memory | 4g | Treiber-Speicher |
spark.executor.cores | 1 | Anzahl der Executor-Kerne |
spark.executor.memory | 2G | Executor-Speicher |
spark.executor.memoryOverhead | 2g | Executor-Overhead-Speicher |
Dynamische Zuweisung
| Parameter | Standardwert | Beschreibung |
|---|---|---|
spark.dynamicAllocation.enabled | true | Dynamische Executor-Zuweisung |
spark.dynamicAllocation.minExecutors | 2 | Minimale Anzahl der Executors |
spark.dynamicAllocation.maxExecutors | 16 | Maximale Anzahl der Executors |
spark.dynamicAllocation.executorIdleTimeout | 30 | Zeit bis zur Freigabe inaktiver Executors (Sekunden) |
Shuffle und Parallelität
| Parameter | Standardwert | Beschreibung |
|---|---|---|
spark.default.parallelism | 64 | Standardparallelität |
spark.sql.shuffle.partitions | 128 | Anzahl der SQL-Shuffle-Partitionen |
spark.sql.adaptive.enabled | true | Adaptive Query Execution |
spark.sql.adaptive.coalescePartitions.enabled | true | Automatische 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
| Parameter | Standardwert | Beschreibung |
|---|---|---|
spark.hadoop.fs.s3a.connection.maximum | 400 | Maximale Anzahl der S3-Verbindungen |
spark.hadoop.fs.s3a.threads.max | 128 | Maximale Anzahl der S3-Threads |
spark.hadoop.fs.s3a.max.total.tasks | 1024 | Maximale Anzahl asynchroner Aufgaben |
spark.hadoop.fs.s3a.fast.upload | true | Schneller Upload aktiviert |
spark.hadoop.fs.s3a.fast.upload.buffer | disk | Upload-Puffertyp |
spark.hadoop.fs.s3a.block.size | 128MB | S3-Blockgröße |
Iceberg-Einstellungen
| Parameter | Standardwert | Beschreibung |
|---|---|---|
spark.sql.iceberg.write.target-file-size-bytes | 256MB | Zieldateigröße |
spark.sql.iceberg.column-stats.enabled | true | Spaltenstatistik aktiviert |
spark.sql.iceberg.vectorization.enabled | true | Vektorisierte Lesevorgänge aktiviert |
spark.sql.iceberg.manifest.merge.enabled | true | Manifest-Zusammenführung |
spark.sql.parquet.compression.codec | zstd | Parquet-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
| Parameter | Standardwert | Beschreibung |
|---|---|---|
num.network.threads | 3 | Threads für Netzwerkverarbeitung |
num.io.threads | 8 | Threads für I/O-Verarbeitung |
socket.send.buffer.bytes | 102400 | Sende-Puffer für Sockets |
socket.receive.buffer.bytes | 102400 | Empfangs-Puffer für Sockets |
socket.request.max.bytes | 104857600 | Maximale Anforderungsgröße (100 MB) |
num.partitions | 1 | Standardanzahl der Partitionen |
log.retention.hours | 168 | Aufbewahrungsdauer des Logs (7 Tage) |
log.segment.bytes | 1073741824 | Log-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
| Parameter | Standardwert | Verwendung |
|---|---|---|
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-Themen
| Parameter | Standardwert | Verwendung |
|---|---|---|
mq.dds.mqtt.topic.tag.point | tag/point/{tag_id} | Punktwert pro Tag |
mq.dds.mqtt.topic.tag.alarm | tag/alarm/{tag_id} | Alarm pro Tag |
mq.dds.mqtt.topic.asset.data | asset/data/{asset_id} | Daten pro Asset |
mq.dds.mqtt.topic.asset.command | asset/command/{asset_id} | Steuerbefehl pro Asset |
Scheduler-Einstellungen
Konfigurationsdatei: quartz.properties (Interne Klassenpfad-Ressource der Web-App — nicht externalisiert)
| Parameter | Standardwert | Beschreibung |
|---|---|---|
org.quartz.threadPool.threadCount | 8 | Anzahl der Scheduler-Threads |
org.quartz.threadPool.threadPriority | 5 | Thread-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.
| Parameter | Standardwert | 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 |
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
-Xmxinbin/start.shdes 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.msan - Überprüfen Sie die MQTT-QoS-Stufe
Technischer Support
Bei Fragen zur Leistungsoptimierung: webmaster@kopens.com