SlideShare a Scribd company logo
PostgreSQL
と
setproctitle(3)
2018 年 8 月 28 日
(株)創夢 内藤 祐一郎
PostgreSQL
●
Linux 版の PostgreSQL を ps コマンドで見てみると
次のように表示されることがあります。
– “postgres: userA dbB 192.168.1.11(60936) INSERT”
●
これは今まさに userA が dbB に対して insert を実行してい
るよ、という表示です。
●
クライアントの IP アドレス、ポート番号も表示されます。
●
この表示は SQL の発行毎に書き換わるため、少し忙しいシステ
ムになると秒間数千〜数万程度書き換わる可能性があります。
PostgreSQL
●
FreeBSD だとデフォルトでは使用しないようになっており、
●
postgresql.conf には以下の注意書きがあります。
– # On FreeBSD, this is a performance hog, so keep it off
if you need speed
– (意訳:スピードが欲しければ OFF にしてお
け)
– update_process_title = off
●
なんでこんなことが書かれているのか?
setproctitle(3) の実装
●
FreeBSD ではプロセスタイトルの書き換えに
setproctitle(3) という libc の関数が用意されています。
●
これは posix ではありません。 BSD 系列の独自実装です。
●
この関数は以下のような sysctl を呼び出します。
– sysctl("kern.proc.proc_args.<pid>", NULL, 0,
– " プロセスタイトルの文字列 ", 文字数 )
●
pid を必要とすることから getpid(2) も呼び出します。
●
setproctitle(3) 内では2つのシステムコールが呼び出されます。
setproctitle(3) の高速化
●
ちなみに Linux では argv[0] を書き換えます。
➔システムコールが呼び出されない分、高速で
す。
●
FreeBSD でも同様にプロセスが起動時に呼び出された argv
の配列を取得し、その領域を書き換えるようします。
●
これは sysctlbyname(“kern.ps_strings”) で取得できます。
●
その後、カーネルにはこの値を見るように設定します。
setproctitle(3) の高速化
●
一度取得したメモリアドレスは static な変数に保存しておきま
すので、2回目以降はメモリ書き換えのみになります。
➔ Linux とほぼ同じ性能になります。
●
head 及び stable/11 では変更済です。
➔次期リリースでは update_process_title = on が利
用可能に!
bhyve で問題発生
●
先ほどの更新された setproctitile(3) が bhyve で使えないこと
が分かりました。
– ( 前回の workshop で動作がおかしいと言って
いた話です )
●
なんで使えないのか?
➔ capability mode だから
➔ bhyve は 11.2-R から capability mode で動作します
➔ capability mode では sysctl(2) が使えません
bhyve の修正
●
capability mode で使えないならば、
capability mode に入る前にセットすれば良い。
➔ head 及び stable/11 では修正済
●
前述の通り、一度呼び出しておけば、
capability mode でも使用可能。
➔2回目以降は sysctlbyname(2) を呼び出さない
ため
setproctitle(3) の論点
●
必要なリソースは capability mode の前に取得しておけ、とい
う思想には反していない。
●
setproctitle という名前からリソース取得が必要とは想像しに
くい。
●
取得しているメモリアドレスは自分のプロセスのものであり、
情報漏えいには当たらない。
●
capability mode でも setproctitle(3) できたほうが便利。
➔以上がざっと思いつく論点です
setproctitle(3) のその後
●
おそらく BSDCam 2018
( 8/15 〜 17@ イギリス、ケンブリッジ)
で議論された結果
●
カーネルに capability mode でも
kern.ps_strings だけは読み込み可能にするフラグが
追加されました。
●
capability mode でも問題なく setproctitle(3) できるようにな
ります。

More Related Content

PDF
Bossan dentoo
PDF
Bgworkerで簡易クラスタ管理
PDF
【学習メモ#1st】12ステップで作る組込みOS自作入門
PPTX
CloudCore VPS 開発者支援制度
PDF
【学習メモ#11th】12ステップで作る組込みOS自作入門
PDF
BEAR.Sunday 1.X
PPTX
Next-L Enju ワークショップ #86
PDF
【学習メモ#9th】12ステップで作る組込みOS自作入門
Bossan dentoo
Bgworkerで簡易クラスタ管理
【学習メモ#1st】12ステップで作る組込みOS自作入門
CloudCore VPS 開発者支援制度
【学習メモ#11th】12ステップで作る組込みOS自作入門
BEAR.Sunday 1.X
Next-L Enju ワークショップ #86
【学習メモ#9th】12ステップで作る組込みOS自作入門

What's hot (20)

PDF
20110205.linux 0.01
PDF
membase
PPTX
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
PDF
EthernetやCPUなどの話
PPTX
Matlab distributed computing serverの使い方
PDF
Couch DB in 15minutes
PPTX
Windows HPC Server 講習会 第2回 開発編
PPTX
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
PDF
PHP matsuri 2013 Windows Azure Storage SDK for PHP
ODP
Next-L Enju 開発ワークショップ #10
PDF
Website build exercise_opsguide_japanese
PPT
mongoDB: OSC Tokyo2010 spring
PPTX
Varnish
KEY
MHA, Murakumo & Me
PDF
binary log と 2PC と Group Commit
PPTX
Windows HPC Server 講習会 第1回 導入編 1/2
PDF
Hpc server講習会第3回応用編
PPTX
MySQLやSSDとかの話・後編
PDF
MySQLやSSDとかの話 後編
20110205.linux 0.01
membase
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
EthernetやCPUなどの話
Matlab distributed computing serverの使い方
Couch DB in 15minutes
Windows HPC Server 講習会 第2回 開発編
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
PHP matsuri 2013 Windows Azure Storage SDK for PHP
Next-L Enju 開発ワークショップ #10
Website build exercise_opsguide_japanese
mongoDB: OSC Tokyo2010 spring
Varnish
MHA, Murakumo & Me
binary log と 2PC と Group Commit
Windows HPC Server 講習会 第1回 導入編 1/2
Hpc server講習会第3回応用編
MySQLやSSDとかの話・後編
MySQLやSSDとかの話 後編
Ad

More from Yuichiro Naito (20)

PDF
Install FreeBSD 14.3-RELEASE to HP Envy x360
PDF
Bhyve Management Daemon: Wake on LAN support
PDF
Development of Bhyve Management Daemon on FreeBSD
PDF
Bhyve Management Daemon Version 3.0 on FreeBSD
PDF
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
PDF
WireGurad in the FreeBSD kernel
PDF
FreeBSD Capsicum
PDF
Bhyve debug-server
PDF
Tramp mode
PDF
HandBrake with QSV
PDF
FreeBSD 12.1 RELESE
PPTX
Modern fonts
ODP
FreeBSD 12.0 RELEASE!
ODP
ODP
FreeBSD 11.2 RELEASE!
ODP
How to use PTI & IBRS patch
ODP
FreeBSD Desktop
ODP
FreeBSD Ports Flavors
ODP
Bsdtw repo
Install FreeBSD 14.3-RELEASE to HP Envy x360
Bhyve Management Daemon: Wake on LAN support
Development of Bhyve Management Daemon on FreeBSD
Bhyve Management Daemon Version 3.0 on FreeBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
WireGurad in the FreeBSD kernel
FreeBSD Capsicum
Bhyve debug-server
Tramp mode
HandBrake with QSV
FreeBSD 12.1 RELESE
Modern fonts
FreeBSD 12.0 RELEASE!
FreeBSD 11.2 RELEASE!
How to use PTI & IBRS patch
FreeBSD Desktop
FreeBSD Ports Flavors
Bsdtw repo
Ad

Psql & proctitle

  • 1. PostgreSQL と setproctitle(3) 2018 年 8 月 28 日 (株)創夢 内藤 祐一郎
  • 2. PostgreSQL ● Linux 版の PostgreSQL を ps コマンドで見てみると 次のように表示されることがあります。 – “postgres: userA dbB 192.168.1.11(60936) INSERT” ● これは今まさに userA が dbB に対して insert を実行してい るよ、という表示です。 ● クライアントの IP アドレス、ポート番号も表示されます。 ● この表示は SQL の発行毎に書き換わるため、少し忙しいシステ ムになると秒間数千〜数万程度書き換わる可能性があります。
  • 3. PostgreSQL ● FreeBSD だとデフォルトでは使用しないようになっており、 ● postgresql.conf には以下の注意書きがあります。 – # On FreeBSD, this is a performance hog, so keep it off if you need speed – (意訳:スピードが欲しければ OFF にしてお け) – update_process_title = off ● なんでこんなことが書かれているのか?
  • 4. setproctitle(3) の実装 ● FreeBSD ではプロセスタイトルの書き換えに setproctitle(3) という libc の関数が用意されています。 ● これは posix ではありません。 BSD 系列の独自実装です。 ● この関数は以下のような sysctl を呼び出します。 – sysctl("kern.proc.proc_args.<pid>", NULL, 0, – " プロセスタイトルの文字列 ", 文字数 ) ● pid を必要とすることから getpid(2) も呼び出します。 ● setproctitle(3) 内では2つのシステムコールが呼び出されます。
  • 5. setproctitle(3) の高速化 ● ちなみに Linux では argv[0] を書き換えます。 ➔システムコールが呼び出されない分、高速で す。 ● FreeBSD でも同様にプロセスが起動時に呼び出された argv の配列を取得し、その領域を書き換えるようします。 ● これは sysctlbyname(“kern.ps_strings”) で取得できます。 ● その後、カーネルにはこの値を見るように設定します。
  • 6. setproctitle(3) の高速化 ● 一度取得したメモリアドレスは static な変数に保存しておきま すので、2回目以降はメモリ書き換えのみになります。 ➔ Linux とほぼ同じ性能になります。 ● head 及び stable/11 では変更済です。 ➔次期リリースでは update_process_title = on が利 用可能に!
  • 7. bhyve で問題発生 ● 先ほどの更新された setproctitile(3) が bhyve で使えないこと が分かりました。 – ( 前回の workshop で動作がおかしいと言って いた話です ) ● なんで使えないのか? ➔ capability mode だから ➔ bhyve は 11.2-R から capability mode で動作します ➔ capability mode では sysctl(2) が使えません
  • 8. bhyve の修正 ● capability mode で使えないならば、 capability mode に入る前にセットすれば良い。 ➔ head 及び stable/11 では修正済 ● 前述の通り、一度呼び出しておけば、 capability mode でも使用可能。 ➔2回目以降は sysctlbyname(2) を呼び出さない ため
  • 9. setproctitle(3) の論点 ● 必要なリソースは capability mode の前に取得しておけ、とい う思想には反していない。 ● setproctitle という名前からリソース取得が必要とは想像しに くい。 ● 取得しているメモリアドレスは自分のプロセスのものであり、 情報漏えいには当たらない。 ● capability mode でも setproctitle(3) できたほうが便利。 ➔以上がざっと思いつく論点です
  • 10. setproctitle(3) のその後 ● おそらく BSDCam 2018 ( 8/15 〜 17@ イギリス、ケンブリッジ) で議論された結果 ● カーネルに capability mode でも kern.ps_strings だけは読み込み可能にするフラグが 追加されました。 ● capability mode でも問題なく setproctitle(3) できるようにな ります。