パフォーマンスチューニング
概要
PlantPulseのパフォーマンスは、収集 → 処理 → 保存 の各レイヤーのボトルネックを順に取り除くことで向上します。無条件にすべての値を大きくするのではなく、モニタリング指標を確認し、ボトルネック箇所のみを調整することが重要です。
チューニングの3原則
- 一度に1つだけ: 同時に複数の変数を変更すると、どの変更が効果をもたらしたか分かりません。
- 運用データに基づく: stage環境で実際のトラフィックを再現してから変更します。
- 記録を残す: 変更した値、変更前後の指標をGitOps / 運用wikiに記録してください。
運用環境別の推奨開始点
| 環境 | CPU | メモリ | ディスク | 推奨PIPELINE_THREADS | 推奨PIPELINE_RATELIMIT |
|---|---|---|---|---|---|
| 開発 | 16 vCPU | 64 GB | SSD | 16 | 10,000 MPS |
| 標準 | 32 vCPU | 128 GB | NVMe | 36 | 40,000 MPS |
| 大規模 | 48+ vCPU | 200+ GB | NVMe | 64 | 100,000 MPS |
env.shベースの主要チューニング変数
運用環境で最も頻繁に調整する変数は、ホストの bin/env.sh と compose/docker-compose.yml で管理されます → 環境変数リファレンス
| 変数 | デフォルト | 影響 |
|---|---|---|
PP_CLUSTER_CORES | 30 | Spark / 分析コア割り当て |
PP_CLUSTER_MEMORY_BY_CORE | 2G | Spark executorメモリ/コア |
PP_LANG / PP_TZ | ko / Asia/Seoul | JVMロケール / タイムゾーン |
JAVA_TOOL_OPTIONS | 自動生成 | すべての子JVMに自動適用 |
詳細な変数はプロパティリファレンスのenv.sh変数インデックスを参照してください。
測定ツール
チューニング前後を比較できるツール:
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
外部モニタリング (Grafana / Prometheus) はシステムモニタリングページを参照してください。
案内: パフォーマンスチューニングは、サーバー仕様、データ規模、使用パターンによって最適値が異なる場合があります。以下の推奨設定を起点として開始し、モニタリング結果を確認しながら段階的に調整していくことをお勧めします。
エンジンパイプラインチューニング
設定ファイル: plantpulse-server/config/plantpulse-engine.properties
案内: エンジンパイプラインは、センサーから収集されたデータが処理される中核経路です。この設定により、データの処理速度と容量を調整できます。
パイプライン主要パラメータ
| パラメータ | デフォルト値 | 説明 | チューニングガイド |
|---|---|---|---|
engine.pipeline.threads | 36 | パイプラインワーカースレッド数 | ホストコア数の70~80%を推奨します (検証環境48コア→36) |
engine.pipeline.ratelimit | 40000 | 秒あたり最大処理メッセージ数 (MPS) | サーバー仕様に合わせて調整してください |
engine.pipeline.queue.size | 1200000 | パイプラインキューの最大サイズ | メモリの空きに合わせて調整してください |
engine.pipeline.queue.o3.delay | 50 | Out-of-Order遅延処理 (ms) | ネットワーク遅延に応じて調整してください |
engine.pipeline.task.mode | SINGLE | パイプラインタスクモード | SINGLE または MULTI |
engine.async.parallelism | 256 | 非同期並列処理数 | CPUコアの8~16倍を推奨します |
ストリーミング設定
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
engine.stream.processor | DIRECT | ストリーム処理モード |
engine.streaming.messaging.warning.ms | 5000 | メッセージ遅延警告基準 (ms) |
engine.streaming.messaging.timeout.ms | 10000 | メッセージタイムアウト (ms) |
engine.streaming.messaging.timeout.store.type | FILE_QUEUE | タイムアウトメッセージの保存方式 |
engine.streaming.messaging.timeout.recovery.type | DB | タイムアウト復旧方式 |
作業スレッド
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
engine.job.thread.asset | 8 | アセット作業スレッド数 |
engine.job.thread.point | 8 | ポイント作業スレッド数 |
仕様別推奨設定
以下の表はサーバー仕様に応じた推奨設定値です。運用環境の仕様に合う列を参照して設定してください。
| 項目 | 小規模 (8コア/64GB) | 中規模 (16コア/128GB) | 大規模 (32コア/256GB) |
|---|---|---|---|
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チューニング
設定ファイル: plantpulse-storage/db/cassandra/conf/cassandra.yaml
案内: Aster TSDBは時系列データを保存する中核データベースです。データ規模が大きくなるほどAster TSDBのチューニングが全体のパフォーマンスに大きな影響を与えるため、運用環境に合わせて調整することをお勧めします。
メモリ設定
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
memtable_heap_space | 2GiB | Memtableヒープメモリ |
memtable_offheap_space | 2GiB | Memtable Off-Heapメモリ |
memtable_allocation_type | offheap_objects | メモリ割り当てタイプ |
memtable_flush_writers | 8 | Memtableフラッシュスレッド数 |
並行性設定
| パラメータ | デフォルト値 | 説明 | チューニングガイド |
|---|---|---|---|
concurrent_reads | 256 | 並行読み取りスレッド | ディスク数×16を推奨します |
concurrent_writes | 256 | 並行書き込みスレッド | CPUコア×8を推奨します |
concurrent_counter_writes | 256 | 並行カウンター書き込み | concurrent_writesと同様に設定してください |
concurrent_compactors | 8 | 並行コンパクションスレッド | CPUコア数の1/4を推奨します |
コミットログ
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
commitlog_sync | periodic | 同期方式 |
commitlog_sync_period | 10000ms | 同期周期 |
commitlog_segment_size | 320MiB | セグメントサイズ |
commitlog_total_space | 32GiB | 全体のコミットログ領域 |
タイムアウト
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
read_request_timeout | 10000ms | 読み取りタイムアウト |
write_request_timeout | 60000ms | 書き込みタイムアウト |
counter_write_request_timeout | 10000ms | カウンター書き込みタイムアウト |
cas_contention_timeout | 1000ms | CAS競合タイムアウト |
truncate_request_timeout | 600000ms | Truncateタイムアウト |
コンパクション戦略
PlantPulseは時系列データの特性に合わせた**UCS(Unified Compaction Strategy)**を使用します。
案内: コンパクション(Compaction)は、Aster TSDBがディスクに保存されたデータファイル(SSTable)を整理および統合する作業です。適切なコンパクション戦略を使用すると、ディスク領域を節約し、読み取りパフォーマンスを向上させることができます。
storage.properties 設定:
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
storage.table.compaction.strategy | UCS | コンパクション戦略 (UCS または TWCS) |
storage.table.compaction.strategy.ucs.scailing_parameter | T8 | スケーリングパラメータ |
storage.table.compaction.strategy.ucs.min_sstable_size | 128MiB | 最小SSTableサイズ |
storage.table.compaction.strategy.ucs.target_sstable_size | 512MiB | 目標SSTableサイズ |
storage.table.compaction.strategy.ucs.base_shard_count | 8 | ベースシャード数 |
storage.table.compaction.strategy.ucs.max_sstables_to_compact | 6 | 最大コンパクションSSTable数 |
圧縮
ZStandardディクショナリ圧縮を使用します:
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
storage.compression.zstd.type | ZstdDictionaryCompressor | 圧縮方式 |
storage.compression.zstd.level | 3 | 圧縮レベル (1~22、高いほど圧縮率は上がりますが速度は遅くなります) |
TTL (データ保存期間)
storage.propertiesでテーブル別のTTLを設定します。TTLが経過すると該当データは自動的に削除されるため、データ保存要件に合わせて設定してください。
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
storage.tag.point.ttl | 62 (日) | タグポイント元データ |
storage.tag.point.map.ttl | 1 (日) | タグポイントマップ |
storage.tag.point.sampling.ttl | 93 (日) | サンプリングデータ |
storage.tag.point.snapshot.ttl | 93 (日) | スナップショットデータ |
storage.tag.point.aggregation.ttl | 93 (日) | 集計データ |
storage.tag.point.archive.ttl | 365 (日) | アーカイブデータ |
storage.tag.blob.ttl | 93 (日) | BLOBデータ |
storage.asset.data.ttl | 10 (日) | アセットデータ |
storage.asset.data.sampling.ttl | 31 (日) | アセットサンプリングデータ |
Aster TSDBパフォーマンス点検コマンド
以下のコマンドを使用してAster TSDBのパフォーマンス状態を点検できます:
# 컴팩션 상태 확인
/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チューニング
設定ファイル: plantpulse-analytics/spark/conf/spark-defaults.conf
案内: Apache Sparkは大容量データ分析のための分散処理エンジンです。分析ジョブの速度と安定性を高めるために、以下の設定を参照してください。
リソース割り当て
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
spark.cores.max | 16 | Spark最大使用コア |
spark.driver.cores | 2 | ドライバーコア数 |
spark.driver.memory | 4g | ドライバーメモリ |
spark.executor.cores | 1 | Executorコア数 |
spark.executor.memory | 2G | Executorメモリ |
spark.executor.memoryOverhead | 2g | Executorオーバーヘッドメモリ |
動的割り当て
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
spark.dynamicAllocation.enabled | true | 動的Executor割り当て |
spark.dynamicAllocation.minExecutors | 2 | 最小Executor数 |
spark.dynamicAllocation.maxExecutors | 16 | 最大Executor数 |
spark.dynamicAllocation.executorIdleTimeout | 30 | アイドルExecutor解放時間 (秒) |
シャッフルおよび並列度
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
spark.default.parallelism | 64 | デフォルト並列度 |
spark.sql.shuffle.partitions | 128 | SQLシャッフルパーティション数 |
spark.sql.adaptive.enabled | true | Adaptive Query Execution |
spark.sql.adaptive.coalescePartitions.enabled | true | パーティション自動マージ |
JVM設定
Sparkドライバー/ExecutorともにZGCを使用します:
-XX:+UseZGC
-XX:+AlwaysPreTouch
-XX:+UseTLAB
-XX:+ResizeTLAB
-XX:+DisableExplicitGC
S3 (RustFS)連携設定
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
spark.hadoop.fs.s3a.connection.maximum | 400 | 最大S3接続数 |
spark.hadoop.fs.s3a.threads.max | 128 | 最大S3スレッド |
spark.hadoop.fs.s3a.max.total.tasks | 1024 | 最大非同期ジョブ |
spark.hadoop.fs.s3a.fast.upload | true | 高速アップロード有効化 |
spark.hadoop.fs.s3a.fast.upload.buffer | disk | アップロードバッファタイプ |
spark.hadoop.fs.s3a.block.size | 128MB | S3ブロックサイズ |
Iceberg設定
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
spark.sql.iceberg.write.target-file-size-bytes | 256MB | 対象ファイルサイズ |
spark.sql.iceberg.column-stats.enabled | true | カラム統計有効化 |
spark.sql.iceberg.vectorization.enabled | true | ベクター化読み取り有効化 |
spark.sql.iceberg.manifest.merge.enabled | true | マニフェストマージ |
spark.sql.parquet.compression.codec | zstd | Parquet圧縮コーデック |
Kafkaチューニング
設定ファイル: plantpulse-messaging/kafka/config/server.properties
案内: Kafkaはセンサーデータをリアルタイムで伝達するメッセージブローカーです。データ量が増えるとKafka設定を調整して処理パフォーマンスを向上させることができます。
主要設定
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
num.network.threads | 3 | ネットワーク処理スレッド |
num.io.threads | 8 | I/O処理スレッド |
socket.send.buffer.bytes | 102400 | ソケット送信バッファ |
socket.receive.buffer.bytes | 102400 | ソケット受信バッファ |
socket.request.max.bytes | 104857600 | 最大リクエストサイズ (100MB) |
num.partitions | 1 | デフォルトパーティション数 |
log.retention.hours | 168 | ログ保存期間 (7日) |
log.segment.bytes | 1073741824 | ログセグメントサイズ (1GB) |
大容量処理チューニング
大量のIoTデータを処理する場合は、以下の設定を参照して調整してください:
# 파티션 수 증가 (메시지 병렬 처리)
num.partitions=4
# I/O 스레드 증가
num.io.threads=16
# 네트워크 스레드 증가
num.network.threads=8
# 소켓 버퍼 증가
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
メッセージング設定
設定ファイル: plantpulse-server/config/plantpulse-mq.properties
Kafka DDSトピック
| パラメータ | デフォルト値 | 用途 |
|---|---|---|
mq.dds.kafka.topic.tag.point | pp-tag-point | タグポイント値 |
mq.dds.kafka.topic.tag.alarm | pp-tag-alarm | タグアラーム |
mq.dds.kafka.topic.asset.data | pp-asset-data | アセットデータ |
mq.dds.kafka.topic.asset.alarm | pp-asset-alarm | アセットアラーム |
mq.dds.kafka.topic.asset.event | pp-asset-event | アセットイベント |
mq.dds.kafka.topic.asset.aggregation | pp-asset-aggregation | アセット集計 |
mq.dds.kafka.topic.domain.changed.event | pp-domain-changed-event | メタデータ変更 |
MQTT DDSトピック
| パラメータ | デフォルト値 | 用途 |
|---|---|---|
mq.dds.mqtt.topic.tag.point | tag/point/{tag_id} | タグ別ポイント値 |
mq.dds.mqtt.topic.tag.alarm | tag/alarm/{tag_id} | タグ別アラーム |
mq.dds.mqtt.topic.asset.data | asset/data/{asset_id} | アセット別データ |
mq.dds.mqtt.topic.asset.command | asset/command/{asset_id} | アセット制御コマンド |
スケジューラー設定
設定ファイル: quartz.properties (ウェブアプリ内部クラスパスリソース — 外部化対象外)
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
org.quartz.threadPool.threadCount | 8 | スケジューラースレッド数 |
org.quartz.threadPool.threadPriority | 5 | スレッド優先順位 |
メール / 通知設定
設定場所: PostgreSQL pp.mm_config テーブルです。2026-09-17 に plantpulse-mail.properties を削除し、外部confに残っていた古いコピーを読み取るパスも2026-09-18に削除しました — 値はコンソールまたは pp.mm_config からのみ入力されます。 キー名とデフォルト値はそのままです。
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
mail.smtp.host | 192.168.0.41 | SMTPサーバーアドレス |
mail.smtp.port | 25 | SMTPポート |
mail.smtp.auth | false | 認証使用有無 |
mail.smtp.starttls.enable | false | TLS使用有無 |
アプリケーション設定
application.properties ファイルは2026.06に削除されました。テーマ / ホームページなどコンソール動作設定はコンソールのシステム > 設定管理 (PostgreSQL mm_config テーブル)で管理し、alarm.duplicate.check.minutes(重複アラームチェック間隔、分)は plantpulse-server/config/plantpulse-engine.properties に移管されました。
パフォーマンスボトルネック診断
パフォーマンス問題が発生した場合、以下の症状別の診断方法と解決策を参照してください。
1. パイプラインキュー滞留
症状: パイプライン待機キューが継続的に増加します
# PlantPulse Dashboard 에서 "파이프라인 대기 큐" 패널을 확인해 주세요
# 또는 JMX: pipeline.queue.size 값을 확인해 주세요
解決:
engine.pipeline.threadsの値を増やしてくださいengine.pipeline.ratelimitの値を引き上げてください- Aster TSDBの書き込みパフォーマンスを確認してください
2. Aster TSDB書き込み遅延
症状: 書き込みタイムアウトまたは WriteTimeoutException が発生します
# 컴팩션 상태 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node compactionstats
# Memtable 플러시
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node flush
解決:
concurrent_writesの値を増やしてくださいcompaction_throughputの値を増やしてください- ディスクI/Oパフォーマンスを点検してください (SSDの使用を推奨します)
3. メモリ不足
症状: JVM GCが頻繁に発生するか OutOfMemoryError が発生します
解決:
- サービスモジュールの
bin/start.shで-Xmxの値を増やしてください engine.pipeline.queue.sizeの値を減らしてメモリ使用を節約してください- 不要なキャッシュを無効にしてください
4. ネットワーク遅延
症状: データ受信遅延が増加します (PlantPulse Dashboard "ネットワーク遅延"パネルで確認可能)
解決:
- OPCサーバーとPlantPulse間のネットワーク状態を確認してください
engine.streaming.messaging.timeout.msの値を調整してください- MQTT QoSレベルを確認してください
テクニカルサポート
パフォーマンスチューニングに関するお問い合わせ: webmaster@kopens.com