Hatena::ブログ(Diary)

ablog このページをアンテナに追加 RSSフィード

2018-04-08

Netflix のオープンソース可視化ツール FlameScope を使ってみた

Brendan Gregg らの所属する Netflix の cloud performance engineering team が FlameScope というパフォーマンス可視化ツールオープンソースで公開した。詳しくは Netflix Tech Blog 参照。

flame graphs は瞬間的なスパイクを分析しづらかったが、FlameScope により1秒未満のヒートマップでイベント発生回数の多い時間帯が可視化されピンポイントで特定期間の flame graph を表示できるようになった。Oracle Database でいうと AWR/Statspack レポートだけでなく ASH 的な分析、さらに1秒未満のCPU時間の内訳のプロファイリングまで Craig Shallahamer の fulltime.sh でズームアップできるイメージ*1

FlameScope は Pyhton(フレームワークFlask) で書かれた Web アプリで、Perf で取得したデータを、ブラウザでアクセスして flame graph を分析するツールです。


Brendan Gregg は性能分析の大家でバックグラウンドは以下の通り。

Flame Graphs の作者の Brendan Gregg は Sun、Oracle、Joyent でカーネル、パフォーマンスのエンジニアとして活躍し、現在は Netflix(北米インターネットトラフィックの32.3%を占める。YouTubeは17.1%)*2シニア・パフォーマンス・アーキテクトです。ZFS L2ARC や DTrace Toolkit の開発者で、Solaris Performance and ToolsDTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD の著者で、LinuxConFreeBSD SummitOaktable WorldAWS re:Invent などのイベントで幅広く活動されています。是非 Brendan Gregg’s Homepage をご覧ください。

perf + Flame Graphs で Linux カーネル内のボトルネックを特定する - ablog

FlameScope の見方

x軸が秒単位、y軸が1秒未満の時系列になっていて、赤いセルほどイベント発生回数が多い(CPU負荷が高い)。密度を高めるため2次元にしていると思われる。

f:id:yohei-a:20180408180622p:image:w360

実際のスクリーンショットはこんな感じで、x軸が秒単位、y軸が1秒未満の単位になっていて、

f:id:yohei-a:20180408180626p:image:w360

選択範囲の FlameGraph を表示することができる。

f:id:yohei-a:20180408180632p:image:w360

flame graph の見方は以下の通り。詳しくはこちら

  • 関数名で左から右にソートされている
  • コールスタックは上に行くほど深い
  • 最もコールスタックが深くて横幅が長いのがCPUを最も使っている関数

FlameScope を使ってみる

macOS に FlameScope をインストールして、Linux で perf で取得した性能情報をダウンロードして、FlameScope で可視化してみた。

f:id:yohei-a:20180408230316p:image:w360 f:id:yohei-a:20180408230323p:image:w360 f:id:yohei-a:20180408230329p:image:w360


環境

インストール
$ sudo yum -y install perf
$ git clone https://github.com/Netflix/flamescope
$ cd flamescope
$ sudo pip install -r requirements.txt

使ってみる
  • EC2 で perf で性能情報を取得しつつ openssl で負荷をかける
    • perf で性能情報を収集する
$ sudo perf record -F 49 -a -g -- sleep 120
$ sudo perf script --header > stacks.openssl.2018-04-07_01
$ gzip stacks.openssl.2018-04-07_01
$ ls -lh stacks.openssl.2018-04-07_01.gz
-rw-rw-r-- 1 ec2-user ec2-user 389K Apr  8 13:45 stacks.openssl.2018-04-07_01.gz
$ openssl speed -multi 4
  • macOS で FlameScope を起動する。
    • FlameScope を起動する
$ python run.py

スタックのリストが表示されるので、stacks.openssl.2018-04-07_01.gz をクリックする。

f:id:yohei-a:20180408230316p:image:w640

ヒートマップを表示すると綺麗に2分間計測したうち1分経過後から30秒間が赤くなっている。

f:id:yohei-a:20180408230323p:image:w640

範囲を選択してクリックすると flame graph を見ることができる。

f:id:yohei-a:20180408230329p:image:w640


参考


関連

*1:細かすぎて伝わらない例えかもしれない。。。

*2http://wazanova.jp/post/62392993571/30-netflix-amzazon

2018-03-30

AWR Formatter を使ってみた

渡部さんがツイートされていて知った AWR Formatter を知ってみた。


AWR Formatter とは

(3)AWR Formatterの紹介

知っている方も多いと思いますが、念のためにAWR Formatterツールを紹介します。

AWR Formatter は、AWRを分かり易くフォーマットしてくれる、chromeのplugin機能になります。これで分析すると楽になるので使用してみてください(以下はSQL統計の出力例で、必要な項目をマージして表示しています)。詳細は、http://tylermuth.wordpress.com/2011/04/20/awr-formatter/ を参照してください。

f:id:yohei-a:20180331020515p:image

第32回 SQL統計と実行計画の出力について

Thanks to Tom Kyte, Graham Wood, Robert Freeman and Tom Roach for your contributions.

AWR Formatter « Tyler Muth’s Blog

ということで錚々たるメンバーが関わってますね。


インストール

% git clone https://github.com/anjuls/AWR-Format.git

使い方

  • Chrome で AWRレポート(HTML)を開く。
  • メニューで [Format AWR] をクリックする。

環境

2018-01-08

Linux で clocksource を変更する方法

Red Hat Enterprise Linux 6、 7 での clocksource の変更手順。

他のバージョンについてなどは no title 参照。


確認方法

  • 現在の clocksource を確認する。
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
xen
  • 選択可能な clocksource を確認する。
$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
xen tsc

変更方法

  • 動的に変更する(再起動すると元に戻る)
# echo "tsc" > /sys/devices/system/clocksource/clocksource0/current_clocksource
  • 永続的に変更する(groub.conf で "clocksource=tsc" のように指定する)
title Red Hat Enterprise Linux Server (2.6.32-71.18.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-71.18.2.el6.x86_64 ro root=LABEL=/ crashkernel=auto clocksource=tsc
        initrd /initramfs-2.6.32-71.18.2.el6.x86_64.img

参考

2018-01-03

Amazon Linux で MySQL 5.6.10 をデバッグモードでビルドする手順

Amazon Linux に MySQL 5.6.10 をデバッグモードでビルドした手順をメモ。


ダウンロード


インストール

sudo yum -y install cmake bison gcc perl-Data-Dumper
  • グループとユーザーを追加する
sudo groupadd mysql
sudo useradd -g mysql -s /usr/sbin/nologin mysql
tar xfz mysql-5.6.10.tar.gz
cd mysql-5.6.10
cmake -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_DEBUG=1
make
sudo make install

初期設定

  • mysqlデータベースを作成する
cd /usr/local/mysql
sudo ./scripts/mysql_install_db --user=mysql
  • サービス起動スクリプトを設定する
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
cd /etc/init.d/
sudo chown root:root ./mysql
sudo chmod a+x ./mysql
  • サービスを起動する
sudo service mysql start
  • root のパスワードを設定する
/usr/local/mysql/bin/mysqladmin password <Passowrd> -u root

データベース・ユーザー作成

  • データベースにログインする
/usr/local/mysql/bin/mysql -u root -p
  • データベースを作成する
create database mydb;
  • ユーザーを作成する
create user yoheia identified by 'Passowrd123';

環境

$ cat /etc/issue
Amazon Linux AMI release 2017.03
Kernel \r on an \m
$ uname -r
4.9.38-16.35.amzn1.x86_64

補足

  • ソースコードのディレクトリ構成
$ sudo yum -y install tree
$ tree -d -L 1
.
├── BUILD
├── client
├── cmake
├── CMakeFiles
├── cmd-line-utils
├── dbug
├── Docs
├── extra
├── include
├── libevent
├── libmysql
├── libmysqld
├── libservices
├── man
├── mysql-test
├── mysys
├── mysys_ssl
├── packaging
├── plugin
├── regex
├── scripts
├── source_downloads
├── sql
├── sql-bench
├── sql-common
├── storage
├── strings
├── support-files
├── tests
├── unittest
├── vio
├── win
└── zlib

33 directories

関連


参考

2017-12-23

RDS Oracle で Statspack を使う

RDS Oracle で Statspack を使えるようにする手順をメモ。


オプショングループを作成する

  • AWSマネジメントコンソールで RDS を選択する。
  • [オプショングループ]-[グループの作成]を選択し、任意の名前と説明を入力し、エンジンは oracle-eeを選択して、メジャーバージョンを選択する。

f:id:yohei-a:20171223141211p:image

  • 作成したオプショングループを選択して[オプションの追加]を選択する。

f:id:yohei-a:20171223141425p:image

  • STATSPACK を選択して[オプションの追加]を選択する。

f:id:yohei-a:20171223141431p:image


DBインスタンスを作成する

f:id:yohei-a:20171223142624p:image:w360


Statspack で定期的にスナップショットを取得するよう設定する

  • perfstat ユーザーのパスワードを設定してログインできるようにする。
$ sqlplus awsuser/******@orcl1210.*******.ap-northeast-1.rds.amazonaws.com:1521/ORCL
SQL> ALTER USER perfstat IDENTIFIED BY <new_password> ACCOUNT UNLOCK;
  • perfstat ユーザーでログインする
$ sqlplus perfstat/******@orcl1210.*******.ap-northeast-1.rds.amazonaws.com:1521/ORCL
  • 1時間間隔で Statspack のスナップショットを取得するよう設定する。
SQL> variable jn number;
SQL> execute dbms_job.submit(:jn, 'statspack.snap;',sysdate,'trunc(SYSDATE+1/24,''HH24'')');
SQL> commit; 

Statspack レポートを出力する

  • スナップショットを確認する。
SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SQL> select snap_id, snap_time from stats$snapshot order by 1;

   SNAP_ID SNAP_TIME
---------- -------------------
	 1 2017-12-21 09:47:04
	 2 2017-12-21 09:52:15
	 3 2017-12-23 01:13:53
	 4 2017-12-23 01:18:55
	 5 2017-12-23 01:26:35
	 6 2017-12-23 01:31:39
	 7 2017-12-23 04:07:37
	 8 2017-12-23 04:13:04
	 9 2017-12-23 05:35:21

9 rows selected.
  • レポートを出力する
SQL> exec RDSADMIN.RDS_RUN_SPREPORT(8,9);

f:id:yohei-a:20171223144812p:image

f:id:yohei-a:20171223144805p:image