JPOUG Advent Calendar 2020 の21日目のエントリーです。20日目は@discus_hamburg さんのMac De Oracle: 標準はあるにはあるが癖の多いSQL 全部俺 #20 結果セットを単一列に連結するにも癖があるでした。
今回は Tanel Poder の Linux Process Snapper を紹介します。Tanel は何度か来日したことがあり、写真は2012年の db tech showcase で来日した時のものです。
(盗撮:AZエージェンシー(c))
インストール
- Linux Process Snapper は 0xtools の 1 つで、Python スクリプトのため、git clone する(ファイルを置く)だけで使えます。make でコンパイルしているのは他のツールです。
$ sudo yum -y install git gcc $ git clone https://github.com/tanelpoder/0xtools $ cd 0xtools/ $ make $ sudo make install
使ってみる
- pgbench を流しながらモニタリングしてみる
# pgbench で PostgeSQL にクエリ実行 $ pgbench -r -c 8 -j 8 -t 100000 -U postgres -h localhost -d postgres -p 5432 > /dev/null 2>&1 & # pSnapper でサンプリングする $ sudo psn -G syscall,wchan Linux Process Snapper v0.18 by Tanel Poder [https://0x.tools] Sampling /proc/syscall, stat, wchan for 5 seconds... finished. === Active Threads ======================================================================== samples | avg_threads | comm | state | syscall | wchan ------------------------------------------------------------------------------------------- 85 | 0.85 | (postgres) | Disk (Uninterruptible) | fdatasync | 0 79 | 0.79 | (postgres) | Running (ON CPU) | [running] | 0 44 | 0.44 | (pgbench) | Running (ON CPU) | select | core_sys_select 43 | 0.43 | (pgbench) | Running (ON CPU) | [running] | 0 40 | 0.40 | (pgbench) | Running (ON CPU) | [running] | core_sys_select 39 | 0.39 | (postgres) | Running (ON CPU) | [running] | wait_woken 37 | 0.37 | (postgres) | Running (ON CPU) | recvfrom | 0 20 | 0.20 | (postgres) | Disk (Uninterruptible) | fsync | 0 11 | 0.11 | (pgbench) | Running (ON CPU) | select | 0 9 | 0.09 | (postgres) | Running (ON CPU) | [running] | do_syscall_64 9 | 0.09 | (postgres) | Running (ON CPU) | recvfrom | wait_woken 9 | 0.09 | (postgres) | Running (ON CPU) | semop | wait_woken 5 | 0.05 | (postgres) | Running (ON CPU) | fdatasync | wait_woken 5 | 0.05 | (postgres) | Running (ON CPU) | semop | 0 4 | 0.04 | (postgres) | Running (ON CPU) | semop | do_syscall_64 3 | 0.03 | (postgres) | Running (ON CPU) | recvfrom | do_syscall_64 2 | 0.02 | (pgbench) | Running (ON CPU) | futex | 0 2 | 0.02 | (pgbench) | Running (ON CPU) | futex | core_sys_select 1 | 0.01 | (postgres) | Disk (Uninterruptible) | [running] | 0 1 | 0.01 | (postgres) | Disk (Uninterruptible) | read | 0 1 | 0.01 | (rngd) | Running (ON CPU) | poll | SyS_poll samples: 100 (expected: 100) total processes: 165, threads: 216 runtime: 5.04, measure time: 4.04
- dd を流しながらモニタリングしてみる
# dd を実行 $ sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" $ sudo dd if=/dev/xvda1 of=/dev/null bs=1M count=10000 & # pSnapper でサンプリングする $ sudo psn -G syscall,wchan,kstack Linux Process Snapper v0.18 by Tanel Poder [https://0x.tools] Sampling /proc/stat, wchan, syscall, stack for 5 seconds... finished. === Active Threads ========================================================================================================================= samples | avg_threads | comm | state | syscall | wchan | kstack -------------------------------------------------------------------------------------------------------------------------------------------- 87 | 0.87 | (dd) | Disk (Uninterruptible) | read | 0 | SyS_read()->vfs_read()->__vfs_read()->generic_file_read_iter() 5 | 0.05 | (dd) | Running (ON CPU) | read | 0 | SyS_read()->vfs_read()->__vfs_read()->generic_file_read_iter() 4 | 0.04 | (dd) | Disk (Uninterruptible) | [running] | 0 | - 3 | 0.03 | (dd) | Disk (Uninterruptible) | read | 0 | - 1 | 0.01 | (dd) | Disk (Uninterruptible) | [running] | 0 | SyS_read()->vfs_read()->__vfs_read()->generic_file_read_iter() samples: 100 (expected: 100) total processes: 150, threads: 194 runtime: 5.02, measure time: 3.48
解説
- 0xtools のツール群の1つ
- Thread State Analysis を行うツール、Snapper、Oracle Database の ASH、Performance Insights なども同じアプローチ
- Thread State は R(On-CPU or ランキュー待ち)、D(割込み不可のスリープ)、S(スリープ) など
- B.Gregg のサイトや書籍でも TSA Method の解説がある
- TSA と ASH は同じコンセプト、ASH は Wait Event を実装しているので、Thread State より細かくアプリケーションレベルで定義した状態別に計上することができる
- ビジュアライズする機能もリリース予定?
詳しくは以下のスライドをご覧ください。
参考
過去の JPOUG Advent Calendar 記事
- Oracle Database や OS の性能統計情報と財務諸表の共通点 - ablog
- Linux で I/Oサイズを調べる方法 - ablog
- fulltime.sh by Craig Shallahamer で DB CPU の内訳を調べる - ablog
- DBサーバの空きメモリサイズの見方(Oracle Database on Linux) - ablog
- シンプルでシステマチックな Oracle Database 性能分析 with AWR & OS Watcher - ablog
- Oracle Database の I/O 負荷テストツール SLOB(The Silly Little Oracle Benchmark) の紹介 - ablog
- Oracle Database のクエリオプティマイザに関するエッセイ - ablog
過去の JPOUG Advent Calendar
- JPOUG Advent Calendar 2014 - Japan Oracle User Group (JPOUG) | Doorkeeper
- JPOUG Advent Calendar 2015 - Japan Oracle User Group (JPOUG) | Doorkeeper
- JPOUG Advent Calendar 2016 - Japan Oracle User Group (JPOUG) | Doorkeeper
- JPOUG Advent Calendar 2017 - Japan Oracle User Group (JPOUG) | Doorkeeper
- JPOUG Advent Calendar 2019 - Adventar
- JPOUG Advent Calendar 2020 - Adventar