PosgtreSQLを調整し、Pleromaのレスポンスを向上する。

はじめに

(DBConnection.ConnectionError) connection not available and request was dropped from queue after xxxxmsというエラーが出てきてしまったため、PosgtreSQLを調整し、Pleromaのレスポンスを向上する。
ユーザーはpleromaで進めていく。

1.Pleroma側の調整

/opt/pleroma/config/prod.secret.exs
1
2
3
4
5
6
7
8
9
10
11
12
config :pleroma, Pleroma.Repo,
adapter: Ecto.Adapters.Postgres,
username: "pleroma",
password: "db_password",
database: "pleroma_db",
hostname: "localhost",
+ pool_size: 20,
+ timeout: 120000,
+ queue_target: 200,
+ queue_interval: 4000

+ config :pleroma, :dangerzone, override_repo_pool_size: true

2.PostgreSQL側の設定

postgresqlの設定ファイルは大体/etc/postgresql/$VER/main/下に存在する。
このpostgresql.confpg_createclusterをしたときにしか生成されないのであらかじめバックアップを取っておく。$VERはpostgresqlのバージョン

terminal
sudo cp /etc/postgresql/$VER/main/postgresql.conf /etc/postgresql/$VER/main/postgresql.back

バックアップから戻す場合は

terminal
sudo cp /etc/postgresql/$VER/main/postgresql.back /etc/postgresql/$VER/main/postgresql.conf

とする。

このサイトのExample configurations1GB RAM, 1CPUを参考にする。
nanoの場合Ctrl + Wで検索し、値を変更する。

/etc/postgresql/$VER/main/postgresql.conf
1
2
3
4
5
6
7
8
9
10
+ max_connections = 20
- max_connections = 100
+ shared_buffers = 256MB
- shared_buffers = 128MB
+ effective_cache_size = 768MB
- // effective_cache_size = 4GB
+ maintenance_work_mem = 64MB
- // maitenance_work_mem = 64MB
+ work_mem = 13107kB
- // work_mem = 4MB

変更した。いったん様子を見る。
sudo service pleroma restart

PGTuneで最適な値を手に入れる。
使い方は簡単で、フォームを埋めるだけ。
DB Versionは12, OS TypeはLinux, DB TypeはWeb application, Total Memory(RAM)は1GB, Number of CPUsは4, Number of Connectionsは20, Data StorageはSDカードがなかったためSSD Strageとした。これをもとにpostgresql.confを書き換える。

/etc/postgresql/$VER/main/postgresql.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
+ checkpoint_completion_target = 0.9
- // checkpoint_completion_target = 0.5
+ wal_buffers = 7834kB
- wal_buffers = -1
+ default_statistics_targer = 100
- // default_statistics_targer = 100
+ random_page_cost = 1.1
- // random_page_cost = 4.0
+ effective_io_concurrency = 200
- // effective_io_concurryency = 1
+ work_mem = 6553kB
- work_mem = 13107kB
+ min_wal_size = 1GB
- min_wal_size = 80MB
+ max_wal_size = 4GB
- max_wal_size = 1GB
+ max_worker_processes = 4
- max_worker_processes = 8
+ max_parallel_workers_per_gather = 2
- // max_parallel_workers_par_gather = 2
+ max_parallel_workers = 4
- max_parallel_workers = 8
+ max_parallel_workers = 2
- // max_parallel_workers = 2

書き換えたらsudo service pleroma restartをして完了

3.再起動を組み込む。

timerを使わず、serviceのみで再起動させる。を参考に再起動するようにしておく。
/etc/systemd/system/pleroma.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Pleroma social network
After=network.target postgresql.service

[Service]
ExecReload=/bin/kill $MAINPID
KillMode=process
Restart=always
User=pleroma
Environment="MIX_ENV=prod"
WorkingDirectory=/opt/pleroma
ExecStart=/usr/bin/mix phx.server
+ RuntimeMaxSec=86400

[Install]
WantedBy=multi-user.target

参考

db_connection
Ecto - Troubleshooting

コメント