Hatena::ブログ(Diary)

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

2018-03-19

Python スクリプトを cProfile でプロファイリングする

cProfile とは

cProfile と profile は 決定論プロファイリング (deterministic profiling) を行います。 プロファイル (profile) とは、プログラム各部分がどれだけ頻繁に呼ばれたか、そして実行にどれだけ時間がかかったかという統計情報です。 pstats モジュールを使ってこの統計情報をフォーマットし表示することができます。

Python 標準ライブラリは同じインターフェイスを提供するプロファイラの実装を3つ提供しています。

no title

使い方

$ python -m cProfile -s cumulative foo.py
引数意味
callscall count
cumulativecumulative time
cumtimecumulative time
filefile name
filenamefile name
modulefile name
ncallscall count
pcallsprimitive call count
lineline number
namefunction name
nflname/file/line
stdnamestandard name
timeinternal time
tottimeinternal time

参考

2018-02-17

Python の Web フレームワーク Flaskを使ってみる

Python の Web フレームワーク Flask を使ってみる


$ pip install Flask
mkdir flask
cd flask
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    name = "Hello World"
    return name

@app.route('/good')
def good():
    name = "Good"
    return name

if __name__ == "__main__":
    app.run(debug=True)
  • 起動する
python hello.py

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


参考

2018-01-08

Linux で clocksource が xen と tsc で gettimeofday(2) の性能を比較する

Linux で clocksource が xen と tsc で gettimeofday(2) の性能を比較したメモ。


テストプログラムをコンパイルする

  • 1億回 gettimeofday(2) を実行するテストプログラム(gettimeofday.c)
#include <stdio.h>
#include <sys/time.h>
int main(void)
{
	struct timeval tv;
        int count;
        for (count = 1; count <= 10000000; count++) {
                gettimeofday(&tv, NULL);
        }
	return 1;
}
  • コンパイルする
$ gcc -o gettimeofday gettimeofday.c

性能比較する

xen の場合
  • clocksource を確認する。
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
xen ★
$ time ./gettimeofday

real	0m8.815s
user	0m2.196s
sys	0m6.616s ★カーネルモードにコンテキストスイッチするため sys が高い
TSC の場合
  • clocksource を TSC に変更する。
$ sudo su -
Last login: Sun Jan  7 23:49:22 UTC 2018 on pts/0
# echo "tsc" > /sys/devices/system/clocksource/clocksource0/current_clocksource
# exit
logout
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc ★クロックソースが tsc の場合
$ time ./gettimeofday

real	0m0.180s ★ 約50倍速い
user	0m0.176s
sys	0m0.000s ★ vDSO でユーザーモードで実行されるため

参考


関連

2017-12-21

Oracle Database の I/O 負荷テストツール SLOB(The Silly Little Oracle Benchmark) の紹介

JPOUG Advent Calendar 2017 の21日目のエントリーです。昨日は JPOUG in 15 minutes at db tech showcase Tokyo 2017 開催報告 でした。

JPOUG Advent Calendar に参加するのも6年目になりました。

今年は「SLOB(The Silly Little Oracle Benchmark) 」というOracle Database 向けの I/O 負荷テストツールを使って、AWS で RDS Oracle にI/O負荷をかける手順を紹介します。

I/Oベンチマークツールには iomater、fio のような汎用的なベンチマークツールから Oracle ORION のような Oracle Database の I/O パターンをシミュレートするものなどがありますが、SLOB は Oracle Database に実際に SQL を発行してストレージの I/O 性能(I/Oレイテンシ、IOPS、I/Oスループット)を計測したいときに有益なツールです。


SLOB とは

SLOB(The Silly Little Oracle Benchmark) は Kevin Closson が開発した Oracle Database 向けのI/O負荷テストツールです。Cで書かれた小さなプログラムで、sqlplus で Oracle Database に SQL を発行してI/O負荷をかけるコマンドラインツールです。

Oracle ORIONDBMS_RESOURCE_MANAGER.CALIBRATE_IO の中間でかつ Swingbench のようなトランザクション発行機能を備えたリアルな Oracle Database のI/O負荷テストツールです。詳しくは Introducing SLOB – The Simple Database I/O Testing Toolkit for Oracle Database を参照してください。

人気・実績のあるツールで、以下のベンダーが SLOB によるベンチマーク結果を公開しています。

  • flashgrid.io
  • VMware
  • A joint paper co-branded by Intel and Quanta Cloud Technologies
  • VCE
  • Nutanix
  • Netapp
  • HPE
  • Pure Storage
  • Nimble
  • IBM
  • Red Hat
  • Dell EMC
  • Red Stack Tech.
SLOB Use Cases By Industry Vendors. Learn SLOB, Speak The Experts’ Language. | Kevin Closson's Blog: Platforms, Databases and Storage

作者の Kevin Closson について

Kevin Closson は元 Oracle の Exadata のパフォーマンス・アーキテクトで、EMC で XtremIO のチーフパフォーマンスアーキテクトを経て、現在は AWS のソリューションアーキテクトです。 その前は、HP、IBM、Sequent、Veritas などで商用UNIXにおける Oracle Database の性能向上に関わっていた人で、SMP/NUMAのロックやデータベースのキャッシングの特許の発明者というディープなバックグラウンドを持った人です。詳しくはコチラ


構成

  • EC2(Amazon Linux AMI release 2017.03)
  • RDS Oracle (Oracle EE 12.1.0.2.v10)
    • STATSPACK を含めたオプショングループを使わないと SLOB の実行でエラーになります。

インストール・設定手順

EC2 に Oracle Instant Client をインストールする
$ rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64
$ rpm -ivh oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
EC2 に gcc をインストールする
$ sudo yum -y install gcc
EC2 に SLOBをインストールする
$ tar xfz 2017.06.14.slob_2.4.2.tar.gz
$ cd SLOB/wait_kit
$ make
rm -fr *.o mywait trigger create_sem
cc     -c -o mywait.o mywait.c
cc -o mywait mywait.o
cc     -c -o trigger.o trigger.c
cc -o trigger trigger.o
cc     -c -o create_sem.o create_sem.c
cc -o create_sem create_sem.o
cp mywait trigger create_sem ../
rm -fr *.o
SLOBの設定をする
  • tnsnames.ora を設定する。
$ mkdir slob_test
$ cd slob_test
$ vim tnsnames.ora
slob =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = orcl1210.******.ap-northeast-1.rds.amazonaws.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )
  • ベンチマークをかける RDS Oracle へ接続する。
$ export TNS_ADMIN=`pwd`
$ echo $TNS_ADMIN
/home/ec2-user/slob_test
$ sqlplus awsuser@slob
  • SLOB用の表領域を作成する
SQL> @./misc/ts
  • バッファキャッシュのサイズを確認する
    • バッファキャッシュより大きいデータサイズにしてI/Oを発生させるため、バッファキャッシュのサイズ / 80MB(SLOB のデフォルトのテーブルのサイズ)を計算して、あとで setup.sh や runit.sh を実行する際に使用する。
    • slob.conf で SCALE を 80M から 300M に変更した。
SQL> show sga
Total System Global Area 1.2482E+10 bytes
Fixed Size		    2938208 bytes
Variable Size		 6308235936 bytes
Database Buffers	 6140461056 bytes
Redo Buffers		   30613504 bytes

SQL> select round(6140461056/(80*1024*1024)) from dual;

ROUND(6140461056/(300*1024*1024))
--------------------------------
			      20
  • slob.conf を設定する
SCALE=300M
(中略)
SQLNET_SERVICE_BASE=slob
SQLNET_SERVICE_MAX=slob
(中略)
DBA_PRIV_USER="awsuser"
SYSDBA_PASSWD="********"
$ cp -pi setup.sh setup.sh.org
$ vi setup.sh
$ diff setup.sh.org setup.sh
179c179,180
< for exe in sqlplus tnsping
---
> #for exe in sqlplus tnsping
> for exe in sqlplus
273,279c274,280
< if ( ! tnsping $svc >> $LOG 2>&1 )
< then
< 	f_msg FATAL ""
< 	f_msg FATAL "${FUNCNAME}: tnsping failed to validate SQL*Net service ( $svc )"
< 	f_msg FATAL "Examine $LOG"
< 	return 1
< fi
---
> #if ( ! tnsping $svc >> $LOG 2>&1 )
> #then
> #	f_msg FATAL ""
> #	f_msg FATAL "${FUNCNAME}: tnsping failed to validate SQL*Net service ( $svc )"
> #	f_msg FATAL "Examine $LOG"
> #	return 1
> #fi
  • ベンチマーク用のテーブルを作成する。
$ sh ./setup.sh IOPS 20
  • 作成されたテーブルを確認する。
$ cat cr_tab_and_load.out

SLOBでI/O負荷をかける

  • 負荷をかける。
$ sh ./runit.sh 20
  • Statspack レポートを出力する。
SQL> select snap_id, snap_time from stats$snapshot order by 1;
SQL> exec RDSADMIN.RDS_RUN_SPREPORT(5,6);
  • AWSマネジメントコンソールからダウンロードして確認する。

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

STATSPACK report for

Database    DB Id    Instance     Inst Num  Startup Time   Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
          1487923022 ORCL                1 21-Dec-17 05:22 12.1.0.2.0  NO

Host Name             Platform                CPUs Cores Sockets   Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     ip-10-7-1-139    Linux x86 64-bit           4     2       1         15.7

Snapshot       Snap Id     Snap Time      Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Begin Snap:          5 23-Dec-17 01:26:35      122       1.0
  End Snap:          6 23-Dec-17 01:31:39       42       1.1
   Elapsed:       5.07 (mins) Av Act Sess:      79.9


補足

  • Oracle Instant Client には tnsping は含まれない。

apparently oracle removed tnsping from the instant client 11.2.0.2.

adding tnsping to the instant client 11.2 | pfierens

参考情報など

参考
過去の JPOUG Advent Calendar 記事
過去の JPOUG Advent Calendar

明日は@mogmetさんです。

2017-12-10

MySQL Connector/J(JDBC Driver) で接続時に任意の collation_connection をセットする

MySQL Connector/J(JDBC Driver) で接続時に任意の collation_connection をセットする には以下の用に JDBC URL に「connectionCollation=utf8mb4_bin」のように設定すれば良い。

jdbc:mysql://aurora01.cluster-*******.ap-northeast-1.rds.amazonaws.com:3306/mydb?connectionCollation=utf8mb4_bin

参考

MySQL クライアントプログラム mysql、mysqladmin、mysqlcheck、mysqlimport、および mysqlshow は、次のように、使用するデフォルトの文字セットを特定します。

  • ほかの情報が欠如している場合、プログラムは、コンパイル時のデフォルトの文字セット (通常は latin1) を使用します。
  • プログラムは、オペレーティングシステム設定 (たとえば、Unix システムでは LANG や LC_ALL ローカル環境変数の値、Windows システムではコードページ設定) に基づいて、使用する文字セットを自動検出できます。ロケールが OS から利用できるシステムの場合、クライアントはコンパイル時のデフォルトを使用するのではなく、このロケールを使用してデフォルトの文字セットを設定します。たとえば、LANG を ru_RU.KOI8-R に設定すると、koi8r 文字セットが使用されます。したがってユーザーは、MySQL クライアントが使用できるように、自身の環境内でロケールを構成できます。OS 文字セットは、正確に一致するものがない場合は、もっとも近い MySQL 文字セットにマップされます。一致した文字セットをサポートしていない場合、クライアントはコンパイルイ時のデフォルトを使用します。たとえば、ucs2 は接続文字セットとしてはサポートされていません。

C アプリケーションは、サーバーに接続する前に次のように mysql_options() を呼び出すことによって、OS 設定に基づいて文字セットの自動検出を使用できます。

mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
  • プログラムは --default-character-set オプションをサポートしており、ユーザーはこのオプションを使用すると文字セットを明示的に指定でき、クライアントがそれ以外のどのデフォルトを指定していても、それをオーバーライドできます。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.4 接続文字セットおよび照合順序

Use characterEncoding=utf8mb4& for jdbc url

jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8mb4
java - utf8mb4 in MySQL Workbench and JDBC - Stack Overflow

connectionCollation

If set, tells the server to use this collation via 'set collation_connection'

Since version: 3.0.13

MySQL :: MySQL Connector/J 5.1 Developer Guide :: 5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J