ablog

不器用で落着きのない技術者のメモ

id:wmo6hash 先生に教えて頂いたことをメモ

サーバプロセスを strace したら gettimeofday() ばかり呼んでいたことについて

update文を実行してるはずのサーバープロセスをstrace したら、time だの gettimeofdate ばかり呼んでた。何してるんだろ?spin してるのかな?

posted at 23:38:42

とつぶやいたら、id:wmo6hash 先生がいろいろ教えてくれました!

@yoheia straceで gettimeofday() ばっかり呼ぶプロセスに見えると言えば $ORACLE_HOME/bin/oracle を実行しているプロセスでしょうか ?

posted at 23:50:24

そうだと思います。 RT @wmo6hash: @yoheia straceで gettimeofday() ばっかり呼ぶプロセスに見えると言えば $ORACLE_HOME/bin/oracle を実行しているプロセスでしょうか ?

posted at 23:56:15

@yoheia だとすると gettimeofday()が繰り返されているのは spin or loopの基準にはなりませんね。常に区切りのつく度に時間は取ってくる感じですので。

posted at 00:04:29

@yoheia spinが straceの出力結果で判る場合は、傾向としてあるタイミングからまったく同じ順番で特定のsystem call呼び出しが繰り返しになっている場合の一部です。ただし一部です。system call呼ばない間の処理が違えば spinじゃないですし。

posted at 00:14:59

@wmo6hash あ、なるほど。もしかして、バッファキャッシュの変更にはシステムコールは使わないですか?

posted at 00:20:31

@yoheia データベース・バッファキャッシュの各ブロックバッファとかイメージの変更で想像できる操作の殆どでは各プロセスがsystem callを使うことはないと思います

posted at 00:27:16

@yoheia どう考えてもあんまりこの処理で時間かかるのおかしいじゃないかと思えたときでも、いきなりgdbでうんうん考えて取るよりpstack連続で数回のほうがオススメですね。pstackもgdbも使えないOSだとまた違いますが。

posted at 00:33:39

TCP接続とIPC接続のどちらが速いかについて

単一ホスト内でSQL実行する場合、リスナー経由じゃなくて、ローカル接続のほうが速いと思うけど、どれくらい差があるんだろ。

posted at 23:43:40

これについても、id:wmo6hash 先生に教えて頂きました。

@yoheia あと、リスナー経由とローカルのどっちが速いかについて、大概で言うところのコンテキストスイッチのコストはリスナー経由しても接続の最初だけなんで、百接続いっぺんに行うとかでもなければそのコストだけ突出はあまりしないと思います。

posted at 01:02:47

@yoheia むしろローカル(BEQ)で百接続とかいっぺんに行うと、コンテキストスイッチのコストがあらわになるので、コストの正確で厳密な比較はプロトコル依存だけでも実装が異なるので難しいですが、総時間ではリスナー経由(TCPかIPC)が速くなる条件もあるかと思います

posted at 01:09:37

@yoheia ローカル(BEQプロトコルと呼ばれるもの)でも結局はサーバープロセスをforkしているとか、同じような仕組みの似たようなプログラム作ろうとかしたりするとすっきりすると思います。

posted at 01:19:03

@yoheia Net ServicesのIPCとBEQとTCPの接続プロトコルの違いでのコストとか速度とかの違いは、別途専用のプログラムを自分で作って計測します。そうしないと違いが何にあるか分析の元ができないので(^^;

posted at 01:25:49