Oracle jdbc thin Connection reset の対処

久しぶりに JDBCRunner をやったらこれにハマってたのでメモ。
症状的には、1回目は通るのに2回目を掛けようとすると流れなくて、数分後にエラー。こうなると何回やっても同じで30分くらい放置するとなぜかまた1回だけ通るようになる…みたいな不思議な動き。
jdbc thin Connection reset」でGoogle先生に聞いたら一発HITでした。適当に作ったLinuxVMホストでかけたので、最初はNW周りを疑いまくったのだけど違った。
 http://d.hatena.ne.jp/tmftake/20130130/1359553276


●回避版の今の起動方法メモ

export CLASSPATH="jdbcrunner-1.2.jar:ojdbc6.jar:orai18n.jar"
java -Djava.security.egd=file:/dev/./urandom JR test.txt

●エラーになってたときのログ

19:37:31 [ERROR] An exception occurred at agent 0
jdbcrunner.ApplicationException: An exception occurred while connecting to database
        at jdbcrunner.Agent.callInit(Agent.java:227)
        at jdbcrunner.Agent.run(Agent.java:86)
        at java.lang.Thread.run(Thread.java:679)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (IO Error: Connection reset)
        at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at jdbcrunner.Manager.getConnection(Manager.java:224)
        at jdbcrunner.Agent.callInit(Agent.java:222)
        ... 2 more
Caused by: java.sql.SQLRecoverableException: IO Error: Connection reset
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
        at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
        at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
        ... 6 more
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
        at oracle.net.ns.DataPacket.send(DataPacket.java:210)
        at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
        at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:385)
        ... 14 more

Linux + SGA 大きく + 接続セッション沢山 -> Hugepage

メモ
http://www.reqtc.com/column/linux-hugepage4.html
http://www.reqtc.com/column/linux-hugepage5.html
http://joe.blog.freemansoft.com/2010/10/memory-tuning-how-os-page-sizes-can.html

メモリ沢山積んだ(っても、64Gくらいじゃもうそんなに多いといえないか?)マシンでOracle動かして、
調子に乗ってSGA 30G環境で、1000セッションつないだらスワップ起きますよというお話。

「1GBの共有メモリに対して、2MBのPTEが消費」とあるので
 →1024/2 = 512/M
30Gだと、、、最悪、、、
 →30720/512 = 60M/1ses * 1000 ses = 60G (ノω・、) ウゥ・・・

HugePageの設定をおとなしく入れましょうorz
LinuxだとPTEで予想以上にメモリ使われるんですねえ…。

最近はあまり見かけない?ですが、共有メモリアーキテクチャ全般に言えることですので、
PostgreSQL辺りでも言えることかもしれません。

※9/2追記(ちょっとした検証結果

■メモリ 2G
■SGA設定 1G
■コネクション数 100(外部ホストからjdbc-thin接続)
■Huge設定時の 5分後付近の vmstat
vm.nr_hugepages = 524

HugePages_Total:   524
HugePages_Free:     19
HugePages_Rsvd:      8
Hugepagesize:     2048 kB
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
27  2     84  11424   2004 478108    0    0    24 31344 3702 20264 73 16  5  5  0
64  1     84  10540   1988 478496    0    0     4 21936 4095 20599 66 15 12  7  0
51  1     84  10168   1988 478468    0    0     0 14504 3970 22267 75 15  7  4  0
 9  2     84  12696   1960 477628    0    0     0 22188 3626 20708 74 16  5  4  0

■Hugeなしの  5分後付近の vmstat
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
70  0 166704  12708   1080 1363400    0    0     0 13064 3294 20129 75 15  6  3  0
33  1 166700  11552   1080 1364644    0    0     0 17064 3198 19718 75 16  6  4  0
 1  2 166696  11568   1088 1364044    0    0    16 25660 3470 19088 74 16  4  5  0
 7  1 166696  11356   1080 1363584    0    0    20 27688 3502 16701 59 15 14 11  0

MyNA(日本MySQLユーザ会)会 2013年7月メモ

前回に続いて参加できたのでメモ。

一言で感想をまとめるとこんな感じ。
「MySQL5.6をps_helperを使いこなしつつ、performance_schemaを使ってMySQLの内部動作を把握していきつつ平塚さんの資料を生かしてパラメータ検討すればbug踏まない限りうまく動くんじゃね?それでも性能困ったら、スケールアウトできるMySQL Clusterトライだ!」
以下は微妙な個人的備忘録メモ。

■Sheeri さん
資料
http://technocation.org/files/doc/2013_07_PS.pdf
http://www.markleith.co.uk/ps_helper/
・パフォーマンスカウンタのOFF/ONはSQLで動的に設定できるぽい
・events_statements_summary_by_digest でSQL絞ってイベント分析だけど 5.6 以上

思ったこと
・events_statements_summary_by_digestはロック時間、Diskソート使用状況とか、SQLで色々フィルタ書けるのがうれしい
 →個人的にはMySQLSSDを意識したようなパラメータも存在しているので、その辺のパラメータチューニング時に使うとよいイメージ
 →後、explain・debugと合わせると効果的な感じ
・IOに関するカウンタがたくさん登場してきているということは、MySQLではIOまわりについてそれだけ重要視している、もしくはチューニングの余地がまだあるという感じなのか?
SQLというかオプティマイザ結果による動作を知るためのものが多かったオプティマイザの癖を知るうえで有用か?
・本番で入れるにはパフォーマンス劣化度合いがやっぱり気になるところだけど5%くらいで収まるなら入れておきたいところ


■とみたさん
資料
http://slide.rabbit-shocker.org/authors/tommy/mysql-protocol/

思ったこと
・認証パケットやり取りは興味深い(パスワードハッシュSAH1ベースなんだ…
・カーソル情報についてどのメモリに持たれるんだろうってのとパケットのやり取りはどうなるか?
 →メモリはこれかな?http://dev.mysql.com/doc/refman/5.6/en/cursor-restrictions.html


■平塚さん
資料というかUpdateがかかったまとめ
http://d.hatena.ne.jp/sh2/20130806

思ったこと
・補足資料のパラメータ資料が素敵
 →http://dbstudy.info/files/20130729/
 →kazeburoさんのと比較すると更にいい感じにできそう https://github.com/kazeburo/mysetup/blob/master/mysql/my56.cnf
・sync_binlog は基本1派なのであまり気にしてないけど、0設定レプリケーション前提で組んでるところが性能影響的にちょっと大変かな?
・個人的にO_DIRECT した場合に実際に O_DIRECT でオープンされるファイルを改めて調査してみたい


■yoku0825さん
資料
http://www.slideshare.net/yoku0825/5-24757328
MariaDB側でクエリキャッシュをいじってるネタが出てきているので、何か動きが出てくるかも?

思ったこと
・ソースいじり具合が面白かった


■やまさきさん
資料
http://www.slideshare.net/yoyamasaki/5mysql-cluster

思ったこと
・とりあえずテスト環境作る分にはだいぶ楽になったかな?
・NoSQL-APIが充実してるので、そちらでSQLも発行できるDBインフラネタ的な方向で検証はありかもしれない。(でも時間が…orz

logmnr で hextoraw 先が DATE型列の時の変換方法適当版

ちょっと諸事情でディクショナリ情報を取れない状況で LOGMNR して追っていくときに、DATE型へ入れているところを変換したかったのでやっつけで探したという話。
オブジェクトID は、とりあえず dba_objects を取れば分かるので、後は SQL_REDO列を見ていくわけですが…。
他に簡単なやり方があったら是非知りたい!!

結論としては HEXTORAW('7871061d062701') な感じで見えたので、後はデータフォーマット仕様にあわせて逆変換しましょうということです。
データフォーマット仕様は SHIFT-THE-ORACLE さんが良い感じ。

で、結果こうなる。
■DATE型簡易変換

CREATE OR REPLACE Procedure HEXTODATE(P_HEX IN VARCHAR2)
AS
	vHexYearY NUMBER;
	vHexYearR NUMBER;
	vHexMonth NUMBER;
	vHexDay   NUMBER;
	vHexHour  NUMBER;
	vHexMin   NUMBER;
	vHexSec   NUMBER;
BEGIN
	vHexYearY := to_number(SUBSTR(P_HEX,1,2),'XXX') - 100 ;
	vHexYearR := to_number(SUBSTR(P_HEX,3,2),'XXX') - 100 ;
	vHexMonth := to_number(SUBSTR(P_HEX,5,2),'XX');
	vHexDay   := to_number(SUBSTR(P_HEX,7,2),'XX');
	vHexHour  := to_number(SUBSTR(P_HEX,9,2),'XX') - 1 ;
	vHexMin   := to_number(SUBSTR(P_HEX,11,2),'XX') - 1 ;
	vHexSec   := to_number(SUBSTR(P_HEX,13,2),'XX') - 1 ;
	DBMS_OUTPUT.PUT_LINE('result = ' || vHexYearY||vHexYearR||'/'||vHexMonth||'/'||vHexDay||' '||vHexHour||':'||vHexMin||':'||vHexSec);
END;
/

set serveroutput on
exec hextodate('7871061d062701');
result = 2013/6/29 5:38:0

■varchar/numberは面倒だけどこんな感じで

select UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('78')) from dual;
select UTL_RAW.CAST_TO_NUMBER(HEXTORAW('78')) from dual;

しかし、timestampってどーすんだろ…。

※参考
http://www.shift-the-oracle.com/element/data-type/data-type-inside.html

デバッグ版MySQL cmake ビルド更新版(Cent6系&MySQL5.6.12)

メモ書きです。久々に MySQL をビルドしてみました。前にビルドしたのはもはや1年前。
どんだけMySQL使ってないんだ(´Д⊂

●前提

 CentOS release 6.4 (Final)
 (Linux 2.6.32-358.2.1.el6.x86_64 #1 SMP Wed Mar 13 00:26:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux


●ソース入手

 持ってきたもの
  mysql-5.6.12.tar.gz


●不足パッケージ投入

yum install cmake
yum install ncurses-devel
yum install bison
yum install gcc-c++


●一応マニュアルにしたがってユーザ作成

groupadd mysql
useradd -r -g mysql mysql


●ビルド

CMAKE_C_COMPILER=gcc CMAKE_CXX_COMPILER=g++ CC=gcc CXX=g++ cmake -DWITH_PIC=1 -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=/zfs/MySQL/mysql-5.6.12 .
make -j8
make install

※-DWITH_DEBUG=1は、過去の記事を流用したので。
※-DWITH_PIC=1は、共有ライブラリ使用向けに備えてつけてみただけです。効果未確認。
※DCMAKE_INSTALL_PREFIXをいちいち指定したのは個人的なやり方ってだけです。普通は指定しないんじゃないかなぁ。。


●起動

cd インストール先
rm -rf data/*
scripts/mysql_install_db
chown -R mysql:mysql data
./bin/mysqld_safe --debug

※my.cnfまだ作ってません。

デバッグ版にしてしまったので、/tmp/mysqld.traceにトレースがやっぱり出てました。

GitLab でインストール時に localhost を使って適当に作っていると git push 時にハマるというメモ

個人的なgit勉強&会社でも使おうかなということで、環境構築勉強もかねて gitlab を作り始めていますが適当に作ったせいでハマったのでメモ。
インストール時、名前はちゃんと考えておきましょう。。というオチではありますが、具体的には

gitlab-shell/config.yml の gitlab_url: "http://~/" は git remote に登録するときと同じ名前になるように設定

ということでした。

インストールはとりあえずGitLabのオフィシャルを参照するのが一番いいかと。で、ユーザ作ってリポジトリ作ってまではよかったんですがpushすると

git push -u origin master
fatal: The remote end hung up unexpectedly

で、エラー。色々似た事例があるんですが、最終的にたどり着いたのはここでした。
https://groups.google.com/forum/?fromgroups=#!topic/gitlabhq/dqiHDBrXOjQ
書いてあるとおり gitlab-shell/config.yml の gitlab_url 直して service gitlab restart でリスタート。
その後無事 push できるようになりました。ふー、ようやくスタートライン。

ま、原因はインストール時の名前付けるところで localhost 連発したせいということでちゃんと叩かれるときに使う名前にしましょうということですね。IPアドレスでもとりあえず通るので、内部向けであればそれでもいいかなと思いますが。
gitlab にログがあんまり出ないので、たどり着くのが大変でした。ログレベル上げれば出るようになるのかな?

munin 2.0.12 環境構築メモ(munin-master側)

自作の munin plugin 使って OracleDatabase のリソースグラフ化する時のメモ。ここでは Munin-Master 環境。
といっても、基本 Node と変わらずで入れる Perl Module の違いくらいです。


Perl
Nodeと一緒です。5.16.3 使いました。

./Configure -des -Dprefix=/home/oracle/local/munin
make -j 4
make test
make install

Perl-Module
cpanm で入れます。
Mail::Sendmail のテストが固まりますが入力待ちなのでリターン2回くらい入れればそのうちタイムアウトで通って入ります。
IO::Socket::INET6 は ipv6 環境作ってないとテストがエラーになるので、強制インストール。テストスキップでも良いと思います。

export PATH=/home/oracle/local/munin/bin:$PATH
curl -LOk http://xrl.us/cpanm
chmod 755 cpanm
mv cpanm /home/oracle/local/munin/bin/
sudo yum install openssl-devel
sudo yum install db4-devel
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Alien::RRDtool
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Storable
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::MD5
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN HTML::Template
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Params::Validate
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Date::Parse
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SSLeay
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN File::Copy::Recursive
cpanm -f --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IO::Socket::INET6
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Log4perl
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IPC::Shareable
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch::FileRotate
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN MIME::Lite
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sender
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sendmail

■Munin-Master
Node と一緒。PATH 関係はここで全部設定します。perl 部分を絶対 PATH にしたり。内容は作る人のお好みで。

vi Makefile.config

install で丸ごと入れます。後 Node と一緒で、oracle でもう全部動かすことにするので、chown で がっつり oracle にオーナ・パーミッションを変えます。この辺の考え方は好み次第。

make
su
--
make install
cp -pr contrib /home/oracle/local/munin/
ls -l /home/oracle/local/munin/
chown -R oracle:oinstall /home/oracle/local/munin/*
ls -l /home/oracle/local/munin/
exit
--

Makefile.config の設定の仕方が多分マズイために起きているんだと思いますが、一部のソースの perl PATH が変わってくれないので手で直します。

cd /home/oracle/local/munin/sbin
vi munin-node
vi munin-node-configure
vi munin-run
vi munin-sched
===
#!/home/oracle/local/munin/bin/perl
===

cd /home/oracle/local/munin/contrib
vi dump_storable
vi import_db
vi dump_db
vi epoch2localtime
===
#!/home/oracle/local/munin/bin/perl
===

UpdateWorker にパッチあてときます。(前の記事の件です http://nsrzakki.hateblo.jp/entry/2013/04/24/015415

cd /home/oracle/local/munin/lib/perl5/site_perl/5.16.3/Munin/Node/
cp -p UpdateWorker.pm /tmp/UpdateWorker.pm
patch < /home/oracle/local/src/Munin/UpdateWorker.pm.patch


■Munin-Master設定
監視ホストを登録します。
asyncd を使うので、ssh アクセスになります。鍵作って監視先ホストに設定して、sshするようにします。サンプル。

※鍵作る
ssh-keygen -t rsa -b 2048

※監視先ノードで authorized_keys に鍵登録
command="/home/oracle/local/munin/lib/munin-async --spoolfetch",no-pty,from="192.168.xxx.xxx" ssh-rsa xxxxxxxxxx== oracle@hogemaster

※munin.conf に設定
[hogenode]
    address ssh://oracle@hogenode
    use_node_name yes


■実行

※一番最初は手動実行して動作チェック
/home/oracle/local/munin/bin/munin-cron

※上手くいきそうならcron設定
*/5 * * * * /home/oracle/local/munin/bin/munin-cron >/dev/null 2>&1