Hatena::ブログ(Diary)

ablog

2012-02-08

OPatch の -bugs_fixed オプション

OPatch の -bugs_fixed オプションってパッチの説明が表示されてわかりやすいですね。

以下は 11.1 のマニュアルからの抜粋です。

-bugs_fixedオプションの例

次の例では、opatch lsinventory -bugs_fixed ascの出力を示します。

Oracle interim Patch Installer version 11.1.0.6.6
Copyright (c) 2009, Oracle Corporation.  All rights reserved..
Oracle Home       : /home/oracle_TEST/product/11.1.0/db_1
Central Inventory : /home/OUIHome_Opatch
   from           : /home/oracle_TEST/product/11.1.0/db_1/oraInst.loc
OPatch version    : 11.1.0.6.6
OUI version       : 11.1.0.6.6
OUI location      : /home/oracle_TEST/product/11.1.0/db_1/oui
Log file location : /home/oracle_
TEST/product/11.1.0/db1/cfgtoollogs/opatch/opatch-2008_May_25_11-09-34-IST_Wed.log
Patch history file: /scratch/userid/newDB/cfgtoollogs/opatch/opatch_history.txt
Lsinventory Output file location : /home/oracle_TEST/product/11.1.0/db_
1/cfgtoollogs/opatch/lsinv/lsinventory-2008_May_25_11-09-34-IST_Wed.txt
 --------------------------------------------------------------------------------
Installed Top-level Products (2):

Oracle Database 11g                                                  11.1.0.6.6
Oracle Database 11g Release 2 Patch Set 2                            11.1.0.6.6
There are 2 products installed in this Oracle Home.


List of Bugs fixed by Installed Patches:

Bug        Fixed by          Installed at                   Description
           Patch
---        --------          ------------                   -----------

1000000    6079591   Mon Oct 13 02:03:42 PDT 2008   test bug
6079591    6079591   Mon Oct 13 02:03:42 PDT 2008   MLR BUG FOR 10.2.0:.3 FOR CPU:JUL2:007
300500     300500    Fri Sep 05 02:25:34 PDT 2008   Demo bug for patching files
300501     300500    Fri Sep 05 02:25:34 PDT 2008   Demo bug for patching files
300502     300500    Fri Sep 05 02:25:34 PDT 2008   Demo bug for patching files
6121268    6121268   Tue Aug 19 23:32:33 PDT 2008   DB-10.2.0.3-MOLECULE-007-CPUJUL2007
6121266    6121266   Tue Aug 19 23:32:27 PDT 2008   DB-10.2.0.3-MOLECULE-018-CPUJUL2007
6121264    6121264   Tue Aug 19 23:32:22 PDT 2008   DB-10.2.0.3-MOLECULE-017-CPUJUL2007
6121263    6121263   Tue Aug 19 23:32:14 PDT 2008   DB-10.2.0.3-MOLECULE-016-CPUJUL2007
.....
.....
(Middle section of report is intentionally excluded.)
.....
.....
6121248    6650096   Tue Feb 12 05:50:48 PST 2008   DB-10.2.0.3-MOLECULE-015-CPUJUL2007
6650096    6650096   Tue Feb 12 05:50:48 PST 2008   DB-10.2.0.3-MOLECULE-036-CPUJAN2008
6121247    6650095   Tue Feb 12 05:50:41 PST 2008   DB-10.2.0.3-MOLECULE-006-CPUAPR2007
6397946    6650095   Tue Feb 12 05:50:41 PST 2008   DB-10.2.0.3-MOLECULE-031-CPUOCT2007
6650095    6650095   Tue Feb 12 05:50:41 PST 2008   DB-10.2.0.3-MOLECULE-035-CPUJAN2008
6650081    6650081   Tue Feb 12 05:50:35 PST 2008   DB-10.2.0.3-MOLECULE-034-CPUJAN2008
6646853    6646853   Tue Feb 12 05:50:28 PST 2008   MLR BUG FOR 10.2.0.3 FOR CPUJAN2008
6452863    6452863   Tue Feb 12 05:50:12 PST 2008   TRACKING BUG FOR CPUJUL2007
 --------------------------------------------------------------------------------
OPatchを使用したOracleソフトウェアへのパッチの適用

2012-02-05

200万ページビューを超えました

気が付いたら、200万ページビューを超えていました。

ブログを始めたのは2008年10月から、ちょうど Oracle Database 関連の仕事にシフトしたときからです。

それまでもはてなダイアリーの他に、livedoor BlogBloggerブログを作ってみたり、wiki を作ったりしていましたが、三日坊主でした。そういえば昔 wiki を書いていたのを忘れてました。

az @Wiki - トップページ

まだ残ってました。

追記系のブログより更新系の wiki のほうが好きなんですが、ブログは思いついたことをさくっと書けるのと、コメントやスターをもらったり、はてなブックマークがついたり、購読者が増えたりするとうれしかったりしてモチベーションが上がるところがいいと思います。初めてコメントをもらったのはブログを書き始めてから1年後くらいだった気がしますが、とても嬉しかったのを覚えています。

このブログは人に見せるためというより自分の備忘録としてチラシの裏の落書き的なノリで書いていますが、ここ最近の2回の転職では武器として使いましたし、最近はお会いした方にブログ知ってますと言われてちょっと嬉しかったりすることもあります。

今後もコツコツと自由に思ったことを書いていこうと思います。


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

  • 購読者数の推移

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

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


追記:

ブログを書くメリットを書いてみる。

  • 転職してもノウハウがなくならない。*1
  • データセンターとかにいる時も、「あれどうだったっけ?」とか思ったら携帯とかスマートフォンですぐ見れる。
  • 曲がりなりにも公開されているので、見られている意識があるので、記憶に残る。間違っていることに気づいたらすぐ直さなきゃという意識が働く、これも記憶に残りやすい。
  • 頭の中にある考えを書いてみると、何がわかっていて何がわかっていないかに気付く。とりあえず、書くことで頭の中が最低限整理される。

CPUバウンドとI/Oバウンド

P.41

一般的に負荷は大きく二つに分類されます。

たとえば、大規模な科学計算を行うプログラムがあったとして、そのプログラムはディスクとの入出力(Input/Output、I/O)は行わないが、処理が完了するまでに相当の時間を要するとします。「計算をする」ということからも想像がつくとおり、このプログラムの処理速度はCPUの計算速度に依存しています。これがCPUに負荷をかけるプログラムです。「CPUバウンドプログラム」とも呼ばれます。

一方、ディスクに保存された大量のデータから任意のドキュメントを探し出す検索プログラムがあったとします。この検索プログラムの処理速度はCPUではなく、ディスクの読みだし速度、つまり入出力に依存するでしょう。ディスクが速ければ速いほど、検索にかかる時間は短くなります。I/Oに負荷をかける種類のプログラムということで、「I/Oバウンドプログラム」と呼ばれます。

一般に、APサーバDBから取得したデータを加工してクライアントに渡す処理を行います。その過程で大規模なI/Oを発生させることは稀です。よて多くの場合、APサーバCPUバウンドサーバであるといえます。

一方、Webアプリケーションを構成するもう一つの要素システムであるDBサーバは、データをディスクから検索するのが主な仕事で、とくにデータが大規模になればなるほど、CPUでの計算時間よりもI/Oに対するインパクトが大きくなるI/Oバウンドサーバです。同じサーバでも、負荷の種類が違えばその特性は大きく変わってきます。

多くのソフトウェアアプリケーションのパフォーマンスは、本質的にディスクI/Oによって制限されます。CPUタイムの大部分をI/Oアクティビティが完了するまでの待機に使用するアプリケーションI/Oバウンドと呼ばれます。

Oracleは、適切に作成されたアプリケーションのパフォーマンスが、I/Oで制限されないように設計されています。I/Oシステムが最大限またはそれに近い状態で動作しており、許容時間内にI/Oリクエストに対応できない場合は、I/Oチューニングを行うと、アプリケーションのパフォーマンスを向上できます。ただし、アプリケーションI/Oバウンドではない場合(たとえば、CPUが制限要因である場合)、I/Oチューニングしてもパフォーマンスを改善できません。

I/O構成および設計

In computer science, I/O bound refers to a condition in which the time it takes to complete a computation is determined principally by the period spent waiting for input/output operations to be completed. This is the opposite of a task being CPU bound. This circumstance arises when the rate at which data is requested is slower than the rate it is consumed or, in other words, more time is spent requesting data than processing it.


boundの意味 - 英和辞典 Weblio辞書

bound は「縛られた、束縛された」という意味の形容詞なんですね。

Java、C/C++、Go の性能差

調べものをしようとパラパラッと見ていたら、面白いことが書かれていたのでメモ。

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

P.23

オンラインゲーム特有の理由による言語の性能差

表0.1 で、JavaスループットC/C++に比べて10倍も低くなっている理由はオンラインゲームに特有のことです。一般的にJIT(Just In Time)コンパイラを備えている仮想マシン(Virtual Machine、VM)では、Javaの実行速度はJITコンパイルの効果で速くなり、場合によってはC言語よりも速い場合があります。

ただし、その効果は処理内容がCPUセントリックなものだけで、OSとの入出力を頻繁に行うアプリケーションでは成り立ちません。

(中略)

これはJava VMシステムコールを呼び出す前後で、バッファオーバーフローのチェックや例外オブジェクトの処理などを毎回やるためです。これらは省けない処理なので、VMを使う処理系では限界があります。オンラインゲームサーバネットワークに対する入出力が毎秒数万回以上発生する状態になるので、JavaC言語の速度差が生じる典型的なケースなのです。ApacheMySQLなどのサーバソフトウェアC/C++で書かれているのも同様の理由があると考えられます。

(中略)

ちなみに、GoogleのGo言語は静的言語でネイティブ実行ですが、ガベージコレクションがありプログラマが型付けの強さをコードの部分ごとに選択できるという新しい提案なので、サーバ性能を犠牲にせずに開発効率を上げられる可能性があり、筆者は期待しています。Goolgeはサーバ開発のことをほんとによくわかっているなぁと感嘆することしきりです。


Go についてぐぐってみたら、Google鵜飼さんのコメントを発見した。

Go 言語は UNIXPlan9 をはじめ多くのシステムプログラムを作ってきた優れた開発者たちが作った言語ですから、彼らにとっていいプログラムを書きやすい言語になっているはずなので、いいプログラムを書きやすくなっていると思います。ネットワークサーバーなんかに向いていますね。最適化ガーベジコレクションの実装などは改善の余地があるので、高性能が厳しく要求されるところに使うのはまだ早いかもしれません。

インタビュー:Go言語について - Google Japan Developer Relations Blog

本家のサイトに行ってみると、「get the most out of multicore and networked machines」と書かれていますね。興味深い。

Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction.

The Go Programming Language

え、「今頃気付いた?」って。だいたい世の中の流行から3年遅れで興味を持ち出すんです、私w

レスポンスとスループット

P.221

性能の測定基準はいろいろある。巡航速度が最も速い旅客機を選ぶなら、コンコルドとなる。航続距離が最も長いのはDC-8となる。搭乗人員数が最も多いものを選ぶならば、ボーイング747ということになる。

2台の別々のデスクトップコンピュータ上で同じプログラムを実行する場合は、先にジョブを終えたデスクトップコンピュータの方が速いと言うだろう。しかし、大勢のユーザーからジョブが投入されるタイムシェアリング方式の大型コンピュータを稼働させているコンピュータ・センターでは、すべてのジョブを先に終わらせたコンピュータのほうが速いと言うだろう。個人のコンピュータ・ユーザーは応答時間(response time)の短さに感心がある。応答時間とは、作業を開始してから終了するまでの時間であり、実行時間(execution time)とも言う。コンピュータ・センターの管理者はスループット(throughput)を増やすことに関心がある。このスループットとは、一定時間内に終了した作業の総量である。

P.234

これらのサーバーベンチマークでは一般にスループットが重視される。ただしデータベースの照会やWebページの要求などといった%3ピュータ・センターの管理者はスループット(throughput)を増やすことに関心がある。このスループットとは、一定時間内に終了した作業の総量である。

P.234

これらのサーバーベンチマークでは一般にスループットが重視される。ただしデータベースの照会やWebページの要求などといった個々のイベントの応答時間に対して、何がしかの要求が課される場合もある。


基礎から学ぶOracle SQLチューニング (DB Magazine SELECTION)

基礎から学ぶOracle SQLチューニング (DB Magazine SELECTION)

P.134

システムのパフォーマンスは、ほとんどの場合スループットとレスポンスで計ります。スループットとは、単位時間あたりの処理量を意味し、レスポンスとは1処理あたりの所要時間を意味します。スループットを増やした場合にもレスポンスが劣化しないで処理しきれる場合、スケーラブルであると言います。

スループット(英: Throughput)は、一般に単位時間当たりの処理能力のこと。

応答時間(おうとうじかん)またはレスポンスタイム(英: Response time)は、工学やテクノロジーにおいて、システムや実行ユニットが入力を与えられてから反応するまでにかかる時間を指す。


追記(2012/02/06):

待ち行列理論とスループットとレスポンスタイム。

  • 並列処理ができれば、スループット(処理量)は増える。
  • 並列処理により、単一の処理が速くなるのではなく、スループットが増える。
  • 行列で待っている時間を「アクセス待ち時間」と呼ぶ。
  • レスポンスタイム(応答時間)=「アクセス待ち時間」+「サービスタイム」
  • 例えば、アクセス待ち時間が5分で、窓口でのサービスタイムが5分だとすると、投入されてから戻ってくるまでの時間であるレスポンスタイムは10分、スループットは2/5分=0.4人/分

*1:もちろん、一般的な技術ネタなど公開可能なことしか書きません

2012-02-03

シンプルなインターフェース

*NIX のプロセスファイルシステムOracle Database の動的パフォーマンス・ビューも共通のインタフェース(テキストとして扱える、SQLアクセスできる)を提供しているという点では似ていると思った。実体はメモリ上のデータ構造だと思うけど、共通のインタフェースで扱えるようにすることで、シンプルで汎用的になっていると思う。


ふと思っただけ。

2012-02-01

iowait について

iowait の時間って、I/O要求を出しているプロセスは Disk Sleep しているという理解でいいんだろうか。

ちょっとわからなくなってきた。


/*
 * Account for idle time.
 * @cputime: the cpu time spent in idle wait
 */
void account_idle_time(cputime_t cputime)
{
        struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
        cputime64_t cputime64 = cputime_to_cputime64(cputime);
        struct rq *rq = this_rq();

        if (atomic_read(&rq->nr_iowait) > 0)
                cpustat->iowait = cputime64_add(cpustat->iowait, cputime64);
        else
                cpustat->idle = cputime64_add(cpustat->idle, cputime64);
}

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20751&forum=10

このへんに書いてますが、断片的なのでまとめます。

I/O wait はidleの一種です。

CPUがidleであった時間のうち、I/Oが進行中であった時間は I/O wait として

 記録されます。idle として記録されているのはそれ以外の残りの時間です。

・「I/Oが進行中であった時間」とは、I/O待ちで休止しているプロセス

 ひとつでも存在していた時間のことです。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29121&forum=10

iowaitは、 CPUアイドル状態で、システムに未処理のディスク入出力要求があった時間の割合を意味しますが、iowaitの状態であれば、CPUを必要とするプロセスが他にある場合には、そのプロセスCPUを使用することが可能です。

つまり、iowaitが98%であってもCPUの負荷が高い状態ではありません。

一般的に、usとsyの列の値を足した値をCPU使用率と見ます。

そのため、iowaitが98%であることだけでは業務への影響が大きいとは言えません。

Infosia, Inc. » Blog Archive » 備忘録: vmstat の iowait について

iowaitは、 CPUアイドル状態で、システムに未処理のディスク入出力要求があった時間の割合を意味しますが、iowaitの状態であれば、CPUを必要とするプロセスが他にある場合には、そのプロセスCPUを使用することが可能です。

つまり、iowaitが98%であってもCPUの負荷が高い状態ではありません。

一般的に、usとsyの列の値を足した値をCPU使用率と見ます。

備忘録

他のプロセスCPUを使えるのはわかるけど、プロセスCPU上でスピンしてるのか Disk Sleep しているのか、両方ありえるのか。スピンしてたらユーザーモードでカウントされそうだな。Disk Sleep してそうな気がする。

よく考えると、システムコール発行したらコンテキストスイッチが発生してスリープするから、TASK_UNINTERRUPTIBLE で Disk Sleep してるか。CPU が空いてるのに、I/O要求が残っている場合に iowait としてカウントされるんだな。たぶん。

vmstat の出力結果を整形する Perl ワンライナー

2011-10-14 04:05:01
         procs           memory                   page                              faults       cpu
    r     b     w      avm    free   re   at    pi   po    fr   de    sr     in     sy    cs  us sy id
    2     0     0   535206  3325748    0    0     0    0     0    0     0   2043   5411   125   0  5 95
    4     0     0   535206  3324971    0    0     0    0     0    0     0   3810   2980   234   0  6 94
2011-10-14 04:06:01
         procs           memory                   page                              faults       cpu
    r     b     w      avm    free   re   at    pi   po    fr   de    sr     in     sy    cs  us sy id
    2     0     0   535206  3324971    0    0     0    0     0    0     0   2043   8413   224   0  5 95
    4     0     0   597237  3325993    0    0     0    0     0    0     0   3354   2695   373   1  5 94
2011-10-14 04:07:01
         procs           memory                   page                              faults       cpu
    r     b     w      avm    free   re   at    pi   po    fr   de    sr     in     sy    cs  us sy id
    2     0     0   535206  3324971    0    0     0    0     0    0     0   2043   2423   133   0  5 95
    4     0     0   597237  3325993    0    0     0    0     0    0     0   9983   5675   124   1  6 93

こういう vmstat の出力結果を、

$ perl -nle '$.==3 and print qq/       date $_/;/^([\d\-]+ [\d:]+)/ and $.>1 and print qq/$d $l/;/^([\d\-]+ [\d:]+)/ and $d=$1;$l=$_' vmstat.log
       date     r     b     w      avm    free   re   at    pi   po    fr   de    sr     in     sy    cs  us sy id
2011-10-14 04:05:01     4     0     0   535206  3324971    0    0     0    0     0    0     0   3810   2980   234   0  6 94
2011-10-14 04:06:01     4     0     0   597237  3325993    0    0     0    0     0    0     0   3354   2695   373   1  5 94

こんな具合に整形する Perl ワンライナー。自分用メモです。

2012-01-31

Perl で変数を使ってファイルハンドル名を動的に生成する

こんな感じでできたのでメモ。


ソースコード

  • filehandle.pl
#!/usr/bin/env perl

use strict;
use warnings;

my @array = (1,2,3,4,5,6,7,8,9,10);

foreach my $item (@array) {
	no strict "refs";
	my $fh = "OUT${item}";
	open (${$fh}, ">", "${item}.txt");
	print({${$fh}} "$item\n");
	close(${$fh});
}

__END__

実行結果

$./filehandle.pl
$ ls
1.txt  10.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt  filehandle.pl
$ cat *.txt
1
10
2
3
4
5
6
7
8
9

Perl の grep sort map とか

レシピ9.5 ディレクトリ内のすべてのファイルを処理する

P.444

grep、map、sort をつなげてフィルタ処理する書き方が便利そうだなと思ったので試してみた。

$ perl -e '@array=(1,2,3,4,5,6,7,8,9,10); map{printf(qq/%02d\n/,$_)} sort{$b<=>$a} grep{$_<5} @array'
04
03
02
01

こんな具合に。それだけです。

String found where operator expected at ... (Missing operator before ...?)

String found where operator expected at ./status_log_spliter.pl line 109, near "} "$line\n""
        (Missing operator before  "$line\n"?)

ある Perl スクリプトを実行すると、実行はできるけど「String found where operator expected」と怒られるので、

print(${$fh} "$line\n");

print({${$fh}} "$line\n");

に変更してみたら出なくなった。