カテゴリー
SQL

目指せ口座獲得”10の9乗”件(5)

少しだけパフォーマンスチューニングを実施します。
先ずはファイルシステム関連です。
最初の状態は XFS(CentOS Stream 9のデフォルト)のデフォルトです。

# mount | grep data
/dev/sdb1 on /data1 type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sdc1 on /data2 type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)

以下のように変更しました。Postgresqlサーバーを stop してファイルシステムのオプションを変更しました。その後でサーバーをstartしました。

# mount | grep data
/dev/sdb1 on /data1 type xfs (rw,noexec,noatime,nodiratime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sdc1 on /data2 type xfs (rw,noexec,noatime,nodiratime,attr2,inode64,logbufs=8,logbsize=32k,noquota)

start後、pgbenchを数回実行してみました。

# systemctl start postgresql
# su - postgres
最終ログイン: 2022/05/03 (火) 20:23:22 JST 日時 pts/0

$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 2.575 ms
tps = 3884.246089 (including connections establishing)
tps = 3887.452821 (excluding connections establishing)
[postgres@pc28 ~]$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 2.334 ms
tps = 4284.936691 (including connections establishing)
tps = 4287.766903 (excluding connections establishing)

$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 2.652 ms
tps = 3770.135602 (including connections establishing)
tps = 3772.280147 (excluding connections establishing)

$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 2.373 ms
tps = 4214.216119 (including connections establishing)
tps = 4216.757262 (excluding connections establishing)
カテゴリー
SQL

目指せ口座獲得”10の9乗”件(4)

というわけで、ストレージをSSD×6本のRAID0化して再度チャレンジしました。スケールファクターを10,000としてDBの初期化に約3100秒でした。

[postgres@pc28 ~]$ pgbench -i --partition-method=hash --partitions=10 -s 10000 benchdb
dropping old tables...
creating tables...
creating 10 partitions...
generating data (client-side)...
150700000 of 1000000000 tuples (15%) done (elapsed 182.28 s, remaining 1027.28 s
150800000 of 1000000000 tuples (15%) done (elapsed 182.34 s, remaining 1026.79 s
150900000 of 1000000000 tuples (15%) done (elapsed 182.39 s, remaining 1026.30 s
151000000 of 1000000000 tuples (15%) done (elapsed 182.45 s, remaining 1025.80 s
151100000 of 1000000000 tuples (15%) done (elapsed 182.57 s, remaining 1025.69 s
151200000 of 1000000000 tuples (15%) done (elapsed 182.62 s, remaining 1025.20 s

途中省略
934600000 of 1000000000 tuples (93%) done (elapsed 1434.72 s, remaining 100.40 s
934700000 of 1000000000 tuples (93%) done (elapsed 1434.77 s, remaining 100.24 s
934800000 of 1000000000 tuples (93%) done (elapsed 1434.82 s, remaining 100.08 s
1000000000 of 1000000000 tuples (100%) done (elapsed 1521.17 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 3138.38 s (drop tables 0.19 s, create tables 0.02 s, client-side generate 1524.47 s, vacuum 775.45 s, primary keys 838.25 s).

$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 2.619 ms
tps = 3818.335165 (including connections establishing)
tps = 3820.937510 (excluding connections establishing)
カテゴリー
SQL

目指せ口座獲得”10の9乗”件(3)

スケールファクターを10,000にしてみました。口座件数は 1,000,000,000です。DBの初期化に3時間くらいかかりました。DBは131GBほど増加しました。より高速なストレージが必要です。HDDでRAID0(Striping)では力不足のようです。

$ df -h
ファイルシス             サイズ  使用  残り 使用% マウント位置
/dev/sdc1                  512G   15G  498G    3% /data2
/dev/sdb1                  2.0T   29G  2.0T    2% /data1

$ pgbench -i --partition-method=hash --partitions=10 -s 10000 benchdb
dropping old tables...
creating tables...
creating 10 partitions...
generating data (client-side)...
100000000 of 1000000000 tuples (10%) done (elapsed 129.75 s, remaining 1167.75 s100100000 of 1000000000 tuples (10%) done (elapsed 129.80 s, remaining 1166.94 s100200000 of 1000000000 tuples (10%) done (elapsed 129.97 s, remaining 1167.11 s
途中省略
943100000 of 1000000000 tuples (94%) done (elapsed 1662.88 s, remaining 100.33 s943200000 of 1000000000 tuples (94%) done (elapsed 1663.01 s, remaining 100.15 s1000000000 of 1000000000 tuples (100%) done (elapsed 1754.84 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 10493.57 s (drop tables 0.23 s, create tables 0.06 s, client-side generate 1758.15 s, vacuum 6443.89 s, primary keys 2291.24 s).

$ df -h
ファイルシス             サイズ  使用  残り 使用% マウント位置
/dev/sdc1                  512G   12G  501G    3% /data2
/dev/sdb1                  2.0T  161G  1.9T    8% /data1

$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 57.567 ms
tps = 173.711651 (including connections establishing)
tps = 173.717831 (excluding connections establishing)
カテゴリー
SQL

目指せ口座獲得”10の9乗”件(2)

準備が完了したので、PostgreSQLサーバーをインストールします。バージョンは 13.5 です。
selinuxは disabled に変更して rebootしてから作業を始めました。

# yum list | grep ^postgresql
postgresql.x86_64               13.5-1.el9 appstream-dvd
postgresql-contrib.x86_64       13.5-1.el9 appstream-dvd
postgresql-jdbc.noarch          42.2.18-5.el9 appstream-dvd
postgresql-odbc.x86_64          12.02.0000-6.el9 appstream-dvd
postgresql-plperl.x86_64        13.5-1.el9 appstream-dvd
postgresql-plpython3.x86_64     13.5-1.el9 appstream-dvd
postgresql-pltcl.x86_64         13.5-1.el9 appstream-dvd
postgresql-private-libs.x86_64  13.5-1.el9 appstream-dvd
postgresql-server.x86_64        13.5-1.el9 appstream-dvd
postgresql-upgrade.x86_64       13.5-1.el9 appstream-dvd

# yum install postgresql postgresql-contrib postgresql-server

データとWALを格納するディレクトリを変更します。

# cat /usr/lib/systemd/system/postgresql.service | 抜粋
#Environment=PGDATA=/var/lib/pgsql/data
Environment=PGDATA=/data1/postgres/data

# export PGSETUP_INITDB_OPTIONS='--waldir=/data2/postgres/wal --wal-segsize=1024'

# postgresql-setup initdb
WARNING: using obsoleted argument syntax, try --help
WARNING: arguments transformed to: postgresql-setup --initdb --unit postgresql
 * Initializing database in '/data1/postgres/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

何か警告出ているけど、しかるべきディレクトリにそれらしいファイル群が出来ているのでOKでしょう。

# ls -l /data1/postgres/data/
合計 52
-rw-------. 1 postgres postgres     3  5月  1 21:11 PG_VERSION
drwx------. 5 postgres postgres    41  5月  1 21:11 base
drwx------. 2 postgres postgres  4096  5月  1 21:11 global
drwx------. 2 postgres postgres     6  5月  1 21:11 log
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_commit_ts
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_dynshmem
-rw-------. 1 postgres postgres  4516  5月  1 21:11 pg_hba.conf
-rw-------. 1 postgres postgres  1636  5月  1 21:11 pg_ident.conf
drwx------. 4 postgres postgres    68  5月  1 21:11 pg_logical
drwx------. 4 postgres postgres    36  5月  1 21:11 pg_multixact
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_notify
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_replslot
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_serial
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_snapshots
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_stat
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_stat_tmp
drwx------. 2 postgres postgres    18  5月  1 21:11 pg_subtrans
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_tblspc
drwx------. 2 postgres postgres     6  5月  1 21:11 pg_twophase
lrwxrwxrwx. 1 postgres postgres    19  5月  1 21:11 pg_wal -> /data2/postgres/wal
drwx------. 2 postgres postgres    18  5月  1 21:11 pg_xact
-rw-------. 1 postgres postgres    88  5月  1 21:11 postgresql.auto.conf
-rw-------. 1 postgres postgres 28087  5月  1 21:11 postgresql.conf

# ls -l /data2/postgres/wal/
合計 1048576
-rw-------. 1 postgres postgres 1073741824  5月  1 21:11 000000010000000000000001
drwx------. 2 postgres postgres          6  5月  1 21:11 archive_status

# systemctl start postgresql

# systemctl status postgresql
● postgresql.service - PostgreSQL database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
     Active: active (running) since Sun 2022-05-01 22:12:01 JST; 34s ago
    Process: 4734 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=0/SUCCESS)
   Main PID: 4736 (postmaster)
      Tasks: 8 (limit: 100452)
     Memory: 25.9M
        CPU: 43ms
     CGroup: /system.slice/postgresql.service
             tq4736 /usr/bin/postmaster -D /data1/postgres/data
             tq4737 "postgres: logger "
             tq4739 "postgres: checkpointer "
             tq4740 "postgres: background writer "
             tq4741 "postgres: walwriter "
             tq4742 "postgres: autovacuum launcher "
             tq4743 "postgres: stats collector "
             mq4744 "postgres: logical replication launcher "

 5月 01 22:12:01 pc31.soar.keizof.com systemd[1]: Starting PostgreSQL database server...

接続元を localhost だけでなくネットワーク越しとするために以下を変更して再起動します。

# cat /data1/postgres/data/postgresql.conf | 抜粋
listen_addresses = '*' # what IP address(es) to listen on;

# systemctl restart postgresql

まずは小さな規模から様子を見ながら確認していきます。
スケールファクターを1000で試します。100,000,000口座件数となりました。

$ df -h /data1
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sdb1        2.0T   15G  2.0T    1% /data1
$ createdb benchdb
$ pgbench -i --partition-method=hash --partitions=10 -s 1000 benchdb
dropping old tables...
NOTICE:  テーブル"pgbench_accounts"は存在しません、スキップします
NOTICE:  テーブル"pgbench_branches"は存在しません、スキップします
NOTICE:  テーブル"pgbench_history"は存在しません、スキップします
NOTICE:  テーブル"pgbench_tellers"は存在しません、スキップします
creating tables...
creating 10 partitions...
generating data (client-side)...
100000000 of 100000000 tuples (100%) done (elapsed 250.01 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 853.78 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 250.40 s, vacuum 510.33 s, primary keys 93.03 s).
$ df -h /data1/
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sdb1        2.0T   29G  2.0T    2% /data1

ここまででテーブルを確認します。パーティショニングによって、10分割されているようです。

$ psql -l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限
-----------+----------+------------------+-------------+-------------------+-----------------------
 benchdb   | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(4 行)

$ psql -d benchdb
psql (13.5)
"help"でヘルプを表示します。

benchdb=# \dt;
                          リレーション一覧
 スキーマ |        名前         |         タイプ         |  所有者
----------+---------------------+------------------------+----------
 public   | pgbench_accounts    | パーティションテーブル | postgres
 public   | pgbench_accounts_1  | テーブル               | postgres
 public   | pgbench_accounts_10 | テーブル               | postgres
 public   | pgbench_accounts_2  | テーブル               | postgres
 public   | pgbench_accounts_3  | テーブル               | postgres
 public   | pgbench_accounts_4  | テーブル               | postgres
 public   | pgbench_accounts_5  | テーブル               | postgres
 public   | pgbench_accounts_6  | テーブル               | postgres
 public   | pgbench_accounts_7  | テーブル               | postgres
 public   | pgbench_accounts_8  | テーブル               | postgres
 public   | pgbench_accounts_9  | テーブル               | postgres
 public   | pgbench_branches    | テーブル               | postgres
 public   | pgbench_history     | テーブル               | postgres
 public   | pgbench_tellers     | テーブル               | postgres
(14 行)

ベンチマークを実行してみます。

$ pgbench -c 10 -j 10 -t 2000 -N benchdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 1000
partition method: hash
partitions: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 7.812 ms
tps = 1280.100046 (including connections establishing)
tps = 1280.368309 (excluding connections establishing)
カテゴリー
SQL

目指せ口座獲得”10の9乗”件(1)

日本の人口は1憶2000万人くらいだそうです。預金、貯金の口座数はその数倍なのでしょうか?一人で沢山の口座を使い分けている人もきっといることでしょう。お金の沢山ある人は悩みが沢山あって羨ましいです。
というわけではありませんが、10の9乗くらいの口座数を作ってベンチマークを試みることにしました。

対象するDBは PostgreSQLであり、そこで実行するベンチマークプログラムは pgbench です。DBが大きくなると(扱うデータが多いという意味)、パーティショニングを使うのが自然な流れと思うので、それを使います。

パーティショニングは PostgreSQLのV10からサポートされた機能です。ここでは範囲指定とリスト指定の方法が利用できます。さらにV11からはハッシュによる方法が利用できます。

金融機関を想定すると支店単位でデーブルを分割するならばリスト指定のほうが便利な気もします。一方で支店の統廃合まで考えるならば、支店による境界はないほうが扱い易いかもしれません。総合的なマシンパワー(CPU、ネットワーク、ストレージ)を元に、ハッシュによる方法(分割数を変える重大変更のときには休業にしてDBを引っ越す)が良いと思いました。

Linuxのディストリビューションとそのバージョンによって、パッケージとして用意されている PostgreSQLサーバーのバージョンが異なります。先の通り、パーティショニングが使いたいならば、ハッシュが使いたいならば、V11以降が利用できるディストリビューション、バージョンを選んでください。幸い、ソースファイルが公開されているので、自分で最新版をコンパイルするのもありです。

今回は、比較的新しそうということで、CentOS Stream 9 を選んでみました。DVD用のISOイメージ(CentOS-Stream-9-latest-x86_64-dvd1.iso, 約8GB)を使ってインストールしました。インターネットに繋がっていない環境でも試せるように、このメディアからパッケージを必要に応じて追加インストールできるようにします。

最小構成(Minimal Install)を選んでシンプルな構成とします。

Centos Stream 9 Minimal Install を選ぶ

DVDイメージは /media に R/Oでマウントしてそこからパッケージを追加インストールできるように構成しました。

# mount -r /dev/cdrom /media 
# ls -l /media/
合計 32
dr-xr-xr-x 4 root root  2048  4月 26 04:41 AppStream
dr-xr-xr-x 4 root root  2048  4月 26 04:41 BaseOS
dr-xr-xr-x 3 root root  2048  4月 26 04:41 EFI
-r--r--r-- 1 root root   299  4月 26 04:41 EULA
-r--r--r-- 1 root root 18092  4月 26 04:41 LICENSE
-r--r--r-- 1 root root  1327  4月 26 04:41 TRANS.TBL
-r--r--r-- 1 root root   745  4月 26 04:41 extra_files.json
dr-xr-xr-x 3 root root  2048  4月 26 04:41 images
dr-xr-xr-x 2 root root  2048  4月 26 04:41 isolinux
-r--r--r-- 1 root root    88  4月 26 04:41 media.repo
# cat /etc/yum.repos.d/centos-dvd.repo
[baseos-dvd]
name=CentOS Stream $releasever - BaseOS
baseurl=file:///media/BaseOS
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=1

[appstream-dvd]
name=CentOS Stream $releasever - AppStream
baseurl=file:///media/AppStream
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=1

# sed -i "s/enabled=1/enabled=0/g" centos.repo
# sed -i "s/enabled=1/enabled=0/g" centos-addons.repo
# dnf config-manager --disable appstream baseos
# dnf clean all
12 ファイルが削除されました
# dnf repolist
repo id                    repo の名前
appstream-dvd              CentOS Stream 9 - AppStream
baseos-dvd                 CentOS Stream 9 - BaseOS

参考URL:
* CentOS 8 StreamでISOファイルをローカルリポジトリとして使用する! (lab4ict.com)
* PostgreSQL 13のインストール (CentOS 8編) | ネットワークチェンジニアとして (changineer.info)
* PostgreSQL 13 WAL(Write Ahead Log)の基本説明 | ネットワークチェンジニアとして (changineer.info)
* PostgreSQL のパフォーマンスチューニング – Qiita
* PostgreSQL: File Browser ソースファイル入手先
* PostgreSQL データの格納場所を変更する | ex1-lab (m-yabe.com)
* centos9 streamにpostgresql11をインストールする方法 – Qiita
* パーティショニングの概要|PostgreSQLインサイド : 富士通 (fujitsu.com)

カテゴリー
アマチュア無線

第2号送信機 IC-7300 より

今週末は思いのほか静かだったようです。皆さんはきっと忙しかったのでしょう。第2号送信機より画面キャプチャーを2枚貼りました。

IC-7300 受信中
IC-7300 送信中

普段はこの画面表示モードにしています。電波の強さと信号の強さ(S/N比)は別です。それぞれをモニターしたほうが良いと思っています。ご近所さんの強力な電波もこの画面を見ていればわかります。その局とはタイミングをずらす必要ありますので。

流石は固定機のIC-7300です。ファンの音はともかくとして抜群の安定性です。一方の第1号送信機の IC-705は放熱を注意してあげる必要があります。これからの温かい季節では、背面バッテリーを外して涼しくする必要がありそうです。

それではまた来週、現世のお空でお会いしましょう。

カテゴリー
アマチュア無線

今週末は睡眠のみ、仮眠と言う説も

20:50ごろの40mb, 7.041 MHz の込み具合

今週末は機材の電源を入れる時間すらありませんでした。23時間の労働後はきついです。静かになってくると、シングルレターK(ツー、トン、ツー)が見えるのが怖いです。これが続く限り核戦争はまだ始まっていない証なのかもしれませんが。。。

今週末は日没後の19時くらいから2局と更新しただけです。エリア4とエリア6の各1局です。交信ありがとうございます。

カテゴリー
アマチュア無線

北海道から鹿児島まで各局に感謝します!

待ちに待った週末でした。各局、交信ありがとうございます。
40mbにて、北海道から鹿児島の奄美世界自然遺産登録特別局(8J6AMAMI)まで南北に何往復も交信できました。日没後の18:55ごろでもまだまだエリア8(北海道)もエリア6(九州/沖縄)とも電波が届いていました。

カテゴリー
アマチュア無線

アンテナをどっちに向けるか?

建物の都合で自由が利かない場合もあります。設置場所、方法次第ということも。手元に地球儀が無い人は以下のサイトが参考になるかも。東西、南北に伸びている島国・日本なので悩みます。電波が届く範囲の海外となると、これまた悩みます。関東付近を中心に方位と距離を確認できます。

どこでも方位図法 (ontarget.cc)

神奈川県藤沢市付近を中心に描く

カテゴリー
アマチュア無線

FT8 7.041MHz 日没後

少し静かになりました。日中は混雑しています。アマチュア無線、パソコン通信というよりかは、条件反射、色塗りゲームのような気がしないでもありませんが。。。

AFN(旧:FEN)をもう一台のリグで聴きながらクリックに興じています。でも意外と面白い。地球の自転と公転と太陽を意識するのは良いことだと思います。

40mband、7MHzの到達状況はこんな感じでした。
自作アンテナにしては良く飛ぶものだと感心してます。
きっと相手の通信設備に救われているのでしょう。