Skip to content

gracetory/geo_benchmark

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

地理空間クエリ パフォーマンスベンチマーク 手順書

概要

システム インデックス
PostgreSQL 17 + PostGIS R-tree (GIST)
MySQL 8.0 Spatial R-tree (SPATIAL)
Redis 8 Geospatial Sorted Set + Geohash
MongoDB 8.0 2dsphere
Elasticsearch 9.x BKD-tree (Lucene)
Pure Python (NumPy) なし(全件スキャン・ベースライン)

ディレクトリ構成

/opt/geo_benchmark/
├── 00_setup_all.sh              ← 全ソフトウェア一括インストール
├── raw/                         ← 入力データ置き場
│   ├── stationxxxx.csv
│   └── japan-xxxxxx.osm.pbf
├── scripts/
│   ├── 01_tuning_apply.sh       ← チューニング適用
│   ├── 01_tuning_remove.sh      ← チューニング削除                                                                                                  
│   ├── 02_data_prepare.py       ← データ整形
│   ├── 03_db_setup.py           ← DB設計・インポート(全DB起動中に実行)
│   ├── 04_benchmark.py          ← パフォーマンス測定(bench_*.shから呼ばれる)
│   ├── 05_report.py             ← CSV/Markdownレポート生成
│   ├── bench_pg.sh              ← PostgreSQL 単独計測
│   ├── bench_mysql.sh           ← MySQL 単独計測
│   ├── bench_redis.sh           ← Redis 単独計測
│   ├── bench_mongo.sh           ← MongoDB 単独計測
│   ├── bench_es.sh              ← Elasticsearch 単独計測
│   └── bench_python.sh          ← Pure Python 単独計測
├── sql/
│   └── query_reference.sql      ← 手動確認・EXPLAIN用クエリ集
├── data/                        ← 整形済みデータ(自動生成)
├── results/                     ← 測定結果JSON(各bench_*.shが追記)
└── report/                      ← レポート(05_report.pyが生成)

チューニング設定(単独計測前提 / 7GiB専有)

システム 設定項目 根拠
MySQL innodb_buffer_pool_size 5GB 物理メモリの約70%(推奨50〜80%)
PostgreSQL shared_buffers 2GB 物理メモリの約25%(PGの推奨上限)
PostgreSQL effective_cache_size 5GB OS含むキャッシュ全体の見積もり
PostgreSQL work_mem 64MB 接続数が少ないので増やせる
Redis maxmemory 5GB データサイズに対して余裕のある上限
MongoDB wiredTiger cacheSizeGB 3GB 物理メモリの約40〜50%
Elasticsearch Xmx / Xms 3GB ヒープはRAMの50%以下・32GB未満推奨

作業手順

STEP 1: 全ソフトウェアのインストール

chmod +x /opt/geo_benchmark/00_setup_all.sh
sudo /opt/geo_benchmark/00_setup_all.sh 2>&1 | tee /opt/geo_benchmark/setup.log

所要時間: 15〜25分

インストール後、全サービスは停止状態になります。

STEP 2: データファイルの配置

# 駅データ.jp 無料版CSVを配置
cp /path/to/station20xxxxfree.csv /opt/geo_benchmark/raw/

# Geofabrik 日本データ(PBF形式)を配置
# https://download.geofabrik.de/asia/japan.html
cp /path/to/japan-latest.osm.pbf /opt/geo_benchmark/raw/

STEP 3: データ整形

source /opt/geo_benchmark/venv/bin/activate
cd /opt/geo_benchmark/scripts

python 02_data_prepare.py \
    --station /opt/geo_benchmark/raw/station20xxxxfree.csv \
    --pbf     /opt/geo_benchmark/raw/japan-latest.osm.pbf \
    --outdir  /opt/geo_benchmark/data

所要時間: 5〜15分(PBF解析中心)

STEP 4: 全DBにデータをインポート

# 全サービスを起動
sudo systemctl start postgresql-17 mysqld redis mongod elasticsearch

# Elasticsearchの起動を待つ(greenになるまで)
watch -n5 'curl -sf http://localhost:9200/_cluster/health | python3 -m json.tool'

# 全DBに一括インポート
python 03_db_setup.py --all

所要時間: 5〜20分

インポート完了後、全サービスを停止しておきます:

sudo systemctl stop postgresql-17 mysqld redis mongod elasticsearch

STEP 5: 各システムの単独計測

各スクリプトは [計測回数] [結果ディレクトリ] の2引数を受け取ります。 チューニングなし・ありで結果ディレクトリを分けることで、両方の結果を保持できます。

チューニングなしで計測

OUTDIR=/opt/geo_benchmark/results/no_tuning

bash bench_pg.sh     100 ${OUTDIR}
bash bench_mysql.sh  100 ${OUTDIR}
bash bench_redis.sh  100 ${OUTDIR}
bash bench_mongo.sh  100 ${OUTDIR}
bash bench_es.sh     100 ${OUTDIR}
bash bench_python.sh 100 ${OUTDIR}

チューニングを適用して計測

# チューニング適用
sudo bash /opt/geo_benchmark/scripts/01_tuning_apply.sh

OUTDIR=/opt/geo_benchmark/results/tuned

bash bench_pg.sh     100 ${OUTDIR}
bash bench_mysql.sh  100 ${OUTDIR}
bash bench_redis.sh  100 ${OUTDIR}
bash bench_mongo.sh  100 ${OUTDIR}
bash bench_es.sh     100 ${OUTDIR}
bash bench_python.sh 100 ${OUTDIR}

各スクリプトは results/{no_tuning,tuned}/summary_all.json追記していくので、 途中で止めても再実行すれば続きから進められます。

STEP 6: レポート生成

チューニングなし・ありそれぞれのディレクトリに対してレポートを生成します。

source /opt/geo_benchmark/venv/bin/activate
cd /opt/geo_benchmark/scripts

# チューニングなし
python 05_report.py \
    --indir  /opt/geo_benchmark/results/no_tuning \
    --outdir /opt/geo_benchmark/report/no_tuning

# チューニングあり
python 05_report.py \
    --indir  /opt/geo_benchmark/results/tuned \
    --outdir /opt/geo_benchmark/report/tuned

出力:

report/
├── no_tuning/
│   ├── benchmark_results.csv    ← 全条件の集計(Excel加工用)
│   └── benchmark_report.md      ← Markdownレポート
└── tuned/
    ├── benchmark_results.csv
    └── benchmark_report.md

トラブルシューティング

PostGISインストール時に libqhull_r.so.7 が見つからない

Rocky Linux 9 では crb(CodeReady Builder)リポジトリを有効化する必要があります。

dnf install -y 'dnf-command(config-manager)'
dnf config-manager --set-enabled crb
dnf makecache
dnf install -y postgresql17-server postgresql17 postgis35_17

Redisのkeyringsディレクトリが存在しない

Rocky Linux 9 では /usr/share/keyrings/ がデフォルトで存在しないため、手動で作成します。

mkdir -p /usr/share/keyrings
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

PostgreSQLにPeer認証エラーで接続できない

Rocky Linux 9 + PostgreSQL 17 のデフォルト認証が peer または scram-sha-256 のままの場合。

# pg_hba.conf の認証方式を md5 に変更
sudo sed -i 's/^local\s\+all\s\+all\s\+peer$/local   all             all                                     md5/' \
    /var/lib/pgsql/17/data/pg_hba.conf

# 確認
grep -E "^local|^host" /var/lib/pgsql/17/data/pg_hba.conf

# 反映
sudo systemctl restart postgresql-17

psql のパスワード入力を省略するには .pgpass を設定します。

echo "localhost:5432:geo_benchmark:bench_user:bench1234" > ~/.pgpass
chmod 600 ~/.pgpass

bench_pg.sh 実行時に PostgreSQL のパスワードを求められる

bench_pg.sh のヘルスチェックが sudo -u postgres psql を呼んでいる場合。 pg_isready を使う方式に修正します。

sed -i 's/sudo -u postgres psql -c "SELECT 1"/\/usr\/pgsql-17\/bin\/pg_isready -U bench_user -d geo_benchmark -q/' \
    /opt/geo_benchmark/scripts/bench_pg.sh

MySQL インポート時に Latitude が範囲外エラー

MySQL の ST_GeomFromText は SRID 4326(地理座標系)において POINT(緯度 経度) の順を要求します(他システムと逆)。03_db_setup.py の MySQL セクションで POINT({r['lat']} {r['lon']}) になっているか確認してください。

Elasticsearchが起動しない

sudo journalctl -u elasticsearch --no-pager | tail -50
# vm.max_map_count の確認(262144以上が必要)
sysctl vm.max_map_count
sudo sysctl -w vm.max_map_count=262144

03_db_setup.py 実行時に接続拒否エラー

全DBが起動している状態で実行する必要があります。

sudo systemctl start postgresql-17 mysqld redis mongod elasticsearch
# Elasticsearch の起動を待つ
sleep 60
curl -s http://localhost:9200/_cluster/health | python3 -m json.tool
python /opt/geo_benchmark/scripts/03_db_setup.py --all

bench_*.shでpermission denied

sudo bash /opt/geo_benchmark/scripts/bench_pg.sh

駅データについての補足

駅データ.jp 無料版は路線ごとにレコードが存在するため、複数路線が乗り入れる駅は同じ地点に複数のレコードがあります。例えば「さいたま新都心」はJR各線で3件カウントされます。そのため東京30km圏のヒット数が多く見えることがありますが、これはデータの仕様によるものです。全システムで同じデータを使うため、システム間の比較には影響しません。

また路面電車の停留所も含まれるため、広島・大阪・京都などでは周辺の件数が多くなります。

参考資料

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors